编写你的第一个 Django 应用,第一部分¶
让我们通过示例学习。
在本教程中,我们将引导你完成一个基本的投票应用的创建过程。
它将包含两个部分
一个供公众查看投票并参与投票的网站。
一个管理员站点,允许你添加、修改和删除投票。
我们假设你已经安装了 Django。你可以通过在 shell 提示符(以 $ 为前缀表示)中运行以下命令来确定 Django 是否已安装以及安装的版本。
$ python -m django --version
...\> py -m django --version
如果 Django 已安装,你应该会看到安装版本的号。如果未安装,你将收到一条错误消息,提示“No module named django”。
本教程是为 Django 5.1 编写的,它支持 Python 3.10 及更高版本。如果 Django 版本不匹配,你可以使用此页面右下角的版本切换器参考你 Django 版本的教程,或将 Django 更新到最新版本。如果你使用的是较旧版本的 Python,请查看我可以在 Django 中使用哪个 Python 版本? 以查找兼容的 Django 版本。
请参阅如何安装 Django,了解有关如何删除旧版本 Django 并安装新版本的建议。
在哪里获得帮助
如果你在学习本教程时遇到问题,请前往常见问题解答的获取帮助 部分。
创建项目¶
如果这是你第一次使用 Django,你需要进行一些初始设置。具体来说,你需要自动生成一些代码来建立一个 Django 项目——一个包含 Django 实例设置的集合,包括数据库配置、Django 特定选项和应用程序特定设置。
在命令行中,cd
到你想要存储代码的目录,并创建一个名为 djangotutorial
的新目录。(此目录名称对 Django 无关紧要;你可以将其重命名为任何你喜欢的名称。)
$ mkdir djangotutorial
...\> mkdir djangotutorial
然后,运行以下命令来引导一个新的 Django 项目
$ django-admin startproject mysite djangotutorial
...\> django-admin startproject mysite djangotutorial
这将在 djangotutorial
目录内创建一个名为 mysite
的项目。如果它没有工作,请参阅运行 django-admin 出现问题。
注意
你需要避免将项目命名为内置的 Python 或 Django 组件。特别是,这意味着你应该避免使用诸如 django
(这将与 Django 本身冲突)或 test
(这与内置的 Python 包冲突)之类的名称。
让我们看看startproject
创建了什么
djangotutorial/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
这些文件是
manage.py
:一个命令行实用程序,允许你以各种方式与这个 Django 项目进行交互。你可以在django-admin 和 manage.py 中阅读有关manage.py
的所有详细信息。mysite/
:一个目录,它是项目的实际 Python 包。它的名称是你需要用来导入其内部任何内容的 Python 包名称(例如mysite.urls
)。mysite/__init__.py
:一个空文件,告诉 Python 此目录应被视为一个 Python 包。如果你是一位 Python 初学者,请在官方 Python 文档中阅读更多关于包的信息。mysite/settings.py
:此 Django 项目的设置/配置。Django 设置 将告诉你有关设置如何工作的全部内容。mysite/urls.py
:此 Django 项目的 URL 声明;Django 驱动的网站的“目录”。你可以在URL 分发器 中阅读有关 URL 的更多信息。mysite/asgi.py
:ASGI 兼容 Web 服务器为你的项目提供服务的入口点。有关更多详细信息,请参阅如何使用 ASGI 部署。mysite/wsgi.py
:WSGI 兼容 Web 服务器为你的项目提供服务的入口点。有关更多详细信息,请参阅如何使用 WSGI 部署。
开发服务器¶
让我们验证你的 Django 项目是否正常工作。进入 djangotutorial
目录(如果尚未进入),并运行以下命令
$ python manage.py runserver
...\> py 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. November 14, 2024 - 15:50:53 Django version 5.1, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
注意
暂时忽略有关未应用的数据库迁移的警告;我们很快就会处理数据库。
现在服务器已运行,请使用你的 Web 浏览器访问http://127.0.0.1:8000/。你将看到一个“恭喜!”页面,上面有一枚火箭升空。它成功了!
你已经启动了 Django 开发服务器,这是一个完全用 Python 编写的轻量级 Web 服务器。我们将其包含在 Django 中,以便你可以快速开发,而无需在准备好投入生产之前处理配置生产服务器(例如 Apache)。
现在是时候注意了:**不要**在任何类似于生产的环境中使用此服务器。它仅用于开发目的。(我们专注于制作 Web 框架,而不是 Web 服务器。)
(要在其他端口上提供服务,请参阅runserver
参考。)
runserver
的自动重新加载
开发服务器会根据需要自动重新加载每个请求的 Python 代码。你无需重新启动服务器即可使代码更改生效。但是,某些操作(例如添加文件)不会触发重新启动,因此在这些情况下你必须重新启动服务器。
创建投票应用¶
现在你的环境(一个“项目”)已经设置好了,你就可以开始工作了。
你在 Django 中编写的每个应用程序都包含一个遵循特定约定的 Python 包。Django 带有一个实用程序,可以自动生成应用程序的基本目录结构,这样你就可以专注于编写代码而不是创建目录。
项目与应用
项目和应用有什么区别?应用是一个执行某些操作的 Web 应用程序——例如,博客系统、公共记录数据库或小型投票应用。项目是特定网站的配置和应用的集合。一个项目可以包含多个应用。一个应用可以存在于多个项目中。
你的应用可以位于你的Python 路径 中的任何位置。在本教程中,我们将在 djangotutorial
文件夹内创建我们的投票应用。
要创建你的应用,请确保你位于与 manage.py
相同的目录中,并键入此命令
$ python manage.py startapp polls
...\> py 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 代码放入其中
polls/views.py
¶from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
这是 Django 中最基本的视图。要在浏览器中访问它,我们需要将其映射到一个 URL——为此,我们需要定义一个 URL 配置,简称“URLconf”。这些 URL 配置在每个 Django 应用中定义,它们是名为 urls.py
的 Python 文件。
要为 polls
应用定义 URLconf,请创建一个包含以下内容的文件 polls/urls.py
polls/urls.py
¶from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
]
你的应用目录现在应该如下所示
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
下一步是配置 mysite
项目中的全局 URLconf 以包含在 polls.urls
中定义的 URLconf。为此,在 mysite/urls.py
中添加 django.urls.include
的导入,并在 urlpatterns
列表中插入一个include()
,以便你拥有
mysite/urls.py
¶from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("polls/", include("polls.urls")),
path("admin/", admin.site.urls),
]
path()
函数至少需要两个参数:route
和 view
。include()
函数允许引用其他 URLconf。每当 Django 遇到include()
时,它都会截断与该点匹配的 URL 的任何部分,并将剩余的字符串发送到包含的 URLconf 以进行进一步处理。
include()
的理念是简化 URL 的插拔使用。由于 polls 位于其自己的 URLconf (polls/urls.py
) 中,因此它可以放在“/polls/”下,也可以放在“/fun_polls/”下,或者“/content/polls/”下,或者任何其他路径根目录下,应用程序仍然可以正常工作。
何时使用 include()
当包含其他 URL 模式时,您应该始终使用 include()
。唯一的例外是 admin.site.urls
,它是 Django 为默认管理站点提供的预构建 URLconf。
您现在已将 index
视图连接到 URLconf 中。使用以下命令验证它是否正常工作。
$ python manage.py runserver
...\> py manage.py runserver
在浏览器中访问 http://localhost:8000/polls/,您应该会看到文本“Hello, world. You’re at the polls index.”,这是您在 index
视图中定义的。
页面未找到?
如果您在此处收到错误页面,请检查您是否访问了 http://localhost:8000/polls/ 而不是 http://localhost:8000/。
当您对基本的请求和响应流程感到满意后,请阅读 本教程的第 2 部分,开始使用数据库。