码出你的第一个Django app——Django官方教程(一)

译者:

官方原文链接https://docs.djangoproject.com/en/1.10/intro/tutorial01/,如有错译或理解偏差,请不吝批评指正,先行谢过!

码出你的第一个Django app,第一部分

让我们通过实例来学习。

这个教程会带领你创建一个基础的投票应用。

本教程由两部分组成:

  • 一个供用户查看和投票的公共站点
  • 一个供管理员对投票进行增删改查的站点

我们假设你已经安装好了Django。你可以用以下命令确定Django是否已经安装好并且查看其版本:

1
$ python -m django --version

如果Django已经安装好,你会看到你所安装的版本。如果没有安装好,你会看到错误信息“No module named django”。

这篇教程是写给Django 1.10和Python 3.4或更新的版本的。如果Django的版本不匹配,你可以在本页的右下角的版本选择工具处找到你所使用版本对应的教程,或者把你的Django更新到最新的版本。如果你仍然在使用Python 2.7,你需要像注释里所描述的那样对代码进行微调。

可以在How to install Django找到卸载旧版本并安装新版的办法。

在哪里寻求帮助

如果你在学习本教程中碰到了难题,请发送一个信息给django-users或者访问freenode.net去和其他的Django使用者讨论,看是否有人能帮助你。

创建一个工程

如果这是你第一次使用Django,你需要注意一些初始化好的设置。也就是说,你需要自动生成一些建立Django工程的代码——一批对一个Django实例的配置,包括数据库配置,Django特定的选项和应用特定的配置。

在命令行中,cd进入一个你想存放你的代码的目录,然后执行下面的命令:

1
$ django-admin startproject mysite

这时会在你当前目录下创建一个mysite目录。如果没有效果,参见 Problems running django-admin

当你给工程取名时,应当避免与Python的内置库或者Django的模
块重名。特别说明一下,就是说你得避免取像django这样的名字(这与Django自身相冲突)或
test这样的名字(这与Python的内置包冲突)。

 

该把代码放在哪?

如果从前你从事朴素的PHP的开发(不使用时髦的框架),你可能曾经把代码放到Web服务器的root文件里(一个类似于/var/www的地方)。使用Django时,你不能再那样做了。把Python代码全放在root文件里不是个好主意,因为其他人可能会通过Web去看你的源代码。这很不安全。

让我们看看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包名,在引用(import)文件的时候你都会用到它(比如mysite.urls)。
  • mysite/__init__.py:一个空文件,它的作用是告诉Python这个目录需要被认作是一个Python包。如果你是个Python初学者,请在Python的官方文档里阅读more about packages
  • mysite/settings.py:Django工程的设置/配置文件。Django settings这篇文章会告诉你它是如何工作的。
  • mysite/urls.py:这个Django工程的URL声明;可以理解为你的Django驱动的站点的“目录”。你可以在URL dispatcher阅读更多关于URLs的相关内容。
  • mysite/wsgi.py:一个WSFI-compatible Web服务器的入口。可以查看 How to deploy with WSG了解更多细节。

开发服务器

让我们来证实一下你的Django工程是否能工作。进入外层的mysite目录中,如果你还没准备好,就执行了下面这条命令:

1
$ python manage.py runserver

你会在命令行中看到以下输出:

1
2
3
4
5
6
7
8
9
10
11
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 04, 2016 - 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服务的。)

现在服务器已经运行起来了,用你的浏览器访问http://127.0.0.1:8000/。你会看到令人愉悦的,浅蓝色的“Welcome to Django”页。它好使!

更改端口

在默认的情况下,runserver命令在8000端口开启服务。

如果你想更改服务端口,给它传一个命令行参数。举个例子,下面这条命令将在8080端口开启服务:

1
2
> $ python manage.py runserver 8080
>

如果你想更改服务的IP,那么把它同端口一起作为参数。这样来监听所有的公共IP(如果你想通过其他电脑来查看你的作品),使用:

1
2
> $ python manage.py runserver 0.0.0.0:8000
>

有关runserver完整的文档请戳链接

 

runserver的自动重新加载

这个开发服务器会在每次处理请求的时候自动重新加载Python代码。你在修改代码后不用重启服务就能生效。可是,像添加文件这种操作不会引发自动加载,所以在这种情况下你得手动重启一下服务。


创建投票app

现在你的环境——一个“project”——已经创建完毕,现在要做的是开始真正的工作。

每一个用Django写的应用都遵循一个确定的规则来创建Python包,Django提供一个工具可以自动生成一个app的基础目录结构,这样你就能专心于代码的写作而不是规划目录。

Project vs. app

Project和app的区别在哪里呢?App是一个具有特定效用的Web应用,比如说一个日志系统,或是一个公共记录亦或是一个简单的投票应用。而project是许多app和相关配置组合起来的一个独特的网络站点。一个project能包含许多app。一个app可以被许多project所使用。

你的app可以放在你的Python path能找到的任何地方。在本教程中,我们把投票app创建在和manage.py同级的目录里,这样它就能被当作自己的顶层模块被引用(import),而不是mysite的子模块。

在创建app之前,确保命令执行在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

我们将用这个目录结构来组建应用。


码出第一个视图(view)

开始写第一个view吧!打开polls/views.py然后把下面的代码拷贝进去:

1
2
3
4
5
from django.http import HttpResponse


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

这是Django里最最简单的view了。要使用这个view,还需要给他映射一个URL,所以我们需要一个URL的配置文件(URLconfs)。

在polls目录下创建一个名为urls.py的URL配置文件吧。你的app目录现在应该是这个样的:

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

form . import views

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

下一步要做的是在根URL配置(root URLconf)里注册polls.urls模块。在mysite/urls.py中,增加对django.conf.urls.include的引用(import),然后在urlpatterns列表里增加一则include(),此时mysite/urls.py如下:

1
2
3
4
5
6
7
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()函数能够调用其它的URL配置文件(URLconfs)。可以看到给include()配置的正则表达式结尾并不是$(匹配结尾的字符)而是一个反斜杠。每当Django遇到include(),他就会把已匹配的部分砍掉然后把剩下的部分传入被include的URL配置文件(URLconf)里进一步匹配。

include()被设计的目的是为了方便我们掌控URL。只要polls的相关URL在配置文件里(polls/urls.py)配置好了,那么这个配置文件被放在哪里就无所谓了,他可以被放在“/polls/”,或是“/fun_pulls/”,亦或“/content/polls/”等等,app都能够正常的工作。

何时使用inlcude()

当引用其他URL配置(URL patterns)的时候都要使用此函数。admin.site.urls是唯一的例外。

 

我说的跟你看到的驴唇不对马嘴?

如果你所看到的是include(admin.site.urls)而不是admin.site.urls,你可能正在使用一个老版本的Django,这个教程并不适合。你可以选择去找老版的教程,或者,更新你的Django版本。

现在你已经在URLconf里绑定好了一个index view。那么就来证实一下好使不好使吧!执行下面这则命令:

1
$ python manage.py runserver

用浏览器访问http://localhost:8000/polls/,你会看到你在index view里定义的字样:“Hello, world. You’re at the polls index.”。

url()函数有四个参数,两个是必须的:regexview,还有两个是可选的:kwargsname。现在我们有必要去看看这四个参数都是做什么的。

url()的参数regex

“regex”是“regular expression”(正则表达式)的简写,正则表达式是一种对字符串进行模式匹配的语法,当然在这里,它是用来匹配一定格式的URL的。Django收到用户发来的请求URL后,会在列表里用正则表达式对它挨个进行匹配,直到找到一个匹配成功。

注意,正则表达式不会匹配GET或POST参数,也不会去匹配域名。举个例子,假如服务器收到请求http://www.example.com/myapp/,URLconf会去匹配查找myapp;假如是收到http://www.example.com/myapp/?page=3,URLconf也会去匹配myapp/

如果你不太懂正则表达式,可以去看一下Wikipedia’s entry或者去看看re模块的文档。还有,Jeffrey Fried写的O’Reilly book“Mastering Regular expressions”也不错。当然在这里你不必要十分精通正则表达式,只要知道怎样去匹配常用的模式就好了。事实上,复杂的正则匹配的查找能力并不尽如人意,所以你不必太过依赖它。

最后,一个性能说明:这些正则表达式会在URLconf模块加载的时候被编译。它们非常快(在不像上文中提到的十分复杂的情况下)。


url()的参数view

当Django用一个正则表达式匹配成功了请求的URL,Django就会调用一个特定的view函数,把HttpRequest对象当作这个函数的第一个参数,其余通过正则“捕获”的值作为其他参数。如果是简单的匹配,参数会是下标的形式;如果是通过名字匹配,参数会是键值对的形式。我们一会儿会通过例子来介绍这些。


url()的参数kwargs

随意的键值对参数,它们会以字典的形式被提交到指向的view。本教程不使用这个功能。


url()的参数name

在Django中给你的URL命名可以让你很方便的在别的地方使用它,尤其是在模板中。这强大的功能可以让你仅仅修改一个URL模块文件就能让这个改变全局生效。

如果你对本部分介绍的请求响应流程已经理解,那么就请开启本教程的第二部分(译者注:这是源链接)对数据库操作的学习吧!

译者:

经常听老师说外国文献虽然都很厚,但是都是非常易懂的言语,确实如此。各位不妨移步去看官网的英文原版教程。如果真的十分头疼英语而且觉得我翻译的还能看,但是我还没更新,就请催更吧^_^!

有钱的捧个钱场~