Django 教程第 2 部分:创建网站框架

我们 Django 教程 中的第二篇文章将介绍如何创建一个“框架”网站项目作为基础,然后可以用特定于站点的设置、路径、模型、视图和模板填充它。

先决条件 设置 Django 开发环境。回顾 Django 教程
目标 能够使用 Django 的工具开始您自己的新网站项目。

概述

本文介绍如何创建一个“框架”网站,然后可以用特定于站点的设置、路径、模型、视图和模板填充它(我们将在后面的文章中讨论这些)。

开始

  1. 使用 django-admin 工具生成一个项目文件夹、基本文件模板和 manage.py,它用作您的项目管理脚本。
  2. 使用 manage.py 创建一个或多个应用程序

    注意:一个网站可能包含一个或多个部分。例如,主站点、博客、维基、下载区域等。Django 鼓励您将这些组件开发为独立的应用程序,然后可以根据需要在不同的项目中重复使用。

  3. 注册新的应用程序以将其包含在项目中。
  4. 为每个应用程序连接 url/path 映射器。

对于 本地图书馆网站,网站和项目文件夹名为 locallibrary,并且包含一个名为 catalog 的应用程序。因此,顶层文件夹结构将如下所示

bash
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)

以下部分将详细讨论处理步骤,并说明如何测试更改。在本文末尾,我们将讨论在此阶段可能进行的其他站点范围配置。

创建项目

创建项目

  1. 打开命令 shell(或终端窗口),并确保您位于 虚拟环境 中。
  2. 导航到您要创建本地库应用程序的文件夹(稍后我们将将其移动到您 在设置开发环境时作为本地 GitHub 存储库创建的“django_local_library”)。
  3. 使用如下所示的 django-admin startproject 命令创建新项目,然后导航到项目文件夹
    bash
    django-admin startproject locallibrary
    cd locallibrary
    
    django-admin 工具创建如下文件夹/文件结构
    bash
    locallibrary/
        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 相同的文件夹中运行此命令

bash
# 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 中),并且包含一些用于处理相关对象的最小样板代码。

更新后的项目目录现在应该如下所示

bash
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 列表的定义。然后在列表末尾添加一个新行,如下所示

bash
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 中看到此数据库是如何配置的

python
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 更改为适合您时区的这些字符串中的一个,例如

python
TIME_ZONE = 'Europe/London'

还有两个您现在不会更改,但应该知道的设置

  • SECRET_KEY。这是一个秘密密钥,用作 Django 网站安全策略的一部分。如果您在开发过程中没有保护此代码,则需要在将其投入生产时使用不同的代码(可能从环境变量或文件中读取)。
  • DEBUG。这使调试日志在错误时显示在屏幕上,而不是 HTTP 状态码响应。这应该在生产环境中设置为 False,因为调试信息对攻击者很有用,但现在我们可以将其设置为 True

连接 URL 映射器

网站创建时会在项目文件夹中包含一个 URL 映射器文件 (urls.py)。虽然您可以使用此文件来管理所有 URL 映射,但更常见的是将映射委派给关联的应用程序。

打开 django-locallibrary-tutorial/locallibrary/urls.py,并注意解释了使用 URL 映射器的一些方法的说明性文本。

python
"""
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 的文件)。

python
# 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/)作为其第一个参数。

在文件底部添加以下行

python
# 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 会给出以下警告

python
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 映射的最终补充,您可以通过添加以下行来启用在开发过程中提供静态文件。

现在将以下最终块添加到文件的底部

python
# 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 列表(之前,我们只是使用 += 运算符追加了一个新列表项,以清楚地分隔旧代码和新代码)。我们也可以将这个新的模式映射包含在原始列表定义中。

python
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。在这里,我们将在构建应用程序时添加我们的模式。

python
from django.urls import path
from . import views

urlpatterns = [

]

测试网站框架

此时,我们有一个完整的框架项目。该网站实际上还没有任何功能,但运行它以确保我们没有任何更改会破坏任何东西是值得的。

在我们这样做之前,我们应该首先运行一个数据库迁移。这将更新我们的数据库(以包含我们已安装应用程序中的所有模型)并消除一些构建警告。

运行数据库迁移

Django 使用一个对象关系映射器 (ORM) 来将 Django 代码中的模型定义映射到底层数据库使用的数据库结构。当我们更改模型定义时,Django 会跟踪这些更改,并可以创建数据库迁移脚本(在 /django-locallibrary-tutorial/catalog/migrations/ 中)来自动将底层数据库中的数据结构迁移到与模型匹配。

当我们创建网站时,Django 自动添加了一些模型供网站的管理员部分使用(我们将在稍后查看)。运行以下命令以在数据库中为这些模型定义表(确保您位于包含 manage.py 的目录中)。

bash
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 服务器

bash
python3 manage.py runserver

服务器运行后,您可以在本地 Web 浏览器中导航到 http://127.0.0.1:8000/ 来查看网站。您应该会看到一个类似于这样的网站错误页面。

Django Debug page (Django 4.2)

别担心!这个错误页面是预期的,因为我们还没有在 catalog.urls 模块中定义任何页面/URL(当我们获取指向网站根目录的 URL 时,我们会被重定向到此模块)。

此时,我们知道 Django 正在工作!

注意:示例页面演示了 Django 的一个很棒的功能 - 自动调试日志记录。每当找不到页面时,Django 都会显示一个包含有用信息或代码引发的任何错误的错误屏幕。在这种情况下,我们可以看到我们提供的 URL 与我们的任何 URL 模式都不匹配(如列表所示)。日志记录在生产环境中已关闭(即我们将网站发布到 Web 上时),在这种情况下,将提供一个信息较少但对用户更友好的页面。

不要忘记备份到 GitHub

我们刚刚完成了一些重要的工作,所以现在是使用 GitHub 备份项目的好时机。

首先,将顶层 locallibrary 文件夹的内容移到您在设置开发环境时创建的本地 GitHub 存储库 django_local_library 文件夹中。这将包括 manage.pylocallibrary 子文件夹、catalog 子文件夹以及顶层文件夹中的任何其他内容。

然后在 django_local_library 文件夹中添加并提交更改,并将它们推送到 GitHub。从该文件夹的根目录,您可以使用与开发环境主题的修改和同步更改部分中类似的命令集。

bash
# 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 拉取您的更改。

bash
git checkout main
git pull origin main

注意:如果您没有删除 skeleton_website 分支,您随时可以稍后切换回该分支。

我们可能不会在未来再次提及这一点,但您可能会发现,在本教程中,在每个部分结束时使用 GitHub 更新您的更改会很有用。

挑战自己

catalog/ 目录包含应用程序的视图、模型和其他部分的文件。打开这些文件并检查样板代码。

正如您之前所见,项目中的 urls.py 中已经添加了管理员网站的 URL 映射。在浏览器中导航到管理员区域,看看会发生什么(您可以从映射中推断出正确的 URL)。

总结

现在,您已经创建了一个完整的框架网站项目,您可以继续用 URL、模型、视图和模板填充它。

现在 本地图书馆网站 的框架已经完成并正在运行,是时候开始编写使这个网站执行预期功能的代码了。

另请参阅