Django 教程第 2 部分:创建网站框架
我们 Django 教程 中的第二篇文章将介绍如何创建一个“框架”网站项目作为基础,然后可以用特定于站点的设置、路径、模型、视图和模板填充它。
先决条件 | 设置 Django 开发环境。回顾 Django 教程。 |
---|---|
目标 | 能够使用 Django 的工具开始您自己的新网站项目。 |
概述
本文介绍如何创建一个“框架”网站,然后可以用特定于站点的设置、路径、模型、视图和模板填充它(我们将在后面的文章中讨论这些)。
开始
- 使用
django-admin
工具生成一个项目文件夹、基本文件模板和 manage.py,它用作您的项目管理脚本。 - 使用 manage.py 创建一个或多个应用程序。
注意:一个网站可能包含一个或多个部分。例如,主站点、博客、维基、下载区域等。Django 鼓励您将这些组件开发为独立的应用程序,然后可以根据需要在不同的项目中重复使用。
- 注册新的应用程序以将其包含在项目中。
- 为每个应用程序连接 url/path 映射器。
对于 本地图书馆网站,网站和项目文件夹名为 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 服务器。
创建目录应用程序
接下来,运行以下命令创建将位于 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 映射、模板和静态文件。我们将在后面向您展示如何创建它们(这些并不需要在每个网站中,但在此示例中需要)。
注册目录应用程序
现在已经创建了应用程序,我们必须将其注册到项目中,以便它在运行任何工具(例如,将模型添加到数据库中)时被包含在内。通过将应用程序添加到项目设置中的 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
]
新行指定了应用程序配置对象 (CatalogConfig
),该对象是在您创建应用程序时在 /django-locallibrary-tutorial/catalog/apps.py 中为我们生成的。
注意:您会注意到,这里已经有很多其他 INSTALLED_APPS
(以及 MIDDLEWARE
,位于设置文件中的更下方)。这些启用了对 Django 管理站点 及其使用的功能(包括会话、身份验证等)的支持。
指定数据库
这也是通常指定用于项目的数据库的地方。最好尽可能使用相同的数据库进行开发和生产,以避免出现细微的行为差异。您可以在 Databases(Django 文档)中了解有关不同选项的信息。
在大多数情况下,我们将使用默认的 SQLite 数据库,因为我们预计不会在演示数据库上需要大量的并发访问,而且它不需要任何额外的设置!您可以在 settings.py 中看到此数据库是如何配置的
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
在后面的 将 Django 部署到生产环境 中,我们还将向您展示如何配置 Postgres 数据库,这可能更适合大型站点。
其他项目设置
settings.py 文件还用于配置许多其他设置,但在此时,您可能只想更改 TIME_ZONE——这应该与标准 List of tz database time zones 中的字符串相等(表格中的 TZ 列包含您想要的 value)。将 TIME_ZONE
value 更改为适合您时区的这些字符串中的一个,例如
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
变量管理的,它是一个包含 path()
函数的 Python 列表。每个 path()
函数都将 URL 模式与一个特定视图关联起来,该视图将在匹配模式时显示,或者与另一个 URL 模式测试代码列表关联起来(在这种情况下,该模式将成为目标模块中定义的模式的“基本 URL”)。urlpatterns
列表最初定义了一个单一函数,该函数将所有具有模式 admin/ 的 URL 映射到模块 admin.site.urls
,该模块包含管理应用程序自己的 URL 映射定义。
注意:path()
中的路由是定义要匹配的 URL 模式的字符串。此字符串可能包含一个命名变量(在尖括号中),例如 'catalog/
。此模式将匹配类似 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
,该函数在匹配 path()
函数中指定的 URL 模式(在本例中为根 URL)时,将新的相对 URL(/catalog/
)作为其第一个参数。
在文件底部添加以下行
# 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)),
]
将路径函数的第一个参数留空以暗示 '/'. 如果将第一个参数写为 '/',则在启动开发服务器时,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/ 目录包含应用程序的视图、模型和其他部分的文件。打开这些文件并检查样板代码。
正如您之前所见,项目中的 urls.py 中已经添加了管理员网站的 URL 映射。在浏览器中导航到管理员区域,看看会发生什么(您可以从映射中推断出正确的 URL)。
总结
现在,您已经创建了一个完整的框架网站项目,您可以继续用 URL、模型、视图和模板填充它。
现在 本地图书馆网站 的框架已经完成并正在运行,是时候开始编写使这个网站执行预期功能的代码了。
另请参阅
- 编写您的第一个 Django 应用程序 - 第 1 部分(Django 文档)。
- 应用程序(Django 文档)。包含有关配置应用程序的信息。