最近利用《Python编程从入门到实践》这本书进行Django框架的学习,但由于原书中所使用的Django版本为1.11,而目前的版本(我使用的版本)为3.0.2,其中有不少的差别,因此决定先读读官方文档
通过django-admin startproject mysite
进行创建,可看到如下的文件结构:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
外部mysite/root
目录是项目的容器。它的名字对Django来说无关紧要;可以将它重命名为任何的名称。
manage.py
:一个命令行实用程序,允许您以各种方式与这个Django项目交互。
内部mysite/
目录是项目的实际Python包。它的名称是用于导入其中任何内容的Python包名称。
mysite/ __init__.py
:一个空文件,告诉Python这个目录应该被视为Python包。
mysite/settings.py
:此Django项目的设置/配置。Django设置将告诉您有关设置如何工作的所有信息。
mysiteurls.py
:这个Django项目的URL声明;Django支持的站点的“目录”。
mysite/asgi.py
:与asgi兼容的web服务器为您的项目提供服务的入口点。
mysite/wsgi.py
:与wsgi兼容的web服务器为您的项目提供服务的入口点。
通过python manage.py startapp polls
进行创建,可看到如下的文件结构:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
你需要在其中创建urls.py,文件结构如下:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
先来看看在app路径下的urls.py:
rom django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
path()函数传递了4个参数,两个是必需的:route和view,两个是可选的:kwargs和name。
route是一个包含URL模式的字符串。当处理一个请求时,Django从urlpatterns中的第一个模式开始,然后沿着列表向下,将请求的URL与每个模式进行比较,直到找到一个匹配的模式。
模式不搜索GET和POST参数,也不搜索域名。例如,在对https://www.example.com/myapp/的请求中,URLconf将查找myapp/。在对https://www.example.com/myapp/?page=3的请求中,URLconf还将查找myapp/。
当Django找到匹配的模式时,它调用指定的view函数,其中HttpRequest对象作为第一个参数,路由中的任何“捕获”值作为关键字参数。
可以在字典中将任意关键字参数传递给目标视图。
命名URL可以让您从Django中的其他地方明确地引用它,特别是在模板内。这个强大的特性允许您在只接触单个文件的情况下对项目的URL模式进行全局更改。
而对于project中的urls.py:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
include()函数允许引用其他URLconf。每当Django遇到include()时,它会切掉与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以进行进一步处理。
在包含其他URL模式时,应该始终使用include()。admin.site.url是唯一的例外.
settings.py中的代码如下:
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
可以看到默认情况下,配置使用SQLite。
然而,在开始第一个真正的项目时,您可能希望使用一个更具伸缩性的数据库,如PostgreSQL,以避免数据库切换带来的麻烦。
如果要使用其他数据库,需要安装相应的数据库绑定,并更改数据库“default
”项中的以下键以匹配数据库连接设置:
ENGINE
–可以是“django.db.backends.sqlite3
”、“django.db.backends.postgresql
”、“django.db.backends.mysql
”或“django.db.backends.oracle
”。其他后端也可以使用。
NAME
–数据库的名称。如果您使用的是SQLite,数据库将是您计算机上的一个文件;在这种情况下,NAME
应该是该文件的完整绝对路径,包括文件名。默认值os.path.join(BASE_DIR,'db.sqlite3')
将文件存储在项目目录中。
如果不使用SQLite作为数据库,则必须添加其他设置,如用户、密码和主机。
这里保存在此Django实例中激活的所有Django应用程序的名称。应用程序可以在多个项目中使用,可以打包和分发它们,以供其他人在其项目中使用。
默认情况下,INSTALLED_APPS包含以下应用,所有这些应用都随Django提供:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#myapps
]
django.contrib.admin
——管理站点。你很快就会用的。
django.contrib.auth
——身份验证系统。
content types
——内容类型的框架。
django.contrib.sessions
——会话框架。
django.contrib.messages
——一个消息框架。
django.contrib.static files
——管理静态文件的框架。
默认情况下,这些应用程序都包含在其中,以方便在常见情况下使用。
不过,其中一些应用程序至少使用了一个数据库表,因此在使用这些表之前,我们需要在数据库中创建这些表。为此,请运行以下命令:
python manage.py migrate
migrate
命令查看INSTALLED_APPS
设置,并根据mysite/settings.py文件中的数据库设置和应用程序附带的数据库迁移创建任何必要的数据库表。