编写第一个django应用程序,第1部分

让我们以身作则。

在本教程中,我们将引导您完成基本投票应用程序的创建。

它由两部分组成:

  • 一个允许人们查看投票和投票的公共网站。

  • 允许添加、更改和删除投票的管理网站。

我们假设你有 Django installed 已经。通过在shell提示下运行以下命令(由$prefix指示),可以告诉Django已安装以及安装了哪个版本:

$ python -m django --version
...\> py -m django --version

如果安装了Django,您应该看到安装的版本。如果不是这样,您将得到一个错误提示“没有名为django的模块”。

本教程是为Django编写的 5.1 ,它支持Python3.10及更高版本。如果Django的版本不匹配,您可以使用此页面右下角的版本切换器来参考您的Django版本的教程,或者将Django更新到最新版本。如果您使用的是较旧版本的Python,请选中 我可以在django中使用什么python版本? 找到一个兼容版本的Django。

How to install Django 有关如何删除旧版本的django并安装新版本的建议。

从何处获得帮助:

如果您在阅读本教程时遇到困难,请转到 Getting Help 常见问题部分。

创建项目

如果这是您第一次使用django,您将需要处理一些初始设置。也就是说,您需要自动生成一些代码来建立Django project --Django实例的设置集合,包括数据库配置、特定于Django的选项和特定于应用程序的设置。

从命令行, cd 进入要存储代码的目录,然后运行以下命令:

$ django-admin startproject mysite
...\> django-admin startproject mysite

这将创建一个 mysite 当前目录中的目录。如果不起作用,看 运行中的问题 django-admin .

备注

您需要避免使用内置的python或django组件来命名项目。特别是,这意味着您应该避免使用以下名称 django (将与Django本身发生冲突)或 test (与内置的python包冲突)。

这个代码应该在哪里?

如果您的背景是普通的老式PHP(没有使用现代框架),那么您可能习惯于将代码放在Web服务器的文档根目录下(例如 /var/www )。对于姜戈,你不能这么做。将任何这段Python代码放在Web服务器的文档根目录中都不是一个好主意,因为这有可能使人们能够通过Web查看您的代码。这对安全不好。

把代码放在某个目录中 外部 文档根目录,例如 /home/mycode .

我们来看看是什么 startproject 已创建:

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

这些文件是:

  • 外部 mysite/ 根目录是项目的容器。它的名称对Django来说并不重要;您可以将其重命名为任何您喜欢的名称。

  • manage.py :一个命令行实用程序,允许您以各种方式与Django项目进行交互。你可以阅读有关 manage.py 在里面 django-admin and manage.py .

  • 内部 mysite/ 目录是项目的实际python包。它的名称是python包的名称,您需要使用它来导入其中的任何内容(例如 mysite.urls

  • mysite/__init__.py :一个空文件,告诉python应该将此目录视为python包。如果你是一个 Python 初学者,请阅读 more about packages 在官方的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项目的工作。换到外面 mysite 目录,如果还没有,请运行以下命令:

$ 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.

十二月 18, 2023 - 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.

备注

暂时忽略关于未应用数据库迁移的警告;我们将很快处理该数据库。

您已经启动了Django开发服务器,这是一个纯粹用Python编写的轻量级Web服务器。我们在Django中包含了这一点,这样您就可以快速地进行开发,而不必配置生产服务器--比如Apache--直到您准备好投入生产。

现在是注意以下问题的好时机: don't 在任何类似于生产环境的环境中使用此服务器。它仅供开发时使用。(我们的业务是制作Web框架,而不是Web服务器。)

现在服务器正在运行,使用您的Web浏览器访问http://127.0.0.1:8000/。你会看到一个“祝贺你!”佩奇,随着火箭的升空。啊,真灵!

更改端口

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

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

$ python manage.py runserver 8080
...\> py manage.py runserver 8080

如果要更改服务器的IP,请将其与端口一起传递。例如,要监听所有可用的公共IP(如果您正在运行vagrant或想在网络上的其他计算机上炫耀您的工作,这很有用),请使用:

$ python manage.py runserver 0.0.0.0:8000
...\> py manage.py runserver 0.0.0.0:8000

开发服务器的完整文档可以在 runserver 参考资料。

自动重新加载 runserver

开发服务器根据需要自动为每个请求重新加载python代码。您不需要重新启动服务器,代码更改就可以生效。但是,一些操作(如添加文件)不会触发重新启动,因此在这些情况下,您必须重新启动服务器。

创建投票应用程序

既然您的环境——一个“项目”——已经设置好了,那么您就可以开始工作了。

在Django中编写的每个应用程序都由遵循特定约定的Python包组成。Django附带了一个自动生成应用程序基本目录结构的实用程序,因此您可以专注于编写代码而不是创建目录。

项目与应用程序

项目和应用程序有什么不同?应用程序是一种做一些事情的网络应用程序--例如,博客系统、公共记录数据库或小型民意调查应用程序。项目是特定网站的配置和应用程序的集合。一个项目可以包含多个应用程序。一个应用程序可以位于多个项目中。

您的应用程序可以在您的 Python path . 在本教程中,我们将在与您的 manage.py 文件,以便它可以作为自己的顶级模块导入,而不是作为 mysite .

若要创建应用程序,请确保您与 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——为此,我们需要一个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 文件包含以下代码:

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 插入一个 include()urlpatterns 列出,这样您就可以:

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),
]

这个 include() 函数允许引用其他urlconfs。每当Django遇到 include() ,它会切掉与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的urlconf以进行进一步处理。

背后的想法 include() 是为了方便插入和播放URL。因为投票是在他们自己的乌尔科夫 (polls/urls.py ,它们可以放在“/polls/”,或在“/fun_polls/”,或在“/content/polls/”,或任何其他路径根下,应用程序仍然可以工作。

何时使用 include()

你应该经常使用 include() 当您包含其他URL模式时。 admin.site.urls 这是唯一的例外。

你现在已经接通了 index 查看URLCONF。验证它是否使用以下命令:

$ python manage.py runserver
...\> py manage.py runserver

转到浏览器中的http://localhost:8000/polls/,您将看到文本“ 你好,世界。你在民意测验中。 “,您在 index 查看。

找不到页面?

如果这里有一个错误页面,请检查您是否要访问http://localhost:8000/polls/,而不是http://localhost:8000/。

这个 path() 函数传递四个参数,需要两个参数: routeview 和两个可选: kwargsname . 在这一点上,值得回顾一下这些论点是为了什么。

path() argument: 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() argument: view

当Django找到匹配的模式时,它使用 HttpRequest 对象作为第一个参数,并将路由中的任何“捕获”值作为关键字参数。我们再举一个例子。

path() argument: kwargs

可以在字典中将任意关键字参数传递给目标视图。我们不会在教程中使用django的这个特性。

path() argument: name

命名URL可以让您明确地从Django的其他地方引用它,特别是在模板中。这个强大的功能允许您在只访问单个文件的同时对项目的URL模式进行全局更改。

当您对基本的请求和响应流感到满意时,请阅读 part 2 of this tutorial 开始使用数据库。