Skip to main content

编写您的第一个Django应用程序,第1部分

让我们通过例子学习。

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

它将包括两部分:

  • 允许用户查看投票并在其中投票的公共网站。

  • 一个管理网站,可让您添加,更改和删除投票。

我们假设你已经有 Django安装。您可以通过运行以下命令来判断Django是否已安装以及版本:

$ python -m django --version

如果安装了Django,您应该会看到安装的版本。如果不是,你会得到一个错误,告诉“没有模块命名django”。

本教程是为Django 1.10 和Python 3.4或更高版本编写的。如果Django版本不匹配,您可以使用本页右下角的版本切换器来参考您的Django版本教程,或者将Django更新到最新版本。如果你仍在使用Python 2.7,你需要稍微调整代码示例,如评论中所述。

有关如何删除旧版本的Django并安装新版本的Django的建议,请参阅 如何安装Django

在哪里获得帮助:

如果您在阅读本教程时遇到问题,请向 django-users 发送消息或通过 #django on irc.freenode.net 删除以与可能能够帮助的其他Django用户聊天。

创建项目

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

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

$ django-admin startproject mysite

这将在当前目录中创建一个 mysite 目录。如果它不工作,见 运行 django-admin 的问题

注解

您需要避免在内置Python或Django组件后命名项目。特别是,这意味着你应该避免使用像 django (它会与Django本身冲突)或 test (与内置的Python包冲突)。

这个代码应该在哪里生活?

如果你的背景是普通的PHP(没有使用现代框架),你可能习惯把代码放在Web服务器的文档根下(在一个地方,如 /var/www)。有了Django,你不会这样做。将任何这些Python代码放在Web服务器的文档根中并不是一个好主意,因为它冒着人们可能能够通过Web查看代码的风险。这不利于安全。

将您的代码放在文档根目录 的某个目录中,例如 /home/mycode

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

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

这些文件是:

  • 外部 mysite/ 根目录只是项目的容器。它的名字对Django没有关系;你可以重命名为任何你喜欢的。

  • manage.py:一个命令行实用程序,它允许您以各种方式与此Django项目进行交互。您可以在 django-admin 和 manage.py 中阅读有关 manage.py 的所有详细信息。

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

  • mysite/__init__.py:一个空文件,告诉Python该目录应该被视为一个Python包。如果你是Python初学者,请在官方Python文档中阅读 更多关于包

  • mysite/settings.py:此Django项目的设置/配置。 Django设置 会告诉你所有的设置如何工作。

  • mysite/urls.py:此Django项目的URL声明;您的Django供电网站的“目录”。您可以在 网址调度员 中了解有关网址的详情。

  • mysite/wsgi.py:与WSGI兼容的Web服务器为您的项目提供服务的入口点。有关详细信息,请参阅 如何使用WSGI进行部署

开发服务器

让我们验证你的Django项目的工作。切换到外部 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.

十月 09, 2017 - 15:50:53
Django version 1.10, 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/。你会看到一个“欢迎来到Django”页面,在愉快,淡蓝色的柔和。有效!

更改端口

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

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

$ python manage.py runserver 8080

如果要更改服务器的IP,请将其与端口一起传递。所以要监听所有的公共IP(如果你想展示你的工作在网络上的其他计算机有用),请使用:

$ python manage.py runserver 0.0.0.0:8000

开发服务器的完整文档可以在 runserver 参考中找到。

自动重新加载 runserver

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

创建投票应用

现在你的环境 - 一个“项目” - 已经设置,你将开始做工作。

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

项目与应用程序

项目和应用程序之间有什么区别?应用程序是执行某些操作的Web应用程序,例如Weblog系统,公共记录数据库或简单的轮询应用程序。项目是特定网站的配置和应用程序的集合。项目可以包含多个应用程序。应用程序可以在多个项目中。

您的应用程序可以在 Python路径 上的任何地方生活。在本教程中,我们将在您的 manage.py 文件旁边创建轮询应用程序,以便它可以作为其自己的顶级模块而不是 mysite 的子模块导入。

要创建您的应用程序,请确保您在与 manage.py 相同的目录中,并键入以下命令:

$ 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代码:

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.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

下一步是将根URLconf指向 polls.urls 模块。在 mysite/urls.py 中,为 django.conf.urls.include 添加一个导入,并在 urlpatterns 列表中插入 include(),因此您有:

mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls')),
    url(r'^admin/', admin.site.urls),
]

include() 函数允许引用其他URLconfs。请注意,include() 函数的正则表达式没有 $ (字符串末尾匹配字符),而是尾部斜杠。每当Django遇到 include() 时,它会截断与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以进行进一步处理。

include() 背后的理念是使插件和播放网址更容易。由于轮询在自己的URLconf(polls/urls.py)中,它们可以放在“/polls/”下,或“/fun_polls/”下或“/content/polls/”或任何其他路径根下,仍然工作。

何时使用 include()

当您包括其他网址格式时,应始终使用 include()admin.site.urls 是唯一的例外。

与您看到的不符?

如果您看到 include(admin.site.urls) 而不是 admin.site.urls,您可能使用的Django版本与本教程版本不匹配。您将需要切换到较旧的教程或较新的Django版本。

您现在已将一个 index 视图连接到URLconf。让我们验证它的工作,运行以下命令:

$ python manage.py runserver

在浏览器中转到 http://localhost:8000/polls/,您应该看到在 index 视图中定义的文本“ 你好,世界。你在投票指数。 ”。

url() 函数传递四个参数,两个必需:regexview,以及两个可选:kwargsname。在这一点上,值得审查这些参数是什么。

url() 参数:regex

术语“regex”是常用的短形式,意思是“正则表达式”,其是用于匹配字符串中的模式的语法,或者在这种情况下是url模式。 Django从第一个正则表达式开始,沿着列表向下,将请求的URL与每个正则表达式进行比较,直到找到匹配的正则表达式。

请注意,这些正则表达式不会搜索GET和POST参数或域名。例如,在对 https://www.example.com/myapp/ 的请求中,URLconf将查找 myapp/。在对 https://www.example.com/myapp/?page=3 的请求中,URLconf还将查找 myapp/

如果需要正则表达式的帮助,请参阅 Wikipedia’s entryre 模块的文档。此外,O’Reilly的书“掌握正则表达式”由Jeffrey Friedl是太棒了。然而,在实践中,你不需要是正则表达式的专家,因为你真的只需要知道如何捕获简单的模式。事实上,复杂的正则表达式可能具有较差的查找性能,因此您可能不应该依赖于正则表达式的全部功能。

最后,性能注释:这些正则表达式是在第一次加载URLconf模块时编译的。它们是超快的(只要查找不是太复杂,如上所述)。

url() 参数:视图

当Django找到正则表达式匹配时,Django调用指定的视图函数,将 HttpRequest 对象作为第一个参数,并将正则表达式中的任何“捕获”值作为其他参数。如果正则表达式使用简单的捕获,值将作为位置参数传递;如果它使用命名捕获,那么值将作为关键字参数传递。我们将举一个例子。

url() 参数:kwargs

任意关键字参数可以在字典中传递到目标视图。我们不会在教程中使用Django的这个功能。

url() 参数:name

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

当您对基本请求和响应流程感到满意时,请阅读 本教程的第2部分 以开始使用数据库。