Django1.11版本的官方教程翻译。
让我们一起通过一个例子学习Django。
通过这个教程,我会带着你们手把手教你完成一个基础的民意调查web应用。
这个应用包括两个部分:
- 一个公共站点,让人们浏览投票情况,并投出自己的一票
- 一个管理站点,让你添加,修改,删除投票
我们假设你已经安装好了Django。你可以在通过一条命令行指令看看自己是否已经安装Django以及是什么版本的Django。
python -m django --version
如果Django已经安装,你会看到你安装的版本的版本号。如果没有,你会得到一条警告写到"No module named django"。
这个教程基于Django 1.11和Python 3.4及以后。如果Django版本不匹配,你可以去官方网站查看你的版本的对应教程,或者把你的Django更新到最新版本(译者注:1.11应该是Django1.x版本的最后一个长期支持版本)。如果你还在使用Python 2.7,你得稍微修改修改教程内的代码。(译者注:Python 3.x已经是主流了,并且一定是日后的主流,尽早使用没毛病。)
关于安装和更新Django请查看如何安装Django。
创建你的第一个项目
如果这是你第一次使用Django,你得注意一些开始步骤。也就是说,你需要自动运行一些用来创建Django项目的代码,一个Django示例的设置合集,包括database configuration(数据库配置),Django-specific Options(Django选项)和application-specific settings(应用设置)。
从命令行使用cd
进入你想要保存你的代码的目录,然后运行以下命令:
django-admin startproject mysite
这条命令会在当前目录中创建一个mysite目录。如果这没有用,请查看使用Django的那些问题。
注意:你不能使用一些Python和Django内置的元素名来命名你的Django项目。比如你不应该使用像Django或者test这样的名字来命名自己的项目。
这个代码应该放在哪?
把任何Python代码放在你的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查看所有的相关细节。
-里面的mysite/
目录是你项目真正的Python包。你会需要用这个名字来import里面的东西。(比如 mysite.urls)
-mysite/__init__.py
:一个空的文件,告诉Python这整个目录应该被看做一个Python包,如果你对Python也是个新手,可以去查看Python官方文档。
-mysite/settings.py
:关于这个Django项目的配置。可以点击后面的链接查看细节。Django settings
-mysite/urls.py
:这个Django项目的URL声明。一个你的Django站点的目录。你可以查看官方文档查看更多细节URL dispatcher
-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. April 04, 2017 - 15:50:53Django version 1.11, using settings 'mysite.settings'Starting development server at [http://127.0.0.1:8000/](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/。
你会看到一个舒服的浅蓝色的Django欢迎页面。我们成功了!
更换借口
默认情况下,会在内部IP的8000端口启动开发服务器。
如果你想更换服务器端口,请通过命令行传递参数。比如使用8080端口
python manage.py runserver 8080
如果你想改变服务器IP,请将其和端口一起传递。例如,要监听所有可用的公共IP(如果你在使用Vagrant或者想炫耀你的工作),请使用:
python manage.py runserver 0:8000
0是0.0.0.0的快捷方式。开发服务器的完整文档可以在runserver参考中找到。
自动重新加载服务器
开发服务器根据需要自动为每个请求重新加载Python代码。你不需要重新启动服务器以使代码更改生效。但是,一些操作(如添加文件)不会触发重新启动,因此在这些情况下您必须重新启动服务器。
创建投票Web应用
现在,你的环境 - 一个“项目” - 已经建立起来,你已经可以真正开始工作了。
你在Django中编写的每个应用程序都包含了一个遵循一定约定的Python包。 Django自带一个实用程序,可以帮助你自动生成应用程序的基本目录结构,因此您可以专注于编写代码而不是不停的创建目录。
项目project和应用App?
这两个的区别是什么?
一个app是一个用于实现某个功能的Web应用,比如,一个网络博客系统,一个公共记录数据库,或是一个简单的投票应用。
一个project是为了一个网站的一系列的配置和应用的集合。
一个project可以保护多个app。
一个app可以存在于多个project里。
你的应用程序可以存在于Python路径的任何位置。在本教程中,我们会在manage.py的旁边建立这个投票应用,这样它就可以作为这个项目的顶级模块,而不是一个简单的子模块。
为了创建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
这个文件,然后写入下面的Python代码。
from django.http import HttpResponse
def index(request): return HttpResponse("Hello, world. You're at the polls index.")
这应该是Django中最简单的视图了。为了调用它,我们需要将它映射到一个URL,因此我们需要一个URLconf。
我们应该在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
,并且将我们的polls.urls
加入urlpatterns
。
你的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()
函数允许引用其他URLconf。请注意,include()
函数的正则表达式不具有$(字符串结尾匹配字符),而是尾部斜线。每当Django遇到include()
时,它会排除与该点匹配的任何部分,并将剩余的字符串发送到包含的URLconf进行进一步处理。
include()
的背后的想法是URL可以即插即用。由于民意调查是在自己的URLconf(polls / urls.py
)中,它们可以放在“/ polls /”下或“/ fun_polls /”下或“/ content / polls /”或其他路径根目录下,应用程序仍然可以工作。
什么时候使用include()
当你想要导入其他的URL时,请使用include()。admin.site.urls
是唯一的例外。
你看到的和教程里的不太一样?
如果你在你的文件里看到了include(admin.site.urls)
而不是admin.site.urls
应该是你使用了的Django版本不是1.11,而是其他的。
你已经将索引视图连接到了URLconf中。让我们来检验一下工作吧。输入以下命令行命令。
python manage.py runserver
用你的浏览器去 http://localhost.8000/polls/ ,然后你应该会看到
“Hello, world. You’re at the polls index.”
这是你的index view里定义的。
url()
函数传递四个参数,regex
和view
是必须的,kwargs
和name
是可选的。我大概介绍一下他们的作用。
-
regex
参数
regex
是regular expression(正则表达式)
的常用的简写。它是用于匹配字符串中的模式的语法,或者在这个例子中,用来匹配url的模式。Django从第一个正则表达式开始,并将其放在列表中,将请求的URL和每一个正则表达式比对,选出匹配的。
请注意,这些正则表达式不搜索GET和POST参数或域名。例如,在https://www.example.com/myapp/
的请求中,URLconf将寻找myapp/
。在https://www.example.com/myapp/?page=3
的请求中,URLconf还将查找myapp/
。
如果不太明白正则表达式,请参阅维基百科的条目或者re模块的文档。此外O’Reilly系列书中的《掌握正则表达式》也非常棒。实际操作中,你并不需要成为正则表达式的专家,因为您只需要知道如何捕获简单的模式。实际上,复杂的正则表达式的查找性能会很差,所以你可能不应该依靠正则表达式的全部功能。
最后,一个有关性能的说明:这些正则表达式是第一次加载URLconf模块时会被编译。因此它们超级快(只要查找不是太复杂)。
2.view
参数
当Django找到了一个正则表达式进行匹配时,Django会调用指定的视图函数,使用HttpRequest
作为第一个参数,并且将正则表达式中捕获的值作为其他参数。如果正则表达式 使用简单的捕获值,则值作为位置参数传递;如果使用命名捕获,则值作为关键字参数传递。稍后会给出例子解释。
-
kwargs
参数
任意关键词参数(keyword arguments)可以在字典中传递到目标视图。我们不会在教程中使用Django的这个功能。
4.name
参数
命名你的URL,方便你在Django的其他地方明确的引用他,特别是模版中。这个强大的功能可以让你全面更改项目的URL模式,而且只接触一个文件。
如果这章基本明白了,请开始本教程的第二部分,开始学习数据库相关的知识。