Django 教程第二部分:创建一个骨架网站
这是我们 Django 教程的第二篇文章,它展示了如何创建一个“骨架”网站项目作为基础,然后你可以用特定于网站的设置、路径、模型、视图和模板来填充它。
预备知识 | 设置 Django 开发环境。回顾 Django 教程。 |
---|---|
目标 | 能够使用 Django 的工具来启动你自己的新网站项目。 |
概述
本文介绍了如何创建一个“骨架”网站,然后你可以用特定于网站的设置、路径、模型、视图和模板来填充它(我们将在后面的文章中讨论这些)。
开始
-
使用
django-admin
工具生成项目文件夹、基本文件模板和 manage.py,后者作为你的项目管理脚本。 -
使用 manage.py 创建一个或多个应用。
注意:一个网站可能包含一个或多个部分。例如,主站点、博客、维基、下载区等。Django 鼓励你将这些组件开发为单独的应用,如果需要,这些应用可以在不同的项目中重复使用。
-
注册新应用以将其包含在项目中。
-
连接每个应用的 url/path 映射器。
对于 Local Library 网站,网站和项目文件夹名为 locallibrary,并包含一个名为 catalog 的应用。因此,顶级文件夹结构将如下所示:
locallibrary/ # Website folder
manage.py # Script to run Django tools for this project (created using django-admin)
locallibrary/ # Website/project folder (created using django-admin)
catalog/ # Application folder (created using manage.py)
以下部分将详细讨论过程步骤,并展示如何测试你的更改。在本文末尾,我们将讨论在此阶段你可能需要进行的其他全站点配置。
创建项目
创建项目
-
打开命令 shell(或终端窗口),并确保你处于 虚拟环境中。
-
导航到你想要创建本地图书馆应用的文件夹(稍后我们会将其移动到你在设置开发环境时创建为本地 GitHub 仓库的“django_local_library”)。
-
使用
django-admin startproject
命令创建新项目,然后导航到项目文件夹中,如下所示:bashdjango-admin startproject locallibrary cd locallibrary
django-admin
工具创建的文件夹/文件结构如下:bashlocallibrary/ manage.py locallibrary/ __init__.py settings.py urls.py wsgi.py asgi.py
locallibrary 项目子文件夹是网站的入口点
- __init__.py 是一个空文件,它指示 Python 将此目录视为一个 Python 包。
- settings.py 包含所有网站设置,包括注册我们创建的任何应用、静态文件位置、数据库配置详细信息等。
- urls.py 定义站点 URL 到视图的映射。虽然它可以包含所有 URL 映射代码,但更常见的是将一些映射委托给特定应用,稍后你将看到。
- wsgi.py 用于帮助你的 Django 应用与 Web 服务器通信。你可以将其视为样板文件。
- asgi.py 是 Python 异步 Web 应用和服务器之间相互通信的标准。异步服务器网关接口(ASGI)是 Web 服务器网关接口(WSGI)的异步后继者。ASGI 为异步和同步 Python 应用提供了标准,而 WSGI 仅为同步应用提供了标准。ASGI 与 WSGI 向后兼容,并支持多个服务器和应用框架。
manage.py 脚本用于创建应用、处理数据库和启动开发 Web 服务器。
创建 catalog 应用
接下来,运行以下命令创建将存在于我们的 locallibrary 项目中的 catalog 应用。确保在项目 manage.py 所在的相同文件夹中运行此命令:
# Linux/macOS
python3 manage.py startapp catalog
# Windows
py manage.py startapp catalog
注意:本教程的其余部分使用 Linux/macOS 语法。如果你在 Windows 上工作,无论你看到以 python3
开头的命令,都应改为使用 py
(或 py -3
)。
该工具创建一个新文件夹,并用用于应用不同部分的文件填充它(如下例所示)。大多数文件以其目的命名(例如,视图应存储在 views.py 中,模型存储在 models.py 中,测试存储在 tests.py 中,管理站点配置存储在 admin.py 中,应用注册存储在 apps.py 中),并包含一些用于处理相关对象的最小样板代码。
更新后的项目目录现在应该看起来像这样:
locallibrary/
manage.py
locallibrary/
catalog/
admin.py
apps.py
models.py
tests.py
views.py
__init__.py
migrations/
此外,我们现在还有:
- 一个 migrations 文件夹,用于存储“迁移”——允许你在修改模型时自动更新数据库的文件。
- __init__.py — 在此处创建的空文件,以便 Django/Python 将该文件夹识别为 Python 包,并允许你在项目的其他部分使用其对象。
注意:你是否注意到上面文件列表中缺少什么?虽然有视图和模型的位置,但没有放置 URL 映射、模板和静态文件的地方。我们将向你展示如何进一步创建它们(这些并非每个网站都必需,但在此示例中需要)。
注册 catalog 应用
现在应用已创建,我们必须向项目注册它,以便在运行任何工具时(例如将模型添加到数据库)将其包含在内。通过将其添加到项目设置中的 INSTALLED_APPS
列表来注册应用。
打开项目设置文件 django-locallibrary-tutorial/locallibrary/settings.py,找到 INSTALLED_APPS
列表的定义。然后在列表末尾添加新行,如下所示:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Add our new application
'catalog.apps.CatalogConfig', # This object was created for us in /catalog/apps.py
]
新行指定了你在创建应用时在 /django-locallibrary-tutorial/catalog/apps.py 中为你生成的应用配置对象 (CatalogConfig
)。
注意:你会注意到已经有很多其他的 INSTALLED_APPS
(以及 MIDDLEWARE
,在设置文件中更靠下)。这些启用了对 Django 管理站点及其所用功能(包括会话、身份验证等)的支持。
指定数据库
这也是你通常会指定项目使用的数据库的地方。在可能的情况下,开发和生产使用相同的数据库是有意义的,以避免行为上的微小差异。你可以在 数据库(Django 文档)中了解不同的选项。
在本示例的大部分内容中,我们将使用默认的 SQLite 数据库,因为我们预计在演示数据库上不需要大量的并发访问,并且它无需额外工作即可设置!你可以在 settings.py 中查看此数据库的配置方式:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
稍后在将 Django 部署到生产环境中,我们还将向你展示如何配置 Postgres 数据库,这可能更适合大型站点。
其他项目设置
settings.py 文件还用于配置许多其他设置,但目前,你可能只想更改 TIME_ZONE ——这应该等于标准 tz 数据库时区列表中的字符串(表中 TZ 列包含你想要的值)。将你的 TIME_ZONE
值更改为适合你时区的一个字符串,例如:
TIME_ZONE = 'Europe/London'
还有两个你现在不会更改,但应该了解的设置:
SECRET_KEY
。这是一个秘密密钥,用作 Django 网站安全策略的一部分。如果你在开发过程中不保护此代码,那么在将其投入生产时,你需要使用不同的代码(可能从环境变量或文件中读取)。DEBUG
。这会启用在错误时显示调试日志,而不是 HTTP 状态码响应。在生产环境中应将其设置为False
,因为调试信息对攻击者很有用,但现在我们可以将其设置为True
。
连接 URL 映射器
该网站在项目文件夹中创建了一个 URL 映射文件(urls.py)。虽然你可以使用此文件管理所有 URL 映射,但更常见的是将映射延迟到关联的应用。
打开 django-locallibrary-tutorial/locallibrary/urls.py 并注意解释如何使用 URL 映射器的一些说明文本。
"""
URL configuration for locallibrary project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.django.ac.cn/en/5.0/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLConf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
URL 映射通过 urlpatterns
变量管理,该变量是一个 Python path()
函数的列表。每个 path()
函数要么将 URL 模式关联到特定视图(当模式匹配时将显示该视图),要么关联到另一个 URL 模式测试代码列表(在第二种情况下,该模式成为目标模块中定义的模式的“基本 URL”)。urlpatterns
列表最初定义了一个单个函数,它将所有具有 admin/ 模式的 URL 映射到 admin.site.urls
模块,该模块包含管理应用自己的 URL 映射定义。
注意:path()
中的路由是一个定义要匹配的 URL 模式的字符串。此字符串可能包含一个命名变量(在尖括号中),例如 'catalog/<id>/'
。此模式将匹配类似 catalog/any_chars/ 的 URL,并将 any_chars
作为字符串传递给视图,参数名为 id
。我们将在后面的主题中进一步讨论路径方法和路由模式。
要将新列表项添加到 urlpatterns
列表中,请将以下行添加到文件底部。此新项包含一个 path()
,它将具有模式 catalog/
的请求转发到 catalog.urls
模块(带有相对 URL catalog/urls.py 的文件)。
# Use include() to add paths from the catalog application
from django.urls import include
urlpatterns += [
path('catalog/', include('catalog.urls')),
]
注意:请注意,我们包含导入行(from django.urls import include
)及其使用代码(这样很容易看出我们添加了什么),但通常将所有导入行包含在 Python 文件的顶部。
现在,让我们将站点的根 URL(即 127.0.0.1:8000
)重定向到 URL 127.0.0.1:8000/catalog/
。这是我们在此项目中将使用的唯一应用。为此,我们将使用一个特殊的视图函数 RedirectView
,它将要重定向到的新相对 URL (/catalog/
) 作为其第一个参数,当 path()
函数中指定的 URL 模式(在这种情况下是根 URL)匹配时。
将以下行添加到文件底部:
# Add URL maps to redirect the base URL to our application
from django.views.generic import RedirectView
urlpatterns += [
path('', RedirectView.as_view(url='catalog/', permanent=True)),
]
将 path 函数的第一个参数留空表示 '/'。如果你将第一个参数写为 '/',当你启动开发服务器时,Django 会给出以下警告:
System check identified some issues:
WARNINGS:
?: (urls.W002) Your URL pattern '/' has a route beginning with a '/'.
Remove this slash as it is unnecessary.
If this pattern is targeted in an include(), ensure the include() pattern has a trailing '/'.
Django 默认不提供 CSS、JavaScript 和图像等静态文件,但对于开发 Web 服务器来说,在你创建站点时这样做可能很有用。作为此 URL 映射器的最后添加,你可以通过追加以下行来在开发期间启用静态文件服务。
现在将以下最后一块代码添加到文件底部:
# Use static() to add URL mapping to serve static files during development (only)
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
注意:有多种方法可以扩展 urlpatterns
列表(之前,我们只是使用 +=
运算符附加了一个新的列表项,以清晰地分离旧代码和新代码)。我们本可以将此新模式映射包含在原始列表定义中:
urlpatterns = [
path('admin/', admin.site.urls),
path('catalog/', include('catalog.urls')),
path('', RedirectView.as_view(url='catalog/')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
最后一步,在 catalog 文件夹中创建一个名为 urls.py 的文件,并添加以下文本来定义(空的)导入的 urlpatterns
。我们将在构建应用时在此处添加我们的模式。
from django.urls import path
from . import views
urlpatterns = [
]
测试网站框架
至此,我们有了一个完整的骨架项目。网站实际上还没有做任何事情,但运行它以确保我们的更改没有破坏任何东西是值得的。
在此之前,我们应该首先运行一次数据库迁移。这将更新我们的数据库(以包含我们已安装应用中的任何模型)并消除一些构建警告。
运行数据库迁移
Django 使用对象关系映射器(ORM)将 Django 代码中的模型定义映射到底层数据库使用的数据结构。当我们更改模型定义时,Django 会跟踪这些更改,并可以创建数据库迁移脚本(在 /django-locallibrary-tutorial/catalog/migrations/ 中)以自动迁移数据库中的底层数据结构以匹配模型。
当我们创建网站时,Django 自动添加了许多模型供网站管理部分使用(我们稍后将查看)。运行以下命令以在数据库中为这些模型定义表(确保你位于包含 manage.py 的目录中):
python3 manage.py makemigrations
python3 manage.py migrate
警告:每当你的模型发生变化,并且这些变化会影响需要存储的数据结构时(包括添加和删除整个模型以及单个字段),你都需要运行这些命令。
makemigrations
命令为项目中安装的所有应用创建(但不应用)迁移。你也可以指定应用名称,只为单个应用运行迁移。这让你有机会在应用这些迁移之前检查其代码。如果你是 Django 专家,你可能会选择稍微调整它们!
migrate
命令是将迁移应用到数据库的命令。Django 会跟踪哪些迁移已添加到当前数据库。
注意:每当你进行重大更改时,都应重新运行迁移并重新测试站点。这不会花费很长时间!
有关较少使用的迁移命令的更多信息,请参阅 迁移(Django 文档)。
运行网站
在开发过程中,你可以首先使用开发 Web 服务器来提供网站,然后通过本地 Web 浏览器查看它。
注意:开发 Web 服务器不够健壮或性能不足以用于生产环境,但它是在开发过程中快速启动和运行 Django 网站以方便快速测试的非常简单的方法。默认情况下,它将站点服务于你的本地计算机(http://127.0.0.1:8000/
),但你也可以指定网络上的其他计算机进行服务。有关更多信息,请参阅 django-admin 和 manage.py: runserver(Django 文档)。
通过调用 runserver
命令(在与 manage.py 相同的目录中)运行开发 Web 服务器:
python3 manage.py runserver
服务器运行后,你可以在本地 Web 浏览器中导航到 http://127.0.0.1:8000/
查看站点。你将看到一个站点错误页面,如下所示:
别担心!这个错误页面是预期的,因为我们在 catalog.urls
模块中没有定义任何页面/URL(当我们获取站点根目录的 URL 时,我们会重定向到该模块)。
此时,我们知道 Django 正在工作!
注意:示例页面演示了 Django 的一个强大功能——自动化调试日志记录。每当找不到页面时,Django 都会显示一个错误屏幕,其中包含有用的信息或代码引发的任何错误。在这种情况下,我们可以看到我们提供的 URL 与我们列出的任何 URL 模式都不匹配。日志记录在生产环境中(即我们将站点部署到 Web 上时)是关闭的,在这种情况下将提供一个信息较少但更用户友好的页面。
不要忘记备份到 GitHub
我们刚刚完成了一些重要的工作,所以现在是使用 GitHub 备份项目的好时机。
首先,将顶层 locallibrary 文件夹的内容移动到你在设置开发环境时创建的本地 GitHub 仓库 django_local_library 文件夹中。这将包括 manage.py、locallibrary 子文件夹、catalog 子文件夹以及顶层文件夹中的任何其他内容。
然后,添加并提交 django_local_library 文件夹中的更改,并将其推送到 GitHub。从该文件夹的根目录,你可以使用与《开发环境》主题的修改和同步更改部分中类似的命令集:
# Get the current source from GitHub on the main branch
git checkout main
git pull origin main
# Create a branch and add/commit your newly created app skeleton
git checkout -b skeleton_website # Create and activate a new branch "skeleton_website"
git add -A # Add all changed files to the staging area
git commit -m "Create Skeleton framework for LocalLibrary" # Commit the changed files
# Push the branch to GitHub
git push origin skeleton_website
然后从你的 GitHub 仓库创建并合并一个 PR。合并后,你可以切换回 main
分支并从 GitHub 拉取你的更改:
git checkout main
git pull origin main
注意:如果你不删除 skeleton_website
分支,你可以在稍后的任何时候切换回它。
将来我们不一定会再次提及这一点,但你可能会发现在本教程的每个部分结束时更新 GitHub 上的更改很有用。
挑战自我
catalog/ 目录包含视图、模型和应用其他部分的文件。打开这些文件并检查样板代码。
如前所述,Admin 站点的 URL 映射已添加到项目的 urls.py 中。在浏览器中导航到管理区域,看看会发生什么(你可以从映射推断出正确的 URL)。
总结
你现在已经创建了一个完整的骨架网站项目,你可以继续用 URL、模型、视图和模板填充它。
现在 Local Library 网站的骨架已完成并运行,是时候开始编写代码,让这个网站实现其应有的功能了。
另见
- 编写你的第一个 Django 应用 - 第 1 部分(Django 文档)
- 应用(Django 文档)。包含有关配置应用的信息。