剑客
关注科技互联网

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

译者:

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

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

让我们通过实例来学习。

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

本教程由两部分组成:

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

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

$ 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
进入一个你想存放你的代码的目录,然后执行下面的命令:

$ 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
都创建了什么吧

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
目录中,如果你还没准备好,就执行了下面这条命令:

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

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端口开启服务:

> $ python manage.py runserver 8080
>

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

> $ 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
的同级目录下:

$ python manage.py startapp polls

这条命令创建了一个名为 polls
的目录,完全展开如下:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

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

码出第一个视图(view)

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

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目录现在应该是这个样的:

polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    urls.py
    views.py

把下面这段代码放到 polls/urls.py
里:

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
如下:

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。那么就来证实一下好使不好使吧!执行下面这则命令:

$ python manage.py runserver

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

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

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模块文件就能让这个改变全局生效。

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

译者:

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

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址