Django基础
在这个章节中,我们将会给出一个创建过程的整体描述,你将会创建一个新的项目和应用。在章节的最后,你将有一个简单的用django搭建的网站。
检查开发环境
让我们先开始检查下你安装的python和django是否符合这本书的要求,所以你需要打开命令窗口并输入以下命令,这将会告诉你用的python是什么版本。
$ python --version
输出结果应该是2.7.11或者3.5.1,当然2.7.5+或者3.4+版本都能用。如果你需要升级或者安装python,请查看设置系统章节。
如果你要使用虚拟环境,确保已经启用它了,如果你不记得了回到虚拟环境章节查阅一下。python版本验证后,再检查下django的版本。在你的终端窗口,通过输入下面的命令来运行python解释器。
$ python
Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
根据提示,输入以下命令:
>>> import django
>>> django.get_version()
'1.9.10'
>>> exit()
如果运行成功的话,你会看到django的版本,然后使用exit()
退出python解释器。如果import django
导入失败,检查一下你的虚拟环境,在你终端输入pip list
来看一下安装了哪些包。如果你安装过程出现问题或者想安装其它版本的包,查阅系统配置章节或者咨询一下django官方文档如何安装django的。
提示
当我们描述代码片段时,有两个问题需要留意下。
代码段以美元符($)开始表示这一行是终端或命令提示符;无论你什么时候看见>>>,接下来的命令应该在python解释器里输入,通过输入$ python
启动python解释器,你也可以在python解释器里输入quit()
来退出python。
创建Django项目
首先在终端里切换到你的工作目录,并输入以下命令:
$ django-admin.py startproject tango_with_django_project
如果你还没有工作目录,创建一个,这样你就可以把你的django项目或者其它项目代码放到这个目录里了,我们会将你的工作目录作为代码运行的当前目录。你必须把路径替换为你的工作目录,例如:/Users/leifos/Code/
或者/Users/maxwelld90/Workspace/
。
找不到django-admin.py?
输入django-admin试一试,这得根据你的系统配置情况,有些系统可能不识别django-admin.py。但是在windows下,你可能需要使用绝对路径运行,例如:
python c:\python27\scripts\django-admin.py startproject tango_with_django_project
这个命令将会使用django-admin.py脚本来创建一个新的名叫tango_with_django_project
的django项目,我们一般会在django项目名称后面添加_project
,这样我们就能准确知道目录包含了什么。当然命名规则完全取决于你自己。
现在你会看到你的工作环境下新建了一个以你项目名称命名的目录。在这个新创建的目录里,你应该能看到以下两项:
- 另一个与你项目名称一样的目录,
tango_with_django_project
- python脚本名为mange.py
根据这本书的目的,我们把这个tango_with_django_project
目录称为项目配置目录。在这个目录里,你会看到四个python脚本,我们稍后会详细讨论这些脚本。但是现在你应该能看到:
__init__.py
,这是一个空的python文件,它的存在就是让python解释器知道这个目录是一个python包;setting.py
,存储你django项目配置的地方;urls.py
,项目里存储URL模式的脚本;wsgi.py
,用来帮助你的项目运行在你开发服务器上和部署到生产环境上的脚本。
在项目目录下,你能看到一个叫manage.py
的文件,在我们开发的过程中,我们会经常调用它,它提供了许多命令来维护的你项目。比如,manage.py
能够运行一个内置的django开发服务器,能够调试你的应用,还能够运行很多数据库命令。每次我们在使用django命令时,实际上我们都在调用这个脚本。
django管理模块
想要了解更多关于django管理模块的信息,请查看管理章节获取更详细的内容。
输入python manage.py help
可以查看可使用命令清单
现在你可以使用manage.py
来运行以下命令:
$ python manage.py runserver
执行这条命令会使python去指示django初始化一个轻量级的开发服务器。在你的终端上应该能看到类似于下面的输出:
$ 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.
October 2, 2016 - 21:45:32
Django version 1.9.10, using settings 'tango_with_django_project.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
在上面的输出里,你可以看到很多东西。首先,运行没有问题;其次你应该注意出现了一个警告,即迁移命令还没操作。我们在配置数据库的时候会讨论它,但是现在暂时不考虑它;第三点也是最终要的一点,你可以看到输出内容给出了一个URL:http://127.0.0.1:8000/
,这个地址就是django开发服务器地址。
现在打开浏览器并输入上面的地址,你应该能看到类似于下面的页面。
你随时可以在你的终端或者命令行窗口按下
CTRL + C
来停止你的开发服务器。如果你想以不同的端口运行服务器,或者希望其他主机也能访问,你可以使用如下命令:
$ python manage.py runserver <your_machines_ip_address>:5555
执行这条命令会让你的开发服务器对端口5555进来的请求作出反馈。你需要将替换成你主机的IP地址或者127.0.0.1。
不知道IP地址?
如果你使用0.0.0.0,django会自动解析你的IP地址,试试如下命令:
python manage.py runserver 0.0.0.0:5555
设置端口时,你应该没法将端口设置成80或者8080,因为这些端口一般都是留给HTTP协议使用。还有低于1024的端口通常都是留给操作系统使用的。
你不应该使用你的开发服务器来部署你的应用,但是用来通过其它主机来演示你的应用是很不错的,使用你的主机IP来运行开发服务器能够让其他人在浏览器输入http://<your_machines_ip_address>:<port>/
来访问你的应用,当然这还需要网络相通。如果有代理服务器或者防火墙的话,可能需要配置一下才能访问,如果你无法访问,请联系一下网络管理员。
创建一个django应用
一个django项目是将所有的配置和应用收集在一起组合成一个网站,使用这种方法的预期成果之一就是促进优秀的软件工程实践。这种方法的思想就是开发出一系列的小应用,并将这些应用以最少的精力移植到不同的django项目中。
一个django应用一般用来执行特别的任务,你需要创建特定的应用专门负责为你的网站提供相对应的功能。举个例子,我们可以假设一下,一个django项目由几个应用组成,包括一个投票应用、注册应用和一个具体与项目内容有关的应用。在另外一个django项目里,我们想重用投票应用和注册应用,我们就可以把它们包含在其它项目里。这个内容我们稍后讨论,现在我们先为Tang应用创建一个应用。
首先你需要进入django项目的目录(比如:<workspace>/tango_with_django_project
)并运行以下命令:
$ python manage.py startapp rango
startapp
命令在你的项目根下创建了一个新目录,这个目录当然命名为rango,目录下包含了以下几个python脚本:
- 另一个
__init__.py
,用途跟之前讨论的一样; admin.py
,注册你模型的地方,得益于django的机制自动为你创建管理界面;app.py
,提供一个应用详细配置的地方;models.py
,存储你应用数据模型的地方,在这里你可以指定数据类和数据关系;test.py
,你可以存放一些函数来测试你的代码;views.py
,存放了一系列的函数来处理request请求并返回response;migrations
目录,存放了数据库中与你模型相关的具体信息。
views.py和models.py这两个文件在任何应用中都要用到,也是django架构设计模式的组成部分,即模型-视图-模板模式。你可以在django官方文档上查阅到更详细的关于这三者之间的信息。
在你开始创建自己的模型和视图之前,你必须要告诉你的django项目你新建应用的存在,所以你需要修改放在项目配置目录里的setting.py文件。打开文件并找到INSTALLED_APPS
项,将rango应用添加到这个列表的结尾,如下所示:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rango',
]
重新运行开发服务器来检查你的应用是否被找到,如果运行没有报错,那么就表示你的应用找到了,这样你就可以开始下一步了。
startapp 魔法
当你用python manage.py startapp
命令创建了一个应用后,django会自动将应用名加到settings.py的INSTALLED_APPS列表中,不过你最好还是自己检查一下配置是否正确(译者测试,pycharm不会自动添加)。
创建视图
rango应用已经建立了,现在让我们创建一个简单的视图。我们的第一个视图只是简单的返回一些文本到客户端,我们暂时先不考虑使用模型和模板。
用你最喜欢的IDE,打开文件views.py,文件位于rango应用目录下,删除注释并添加以下代码:
from django.http import HttpResponse
def index(request):
return HttpResponse("Rango says hey there partner!")
把这三行拆开来观察一下如何创建一个视图的:
- 首先我们从
django.http
导入了HttpResponse
对象; - views.py文件里的每个view都有一系列各自的函数。在这个实例中,我们只创建了一个叫index的视图;
- 每个视图里至少要有一个
HttpRequest
对象的参数,此对象也定义在django.http
模块里。我们一般都会起名为request,但是你可以根据你需要重新命名。 - 每个视图必须要返回一个
HttpResponse
对象。一个简单的HttpResponse
有一个字符串参数,存储着我们想要返回给请求客户端的页面内容。
视图创建好后,接下来就是让用户访问了。为了让用户能访问到你的视图,你必须要为你的视图映射一个URL。
打开位于你项目目录的urls.py文件,增加如下代码到urlpattern
中:
from rango import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^admin/', admin.site.urls),
]
这里将主URL映射到rango应用里的index视图,运行开发服务器,并访问http://127.0.0.1:8000
或者你开发服务器运行的地址,你将会看到经过渲染的index视图的输出。
URL映射
我们可以修改应用视图的URL路由是应用更加模块化(方便重用),这样就不能在项目urls.py里将URL直接映射到具体应用的视图了。所以我们首先要修改项目urls.py,让它指向应用的urls.py来处理具体的rango应用请求。然后我们再具体指定rango是如何处理这些请求的。
首先,打开位于项目配置目录里的文件urls.py,文件路径应该是<workspace>/tango_with_django_project/tango_with_django_project/urls.py
,如下所示,更新urlpatterns
列表:
from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include
from rango import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^rango/', include('rango.urls')),
# above maps any URLs starting
# with rango/ to be handled by
# the rango application
url(r'^admin/', admin.site.urls),
]
你也许注意到urlpatterns其实就是python的列表,这是django框架设计的。增加的这条映射会寻找匹配ˆrango/
的字符串,当匹配成功后,URL剩下的字符串会通过由django.conf.urls
里的函数include()
传递给rango.urls来处理。
把处理URL字符串的过程想像成一条链路,如下图的插画所示。在这条链路中,主域名首先被剥离,URL字符串的剩余部分(rango/)被传递到tango_with_django
项目,在这里找到匹配项后将rango/再剥离掉,最后留下一个空的字符串传递给rango应用处理。
URL插图,表示成一条链路,说明了URL不同的部分由不同的urls.py文件负责解析。
因此,我们需要在rango应用目录中创建一个新的名为urls.py的文件,去处理生下来的URL(这里就是将空的字符串映射给index视图)
from django.conf.urls import url
from rango import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
这段代码导入了用来处理URL映射的django模块和rango的视图模块。这样我们就能调用函数url并为index视图指定一个url了。
当我们讨论URL字符串的时候,我们就假设给定的URL的主机地址部分已经被剔除了。一个URL的主机地址部分表示映射了一个web服务器的主机地址或者域名,比如http://127.0.0.1:8000
或者http://www.tangowithdjango.com
。将主机地址剔除表示django只需要处理剩下的URL字符串。比如说一个URL字符串:http://127.0.0.1:8000/rango/about/
,django将只会处理/rango/about/
。
我们在上面创建的URL映射调用了djanog的url函数,这个函数的第一个参数是一个正则表达式^$
,这个正则表达式会匹配任何空的字符串,因为^表示以什么开头,$表示以什么结尾。由于在这两个字符直接什么也没有,那就只能匹配空字符串了。一旦用户给出的URL匹配这个表达式,那么django就会调用视图函数views.index()
。你可能会觉得匹配空的字符串没什么意义。记住当URL匹配发生时,初始URL字符串只有一部分被处理。这是因为django首先会使用项目里的URL模式去处理初始的URL字符串(即:rango/),然后剔除rango/部分,再将剩下的空字符串传递给rango的urls.py里的URL模式来处理。
第二个传递给url函数的参数是视图index,这个视图处理进来的请求。最后还有一个可选的参数name,值被设置为字符串index。将URL映射命名,这样我们在以后可以利用名称获得url。这样我们就能通过名称来引用URL映射而不是URL。稍后我们在创建模板时会解释如何使用这个功能。但是关于这个论题你自己还是通过django官方文档获取更详细的信息。
现在重启你的开发服务器,访问http://127.0.0.1:8000/rango/
。如果一切顺利的话,你应该能看到文本Rango says hey there partner!
,如下截图所示。
一个web浏览器的截图,显示了我们第一个django应用运行的页面,Hello rango!
在你的每一个应用里都要创建一些URL映射。一开始映射关系很简单,但是随着我们对这本书学习的深入,我们将会创建更加复杂的、参数化的URL映射。
掌握好django如何处理URL的是很重要的。你现在可能有点困惑,但是随着我们对这本书学习的深入,你会创建越来越多的URL映射,那时你也会成为一个专家了。如果你想深入学习URL,查阅djano官方文档获得更详细的信息和例子。
注意正则表达式
django的URL模式使用正则表达式来执行匹配,花点时间让自己熟悉如何使用正则表达式是非常值得的。python官方文档提供了一个很有用的正则表达式使用向导。regexcheatsheet.com
也提供了一个简洁的正则表达式总结。
如果你使用了版本控制软件,现在就可以把你修改的信息提交到你的工作区。如果你不记得相应的命令和步骤,请查阅Git速成章节。
基本工作流
在这章中你所学习的东西可以简单总结为以个操作列表,这里我们为这个列表提供了两个不同的你需要完成的任务。如果你以后忘了这些操作,你可以把这块作为一个快速参考。
创建一个新的django项目
1.运行命令python django-admin.py startproject <name>
,这里name为项目名称。
创建一个新的django应用
1.运行命令$ python manage.py startapp <appname>
,这里appname为应用名称。
2.在项目配置文件settings.py里的INSTALLED_APPS列表里,将新创建的应用添加进去。
3.在你的项目urls.py文件里,添加一个到应用的映射。
4.在你的应用目录里,创建一个urls.py文件并将url字符串映射到视图中去。
5.在你应用的views.py里,创建需要的视图并确保返回一个HttpResponse
对象。
练习
现在你已经能让你的应用顺利运行起来了,接下来我们给出下面的练习来巩固你的学习内容。学习django到达这个阶段具有里程碑式的意义。创建视图并将URL映射视图是朝着开发出越来越复杂、越来越有用的应用迈出的第一步。
- 复习学习过的内容,确保你已经掌握了如何将URL映射到views。
- 创建一个新的名叫about的视图函数,并返回一个包含
'Rango says here is the about page.'
文本的HttpResponse对象。 - 将这个视图映射到
/rango/about/
,这个步骤只需要你编辑rango的urls.py文件。记住/rango/
部分已经被项目的urls.py处理了。 - 重新编写index视图的HttpResponse返回对象,使其包含一个到about页面的链接。
- 在about视图里返回的HttpResponse对象包含一个返回到主页面的链接。
- 既然你开始学习这本书,那就关注我们的twitter@tangowithdjango,让我们知道你正在努力学习!
提示
如果你确实搞不定上面的练习,下面的一些提示会给你一些提示帮助你完成联系。
- 在rango的views.py文件里,创建一个函数叫
def about(request):
,让这个函数返回HttpResponse(),并将你的HTML代码插入到返回结果中。 - 匹配
about/
的正则表达式是r'^about/$'
,所以在rango/urls.py里增加一条新的映射到你的about()视图。 - 更新你的视图函数index(),使其包含指向about视图的链接,比如可以这样写:
Rango says hey there partner! <br/> <a
href='/rango/about/'>About</a> - 同样的在about()视图函数的返回对象里添加一条HTML代码用于返回到主页,可以这样写:
<a href="/rango/">Index</a>
- 如果你现在还是无法完成上面的练习,那你现在得先停下来去学习下django的官方文档了。