创建基本投票应用

DjangoDjangoAdvanced
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本教程中,我们将引导你创建一个基本的投票应用程序。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 高级 级别的实验,完成率为 29%。获得了学习者 100% 的好评率。

概述

让我们通过示例来学习。

在本教程中,我们将引导你创建一个基本的投票应用程序。

它将由两部分组成:

  • 一个公共网站,允许人们查看投票并进行投票。
  • 一个管理网站,允许你添加、更改和删除投票。

我们假设你已经安装了 Django。你可以在 shell 提示符下运行以下命令来判断 Django 是否已安装以及安装的版本:

python -m django --version

如果安装了 Django,你应该会看到安装的版本。如果没有安装,你会收到一个错误消息,提示“No module named django”。

本教程是为支持 Python 3.10 及更高版本的 Django 编写的。如果 Django 版本不匹配,你可以使用此页面右下角的版本切换器参考适用于你版本的 Django 的教程,或者将 Django 更新到最新版本。

创建项目

如果这是你第一次使用 Django,你需要进行一些初始设置。具体来说,你需要自动生成一些代码来创建一个 Django「项目」——Django 实例的一组设置,包括数据库配置、Django 特定选项和应用程序特定设置。

在命令行中,使用 cd 进入你想要存储代码的目录,然后运行以下命令:

cd ~/project
django-admin startproject mysite

这将在当前目录中创建一个 mysite 目录。

让我们看看 startproject 创建了什么:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

这些文件分别是:

  • 外部的 mysite/ 根目录是你项目的容器。它的名称对 Django 来说并不重要;你可以将其重命名为任何你喜欢的名称。
  • manage.py:一个命令行实用工具,可让你以各种方式与这个 Django 项目进行交互。
  • 内部的 mysite/ 目录是你项目实际的 Python 包。它的名称是你在导入其中任何内容时需要使用的 Python 包名称(例如 mysite.urls)。
  • mysite/__init__.py:一个空文件,告诉 Python 这个目录应被视为一个 Python 包。
  • mysite/settings.py:此 Django 项目的设置/配置。
  • mysite/urls.py:此 Django 项目的 URL 声明;你基于 Django 的网站的「目录」。
  • mysite/asgi.py:ASGI 兼容的 Web 服务器为你的项目提供服务的入口点。
  • mysite/wsgi.py:WSGI 兼容的 Web 服务器为你的项目提供服务的入口点。

开发服务器

让我们验证一下你的 Django 项目是否正常工作。如果你还没有进入外部的 mysite 目录,请切换进去,然后运行以下命令:

cd ~/project/mysite
python manage.py runserver

你会在命令行中看到以下输出:

Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them.

- 15:50:53 Django version, using settings'mysite.settings' Starting development server at <http://127.0.0.1:8000/> Quit the server with CONTROL-C.

现在先忽略关于未应用数据库迁移的警告;我们很快会处理数据库。

你已经启动了 Django 开发服务器,这是一个完全用 Python 编写的轻量级 Web 服务器。我们将其包含在 Django 中,以便你可以快速开发,直到准备好投入生产之前,无需处理诸如 Apache 等生产服务器的配置。

现在需要注意:不要 在任何类似生产环境的场景中使用此服务器。它仅用于开发阶段。(我们是做 Web 框架的,不是做 Web 服务器的。)

现在服务器正在运行,用你的网页浏览器访问 http://127.0.0.1:8000/。或者,在终端中运行 curl 127.0.0.1:8000。你会看到一个“恭喜!”页面,上面有一枚火箭起飞。成功了!

在 LabEx VM 中,我们需要将 LabEx 域名添加到 ALLOWED_HOSTS 中。编辑 mysite/settings.py,并在 ALLOWED_HOSTS 的末尾添加 *,使其如下所示:

ALLOWED_HOSTS = ["*"]

这告诉 Django 它被允许处理任何主机头的请求。

Django development server running

更改端口

默认情况下,runserver 命令会在内部 IP 的 8000 端口上启动开发服务器。

如果你想更改服务器的端口,可以将其作为命令行参数传递。例如,此命令会在 8080 端口上启动服务器:

python manage.py runserver 8080

如果你想更改服务器的 IP,可以将其与端口一起传递。例如,要监听所有可用的公共 IP(如果你正在运行 Vagrant 或者想在网络上的其他计算机上展示你的工作成果,这会很有用),使用:

python manage.py runserver 0.0.0.0:8080

现在,切换到 LabEx VM 中的“Web 8080”标签页,你会看到相同的“恭喜”页面。

Django development server page

开发服务器的完整文档可以在 runserver 参考文档中找到。

runserver 的自动重新加载
开发服务器会根据需要为每个请求自动重新加载 Python 代码。你无需为了使代码更改生效而重新启动服务器。然而,某些操作(如添加文件)不会触发重新启动,所以在这些情况下你必须重新启动服务器。

创建 Polls 应用

既然你的环境(一个「项目」)已经设置好了,你就可以开始工作了。

你在 Django 中编写的每个应用都由一个遵循特定约定的 Python 包组成。Django 提供了一个实用工具,可以自动生成应用的基本目录结构,这样你就可以专注于编写代码,而不必创建目录。

项目与应用
项目和应用有什么区别?应用是一个能做某些事情的 Web 应用程序——例如,一个博客系统、一个公共记录数据库或一个小型投票应用。项目是特定网站的配置和应用的集合。一个项目可以包含多个应用。一个应用可以存在于多个项目中。

你的应用可以位于 Python 路径 <tut-searchpath> 上的任何位置。在本教程中,我们将在与 manage.py 文件相同的目录中创建我们的投票应用,以便它可以作为自己的顶级模块导入,而不是作为 mysite 的子模块。

要创建你的应用,确保你在与 manage.py 相同的目录中,然后输入以下命令:

cd ~/project/mysite
python manage.py startapp polls

这将创建一个名为 polls 的目录,其结构如下:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

这个目录结构将容纳投票应用。

编写你的第一个视图

让我们编写第一个视图。打开文件 polls/views.py,并在其中放入以下 Python 代码:

from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

这是 Django 中可能的最简单视图。要调用该视图,我们需要将其映射到一个 URL——为此我们需要一个 URL 配置(URLconf)。

要在 polls 目录中创建一个 URLconf,创建一个名为 urls.py 的文件。现在你的应用目录应该如下所示:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

polls/urls.py 文件中包含以下代码:

from django.urls import path

from. import views

urlpatterns = [
    path("", views.index, name="index"),
]

下一步是将根 URLconf 指向 polls.urls 模块。在 mysite/urls.py 中,添加对 django.urls.include 的导入,并在 urlpatterns 列表中插入一个 ~django.urls.include,这样你就有了:

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
]

~django.urls.include 函数允许引用其他 URLconf。每当 Django 遇到 ~django.urls.include 时,它会切掉到该点为止匹配的 URL 的任何部分,并将剩余的字符串发送到包含的 URLconf 进行进一步处理。

~django.urls.include 背后的想法是使插入和播放 URL 变得容易。由于投票应用有自己的 URLconf(polls/urls.py),它们可以放在 "/polls/" 下,或 "/fun_polls/" 下,或 "/content/polls/" 下,或任何其他路径根目录下,应用仍然可以正常工作。

何时使用 ~django.urls.include()
当你包含其他 URL 模式时,你应该始终使用 include()admin.site.urls 是唯一的例外。

你现在已经将一个 index 视图连接到了 URLconf 中。使用以下命令验证它是否正常工作:

python manage.py runserver 0.0.0.0:8080

在浏览器中访问 <http:///polls/>,你应该会看到你在 index 视图中定义的文本“Hello, world. You're at the polls index.”。

Django URLconf structure

~django.urls.path 函数传递四个参数,两个是必需的:routeview,两个是可选的:kwargsname。此时,值得回顾一下这些参数的用途。

~django.urls.path 参数:route

route 是一个包含 URL 模式的字符串。在处理请求时,Django 从 urlpatterns 中的第一个模式开始,沿着列表向下,将请求的 URL 与每个模式进行比较,直到找到一个匹配的模式。

模式不会搜索 GET 和 POST 参数,也不会搜索域名。例如,在对 https://www.example.com/myapp/ 的请求中,URLconf 会查找 myapp/。在对 https://www.example.com/myapp/?page=3 的请求中,URLconf 也会查找 myapp/

~django.urls.path 参数:view

当 Django 找到一个匹配的模式时,它会使用一个 ~django.http.HttpRequest 对象作为第一个参数,并将来自路由的任何“捕获”值作为关键字参数调用指定的视图函数。我们稍后会给出一个示例。

~django.urls.path 参数:kwargs

任意关键字参数可以作为字典传递给目标视图。在本教程中我们不会使用 Django 的这个功能。

~django.urls.path 参数:name

为你的 URL 命名可以让你在 Django 的其他地方,特别是在模板中明确地引用它。这个强大的功能允许你在只触及一个文件的情况下,对项目的 URL 模式进行全局更改。

总结

恭喜你!你已经完成了「创建基本投票应用」实验。你可以在 LabEx 中练习更多实验来提升你的技能。