Writing your first Django app, part 1 (CN)

文档目的:

  1. 个人知识固化、总结
  2. 内部技术交流

完成一系列的tutorial后,我们会完成创建一个基本的polls ”投票"应用程序。
程序将包含两个部分:
1. 公共部分,所有访问者可以查看投票的问题,并对其进行"票选"
2. 管理接口,用于添加、修改、删除投票内容

教程假设已经完成Django的安装,可以使用如下命令来显示已经安装的Django的版本:

$ python -m Durango --version
如果Django已经安装,会显示Django的版本信息,否则,会显示错误——"No module named django"。
教程基于Django 1.11 和Python 3.4或者更高版本

创建project

如果是第一次使用Django,我要了解:创建一个Django project,会自动生成代码,诸如数据库配置、Django相关选项、应用相关选项的设置代码。
 让我们开始动起手来 …
在本机创建一个文件夹,用于存储我们所有的Django project,假设文件夹名称是django,启动命令行(command line)工具, cd 到这个django目录,执行如下命令:

$ django-admin startproject mysite
这会在当前目录下创建一个名称是mysite的文件夹。
让我们看看,startproject命令会为我们准备哪些东西。
mysite/
manage.py
mysite/
init.py
settings.py
urls.py
wsgi.py
- 最外层的mysite/文件夹,是用来存放我们的project的,其名称本身,对于Django并没有什么特别意义,可以使用与project名称不同的文件夹名。
- manage.py:这是Django提供的一个命令行脚本,后续我们会使用这个脚本,用各种方式来操作、维护我们的project。
- 内层mysite/文件夹,这是project的对应Python模块——这个文件夹名字,就是Python模块的名字,任何需要导入project模块的地方都要用到这个名称。
- mysite/__init__.py ,这是一个空文件,有了这个文件,Python就可以把文件夹当成是Python模块来处理。
- mysite/setting.py, 关于Django project的设定、配置,这这个文件中集中进行。
- mysite/urls.py, Django project的URL声明。
- mysite/wsgi.py, An entry-point for WSGI-compatible web servers to serve your project。 在当前的系列教程里,不会设计WSGI的内容。

开发服务器

至此,我们可以确认一下之前的所有工作。cd 到project的mysite目录,在命令行中执行如下命令。

$ python manage.py runserver
正常的话,我们会看到如下输出:

 输出中的关于待应用(unapplied)migrations的警告,我们会在后续介绍
上述命令,启动了Django的开发服务器,这是一个用Python实现的轻量级Web服务器,使用这个服务器进行开发活动,避免一开始就要去完成诸如Apache这些生产Web服务器的配置。
在这里,我们就要开始强调 不要 在生产环境使用这个开发服务器。
开发服务器已经运行,通过你的浏览器软件,访问http://127.0.0.1:8000/ 应该能够看到“Welcome to Django“的欢迎页面了。

默认情况下,开发服务器使用端口8000,但是,有时候我们需要使用其他的端口(比如,8000端口被别的程序已经占用了)
$ python manage.py runserver 8080
如果要监听所有IP地址:
$ python manage.py runserver 0:8080
这里的0是0.0.0.0的缩写

创建Polls 应用

到目前为止,project已经正常启动、运行,是时候编写应用代码了。
每一个Django应用程序,都有一个Python模块构成,这个模块需要遵循Django的特定习惯或者说规则。Django本身的工具会替我们将应用的基础目录结构创建好,所以你只需要关注写代码,而不需要关注该如何创建符合规则的文件夹。
我们的app可以放置在任意Python path上,在这个教程中,我们会将app创建在manage.py的同级目录中,这样的话呢,我们的投票应用就会是project中的顶级模块,而不是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)

打开polls/views.py,添加如下Python代码
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的Python文件。polls应用的目录将如下:
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
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
如前面描述过的,我们的project会包含多个类似polls这样的应用程序,如何在project级别,识别、使用polls应用的URLconf配置呢?
在mysite/urls.py,使用django.conf.urls.include,来为polls/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),
]
这样,浏览器类似于http://127.0.0.1:8000/polls/... 就会使用polls/urls.py 中的定义,决定访问的是我们Django中的具体哪一个视图。
include()函数,用于引用其他的URLconf。在这个例子中,我们看到,第一个参数是Regex表达式,以斜杠结尾,并不是以$符号结尾,真实访问发生时,斜杠后的匹配字符会被交给引用的URLconf来进一步处理……
启动开发服务器,来检查一下我们已经完成的工作

$ python manage.py runserver
访问http://127.0.0.1:8000/polls/ 这将会访问我们在polls/urls.py中定义的index视图——简单的返回字符串:“Hello, world. You’re at the polls index.”
url()接受4个参数,regex和view是必须的,还有两个可选参数:kwargs,name,这里我们来整理一下这些参数的用途:
- url() 参数: regex
Django会一个个匹配urlpatterns中的regular expression,直到找到匹配的项目。
需要注意的是  这个regular express并不会包括GET POST的参数,也不会包含URL的域名部分 ,比如: https://www.example.com/myapp/,URLconf会查找 myapp/ , https://www.example.com/myapp/?page=3, Urlconf查找的仍然是 myapp/
regular express 会在URLconf模块第一次被装载的时候编译(Compile),编译后的regular expression运作起来超级快
- view
当Django匹配、查找到regex后,就会调用指定的视图函数,将HttpRequest对象作为函数的第一个参数,将regex中“捕获”的其他值作为其他参数传递给视图函数
- kwargs
必须的keword参数,将以python dictionry的方式传递给视图函数,本教程的后续内容会对此进行进一步说明
- name
对URL进行命名,命名后可以在Django任意处——尤其是template中引用URL命名

Leave Comment