Skip to content

第一个Django应用1

我们将创建一个基本的投票应用程序。

它将由两部分组成:

  • 一个让人们查看和投票的公共站点
  • 一个让你能添加、修改和删除投票的管理站点
1
2
➜  ~ python -m django --version
2.2

创建项目

如果这是你第一次使用 Django 的话,你需要一些初始化设置。
也就是说,你需要用一些自动生成的代码配置一个 Django project -- 即一个 Django 项目实例需要的设置项集合,包括数据库配置、Django 配置和应用程序配置。

打开命令行,cd 到一个你想要放置你代码的目录,然后运行以下命令:

1
django-admin startproject mysite

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

1
2
3
4
5
6
7
mysite/
├── manage.py
└── mysite/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

这些目录和文件的用处是:

  • 最外层的mysite/根目录只是你项目的容器,Django 不关心它的名字,你可以将它重命名为任何你喜欢的名字。
  • manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。你可以阅读 django-admin and manage.py 获取所有manage.py的细节。
  • 里面一层mysite/目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。(比如mysite.urls)
  • mysize/__init__.py: 一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。
  • mysize/settings.py: Django 项目的配置文件。如果你想知道这个文件是如何工作的,请查看 Django 配置 了解细节
  • mysize/urls.py: Django 项目的 URL 声明,就像你网站的“目录”。阅读 URL 调度器 文档来获取更多关于 URL 的内容
  • mysize/wsgi.py: 作为你的项目的运行在 WSGI 兼容的 Web 服务器的入口。阅读 如何使用 WSGI 进行部署 了解更多细节

用于开发的简易服务器

让我们来确认以下你的 Django 项目是否真的创建成功了。
如果你的当前目录不是外层的mysite目录的话,请切换到此目录,然后运行下面的命令:

1
python manage.py runserver

应该会看到如下输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

November 03, 2020 - 13:23:58
Django version 2.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 服务器方面并不是)

现在,服务器正在运行,浏览器访问http://127.0.0.1:8000/
你将会看到一个“祝贺”页面,随着一只火箭发射,服务器已经运行了。

更换端口

默认情况下,runserver命令会将服务器设置为监听本机内部 IP 的 8000 端口。
如果你想更换服务器的监听端口,请使用命令行参数。举个例子,下面的命令会使服务器监听 8080 端口:

1
python manage.py runserver 8080

如果你想要修改服务器监听的 IP,在端口之前输入新的。
比如,为了监听所有服务器的公开 IP(这你运行 Vagrant 或想要向网络上的其它电脑展示你的成果时很有用),使用:

1
python manage.py runserver 0:8000

0 是 0.0.0.0 的简写

会自动重新加载的服务器 runserver:

用于开发的服务器在需要的情况下会对每一次的访问请求重新载入一遍 Python 代码。
所以你不需要为了让修改的代码生效而频繁的重新启动服务器。然而,一些动作,比如添加新文件,将不会触发自动重新加载,这时你得自己手动重启服务器。

创建投票应用

现在你的开发环境——这个“项目” ——已经配置好了,你可以开始干活了。

在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定。
Django 自带一个工具,可以帮你生成应用的基础目录结构,这样你就能专心写代码,而不是创建目录了。

项目 VS 应用

项目和应用有啥区别?
应用是一个专门做某件事的网络应用程序——比如博客系统,或者公共记录的数据库,或者简单的投票程序。
项目则是一个网站使用的配置和应用的集合。
项目可以包含很多个应用。应用可以被很多个项目使用。

你的应用可以存放在任何 Python path 中定义的路径。
在这个教程中,我们将在你的manage.py同级目录下创建投票应用。
这样它就可以作为顶级模块导入,而不是mysite的子模块。

请确定你现在处于manage.py所在的目录下,然后运行这行命令来创建一个应用:

1
$ python manage.py startapp polls

这将会创建一个polls目录,它的目录结构大致如下:

1
2
3
4
5
6
7
8
9
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

这个目录结构包括了投票应用的全部内容。

编写第一个视图

让我们开始编写第一个视图吧。打开polls/views.py,把下面这些 Python 代码输入进去:

1
2
3
4
5
from django.http import HttpResponse


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

这是 Django 中最简单的视图。
如果想看见效果,我们需要一个 URL 映射到它--这就是我们需要 URLconf 的原因了。

为了创建 URLconf,请在 polls 目录里新建一个urls.py文件。
你的应用目录现在看起来应该是这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

polls/urls.py中,输入如下代码:

1
2
3
4
5
6
7
from django.urls import path

from . import views

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

下一步是要根据 URLconf 文件中指定我们创建的pools.urls模块。
mysite/urls.py文件的urlpatterns列表里插入一个include(),如下:

1
2
3
4
5
6
7
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()的理念是使其可以即插即用。
因为投票应用有它自己的URLconf(polls/urls.py),他们能够被放在"/polls/""/fun_polls/""/content/polls/",或者其他任何路径下,这个应用都能够正常工作。

何时使用 include()

当包括其它 URL 模式时你应该总是使用include()admin.site.urls是唯一例外。

你现在把index视图添加进了 URLconf。通过以下命令验证是否正常工作:

1
$ python manage.py runserver

用你的浏览器访问http://localhost:8000/polls/,你应该能够看见 "Hello, world. You're at the polls index." ,这是你在 index 视图中定义的。

函数path()具有四个参数,两个必须参数:routeview,两个可选参数:kwargsname
现在,是时候来研究这些参数的含义了。

path() 参数: route

route是一个匹配 URL 的准则(类似正则表达式)。
当 Django 响应一个请求时,它会从urlpatterns的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。

这些准则不会匹配 GET 和 POST 参数或域名。
例如,URLconf 在处理请求https://www.example.com/myapp/时,它会尝试匹配myapp/
处理请求https://www.example.com/myapp/?page=3时,也只会尝试匹配myapp/

path() 参数: view

当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个HttpRequest对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。

path() 参数: kwargs

任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性

path() 参数: name

为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。
这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式