简介
在本教程中,我们将引导你创建一个基本的投票应用程序。
在本教程中,我们将引导你创建一个基本的投票应用程序。
让我们通过示例来学习。
在本教程中,我们将引导你创建一个基本的投票应用程序。
它将由两部分组成:
我们假设你已经安装了 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 它被允许处理任何主机头的请求。
默认情况下,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”标签页,你会看到相同的“恭喜”页面。
开发服务器的完整文档可以在 runserver
参考文档中找到。
runserver
的自动重新加载
开发服务器会根据需要为每个请求自动重新加载 Python 代码。你无需为了使代码更改生效而重新启动服务器。然而,某些操作(如添加文件)不会触发重新启动,所以在这些情况下你必须重新启动服务器。
既然你的环境(一个「项目」)已经设置好了,你就可以开始工作了。
你在 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://index
视图中定义的文本“Hello, world. You're at the polls index.”。
~django.urls.path
函数传递四个参数,两个是必需的:route
和 view
,两个是可选的:kwargs
和 name
。此时,值得回顾一下这些参数的用途。
~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 中练习更多实验来提升你的技能。