编写你的第一个 Django 应用程序,第 1 部分 — Django 文档
编写您的第一个 Django 应用程序,第 1 部分
让我们通过例子来学习。
在本教程中,我们将引导您创建一个基本的投票应用程序。
它将由两部分组成:
- 一个允许人们查看民意调查并在其中投票的公共站点。
- 一个管理站点,可让您添加、更改和删除投票。
我们假设你已经安装了 Django 。 您可以通过在 shell 提示符(由 $ 前缀表示)中运行以下命令来告诉 Django 已安装以及哪个版本:
如果安装了 Django,您应该会看到安装的版本。 如果不是,您将收到一条错误消息,告诉您“没有名为 django 的模块”。
本教程是为 Django 3.2 编写的,它支持 Python 3.6 及更高版本。 如果 Django 版本不匹配,您可以使用本页右下角的版本切换器参考您的 Django 版本教程,或者将 Django 更新到最新版本。 如果您使用的是旧版本的 Python,请检查 我可以将什么 Python 版本与 Django 一起使用? 以查找兼容的 Django 版本。
请参阅 如何安装 Django 以获取有关如何删除旧版本 Django 并安装新版本的建议。
创建项目
如果这是您第一次使用 Django,则必须进行一些初始设置。 也就是说,您需要自动生成一些代码来建立 Django project – Django 实例的设置集合,包括数据库配置、特定于 Django 的选项和特定于应用程序的设置。
在命令行中,将 cd
放入您要存储代码的目录中,然后运行以下命令:
这将在您的当前目录中创建一个 mysite
目录。 如果它不起作用,请参阅 运行 django-admin 的问题 。
笔记
您需要避免在内置 Python 或 Django 组件之后命名项目。 特别是,这意味着您应该避免使用像 django
(这将与 Django 本身冲突)或 test
(与内置 Python 包冲突)之类的名称。
这段代码应该放在哪里?
如果您的背景是纯旧的 PHP(没有使用现代框架),您可能习惯于将代码放在 Web 服务器的文档根目录下(在诸如 /var/www
之类的地方)。 使用 Django,您不会这样做。 将任何这些 Python 代码放在您的 Web 服务器的文档根目录中并不是一个好主意,因为它冒着人们可以通过 Web 查看您的代码的风险。 这对安全不利。
将您的代码放在文档根目录的 外部 目录中,例如 /home/mycode
。
让我们看看 :djadmin:`startproject` 创建了什么:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
这些文件是:
- 外部的
mysite/
根目录是您项目的容器。 它的名字对 Django 来说并不重要; 您可以将其重命名为您喜欢的任何名称。 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 settings 会告诉你设置是如何工作的。mysite/urls.py
:这个Django项目的URL声明; Django 驱动站点的“目录”。 您可以在 URL 调度程序 中阅读有关 URL 的更多信息。mysite/asgi.py
:ASGI 兼容 Web 服务器的入口点,为您的项目提供服务。 有关更多详细信息,请参阅 如何使用 ASGI 进行部署。mysite/wsgi.py
:兼容 WSGI 的 Web 服务器的入口点,可为您的项目提供服务。 有关更多详细信息,请参阅 如何使用 WSGI 进行部署。
开发服务器
让我们验证您的 Django 项目是否有效。 切换到外部 mysite
目录,如果你还没有,并运行以下命令:
您将在命令行上看到以下输出:
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. October 15, 2021 - 15:50:53 Django version 3.2, 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 服务器。)
现在服务器正在运行,请使用 Web 浏览器访问 http://127.0.0.1:8000/。 您会看到“恭喜!” 页,随着火箭起飞。 有效!
更改端口
默认情况下,:djadmin:`runserver` 命令在端口 8000 的内部 IP 上启动开发服务器。
如果要更改服务器的端口,请将其作为命令行参数传递。 例如,此命令在端口 8080 上启动服务器:
如果要更改服务器的 IP,请将其与端口一起传递。 例如,要侦听所有可用的公共 IP(如果您正在运行 Vagrant 或想在网络上的其他计算机上展示您的工作,这很有用),请使用:
0 是 0.0.0.0 的快捷方式。 开发服务器的完整文档可以在 :djadmin:`runserver` 参考中找到。
开发服务器根据需要自动为每个请求重新加载 Python 代码。 您无需重新启动服务器即可使代码更改生效。 但是,某些操作(例如添加文件)不会触发重新启动,因此在这些情况下您必须重新启动服务器。
创建民意调查应用
现在您的环境——一个“项目”——已经建立,您可以开始工作了。
您在 Django 中编写的每个应用程序都包含一个遵循特定约定的 Python 包。 Django 附带一个实用程序,可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是创建目录。
项目对比 应用
项目和应用程序之间有什么区别? 应用程序是可以执行某些操作的 Web 应用程序,例如,Weblog 系统、公共记录数据库或小型投票应用程序。 项目是特定网站的配置和应用程序的集合。 一个项目可以包含多个应用程序。 一个应用程序可以在多个项目中。
您的应用程序可以位于 Python 路径 上的任何位置。 在本教程中,我们将在与 manage.py
文件相同的目录中创建我们的投票应用程序,以便它可以作为自己的顶级模块导入,而不是作为 mysite
的子模块。
要创建您的应用程序,请确保您与 manage.py
位于同一目录中并键入以下命令:
这将创建一个目录 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——为此我们需要一个 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
列表中插入一个 include(),所以你有:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
include() 函数允许引用其他 URLconf。 每当 Django 遇到 include() 时,它都会切断与该点匹配的 URL 的任何部分,并将剩余的字符串发送到包含的 URLconf 以进行进一步处理。
include() 背后的想法是使 URL 即插即用变得容易。 由于 polls 在它们自己的 URLconf (polls/urls.py
) 中,它们可以放置在“/polls/”下,或“/fun_polls/”下,或“/content/polls/”下,或任何其他路径根目录下,该应用程序仍将运行。
您现在已将 index
视图连接到 URLconf。 使用以下命令验证它是否正常工作:
去 http://localhost:8000/polls/ 在您的浏览器中,您应该会看到文本“ 你好,世界。 你在民意调查指数。 ”,您在index
看法。
path() 函数传递四个参数,两个必需:route
和 view
,两个可选:kwargs
和 name
]。 在这一点上,值得回顾一下这些论点的用途。
path() 参数:route
route
是一个包含 URL 模式的字符串。 处理请求时,Django 从 urlpatterns
中的第一个模式开始,然后沿着列表向下移动,将请求的 URL 与每个模式进行比较,直到找到匹配的 URL。
模式不搜索 GET 和 POST 参数或域名。 例如,在对 https://www.example.com/myapp/
的请求中,URLconf 将查找 myapp/
。 在对 https://www.example.com/myapp/?page=3
的请求中,URLconf 还将查找 myapp/
。
path() 参数:view
当 Django 找到匹配的模式时,它会调用指定的视图函数,并使用 HttpRequest 对象作为第一个参数,并将路由中任何“捕获”的值作为关键字参数。 我们稍后会给出一个例子。
path() 参数:kwargs
任意关键字参数可以在字典中传递给目标视图。 我们不会在教程中使用 Django 的这个特性。
path() 参数:name
命名你的 URL 可以让你从 Django 的其他地方明确地引用它,尤其是在模板中。 这个强大的功能允许您在只接触单个文件的情况下对项目的 URL 模式进行全局更改。
当您对基本的请求和响应流程感到满意后,请阅读本教程的 第 2 部分 以开始使用数据库。