赵走x博客
网站访问量:151916
首页
书籍
软件
工具
古诗词
搜索
登录
17、部署 Django 项目
16、自动化测试
14、jQuery 和 Django
13、Webhose 搜索
12、集成 Bootstrap
11、使用 Django-Registration-Redux
10、cookie 和会话
9、用户身份验证
8、模板进阶
7、表单
6、模型、模板和视图
5、模型与数据库
4、模板和媒体文件
3、Django 基础
2、前期准备工作
1、导言
3、Django 基础
资源编号:76306
Tango with Django
Python Web
热度:74
下面开始学习 Django。本章介绍如何新建项目和 Web 应用,最终让一个 Django 驱动的简单网站 运行起来。
下面开始学习 Django。本章介绍如何新建项目和 Web 应用,最终让一个 Django 驱动的简单网站 运行起来。 # 3.1 检查环境 首先,我们要检查有没有正确安装 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 解释器。如果无法 导入 Django,确认你是不是在虚拟环境中, 再使用 pip list 命令查看安装的包。 >本书代码片段中有两种符号要注意。 以美元符号($)开头的代码片段,其后的内容是要在终端或命令提示符中运行的命令。 `>>>` 表示后面的命令要输入交互式 Python 解释器。解释器打开的方法是执行 python 命令, 退出方法是输入 exit()。 # 3.2 创建 Django 项目 进入 workspace 目录,执行下述命令,新建一个 Django 项目: ``` $ django-admin.py startproject tango_with_django_project ``` 如果你的电脑中没有 workspace 目录,那就创建一个,把 Django 项目和其他项目都保存在那里。 我们将在代码中使用
指代你的 workspace 目录。你要把
替换成 workspace 目录的具体路径,例如 /Users/leifos/Code/ 或 /Users/maxwelld90/Workspace/。 > 找不到 django-admin.py? 输入 django-admin 试试。根据采用的安装方式,有些系统可能无法识别 django-admin.py。 根据 Stack Overflow 中这个问答的建议,在 Windows 系统中可能要使用 django-admin.py 脚 本的完整路径,例如: ``` python c:\python27\scripts\django-admin.py startproject tango_with_django_project ``` 这个命令调用 django-admin.py 脚本,新建一个名为 tango_with_django_project 的 Django 项目。通 常,笔者喜欢在 Django 项目所在的目录名后面加上 _project,明确表明目录中是什么。不过,具 体怎么命名完全由你自己决定。 此时你会发现,你的 workspace 目录中出现了与项目同名的一个目录,即 tango_with_django_project。在这个目录中你会看到两个内容: ❏ 另一个与项目同名的目录 ❏ 一个 Python 脚本,名为 manage.py 在本书中,我们将把内部那个 tango_with_django_project 目录称为项目配置目录。在这个目录 中,你会看到 4 个 Python 脚本,下面简单介绍一下,后文再详细说明: ❏ __init__.py:一个空 Python 脚本,存在的目的是告诉 Python 解释器,这个目录是一个 Python 包; ❏ settings.py:存放 Django 项目的所有设置; ❏ urls.py:存放项目的 URL 模式; ❏ wsgi.py:用于运行开发服务器和把项目部署到生产环境的一个 Python 脚本。 项目目录中有个名为 manage.py 的文件,在开发过程中时常用到。它提供了一系列维护 Django 项 目的命令,例如通过它可以运行内置的 Django 开发服务器,可以测试应用,还可以运行多个数据 库命令。几乎每个 Django 命令都要调用这个脚本。 >Django 管理脚本的详细说明参见 [Django 文档](https://docs.djangoproject.com/en/1.9/ref/django-admin/#django-admin-py-and-manage-py "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 开发服务器的地址。 打开 Web 浏览器,输入 URL http://127.0.0.1:8000/ 。你将看到类似图 3-1 的网页。  图 3-1:首次运行 Django 开发服务器时看到的页面 开发服务器随时可以停止,只需在终端或命令提示符窗口中按 CTRL+C 键。如果想在其他端口上运 行开发服务器,或者允许其他设备访问,可以提供可选的参数。例如下述命令: ``` $ python manage.py runserver
:5555 ``` 这个命令强制开发服务器在 TCP 端口 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://
:
`访问你的应用。当然,这要看你的网络是怎么配置的,可能要设置代理服务器或防 火墙。如果无法远程访问开发服务器,请向网络管理员寻求帮助。 # 3.3 创建 Django 应用 一个 Django 项目中包含一系列配置和应用,这些在一起共同构成一个完整的 Web 应用或网站。 这样做便于运用优秀的软件工程实践。把一个 Web 应用分解为多个小应用的好处是,可以把那些 小应用放到别的 Django 项目中,无需做多少改动就能使用。 一个 Django 应用完成一件特殊的任务。一个网站需要多少应用,要视其功能而定。例如,一个项 目中可能包含一个投票应用、一个注册应用和一个与内容有关的应用。在另一个项目中,我们可 能想复用投票和注册应用,因此可以把它们拿过来用。稍后再详细说明。下面创建 Rango 应用。 在 Django 项目所在的目录(例如
/tango_with_django_project)中执行下述命令: ``` $ python manage.py startapp rango ``` startapp 目录在项目的根目录中创建一个新目录,你可能猜到了,这个目录名为 rango,其中包 含一些 Python 脚本: ❏ __init__.py:与前面那个的作用完全一样; ❏ admin.py:注册模型,让 Django 为你创建管理界面; ❏ apps.py:当前应用的配置; ❏ models.py:存放应用的数据模型,即数据的实体及其之间的关系; ❏ tests.py:存放测试应用代码的函数; ❏ views.py:存放处理请求并返回响应的函数; ❏ migrations 目录:存放与模型有关的数据库信息。 views.py 和 models.py 是任何应用中都有的两个文件,是 Django 所采用的设计模式(即“模型-视图 -模板”模式)的主要部分。如果想深入了解模型、视图和模板之间的关系,请阅读 [Django 文档](https://docs.djangoproject.com/en/1.9/intro/overview/ "Django 文档")。 在动手创建模型和视图之前,必须告诉 Django 项目这个新应用的存在。为此,要修改项目配置目 录中的 settings.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' ] ``` 再次运行开发服务器,确认 Django 识别了这个新应用。如果能正常启动开发服务器,没有任何错 误,说明新应用已经成功识别,可以进入下一步了。 >startapp 的自动操作 使用 python manage.py startapp 命令创建应用时,Django 可能会把新应用的名称自动添加 到 settings.py 中的 INSTALLED_APPS 列表里。尽管如此,在继续之前自己再检查一下也没什么 错。 # 3.4 编写视图 创建好 Rango 应用后,下面编写一个简单的视图。这是我们编写的第一个视图,简单起见,暂不使用模型或模板,而是把一些文本发回给客户端。 在你选择的 IDE 中打开新建的 rango 目录里的 views.py 文件。把 # Create your views here 这行 注释删掉,得到一个空文件。 然后,写入下述代码: ``` from django.http rimport HttpResponse def index(request): return HttpResponse("Rango says hey there partner!") ``` 下面分析一下这三行代码,看这个简单的视图是如何运作的: ❏ 首先,从 django.http 模块中导入 HttpResponse 对象。 ❏ 在 views.py 文件中,一个函数就是一个视图。这里我们只编写了一个视图,即 index。 ❏ 视图函数至少有一个参数,即一个 HttpRequest 对象,它也在 django.http 模块中。按约 定,这个参数名为 request,不过你可以根据自己的意愿随意使用其他名称。 ❏ 视图必须返回一个 HttpResponse 对象。简单的 HttpResponse 对象的参数是一个字符串,表 示要发给客户端的页面内容。 有了视图还不行,为了让用户能访问视图,要把一个统一资源定位地址(Uniform Resource Locator,URL)映射到视图上。 为此,打开项目配置目录中的 urls.py 文件,在 urlpatterns 中添加一行代码: ``` from rango import views urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^admin/', admin.site.urls), ] ``` 新加的那行代码把根 URL 映射到 rango 应用的 index 视图上。启动开发服务器(python manage.py runserver),访问 http://127.0.0.1:8000 或你指定的其他地址。你将看到 index 视图渲 染的输出。 # 3.5 映射 URL 为了提升模块化程度,我们可以换种方式把入站 URL 映射到视图上,而不直接在项目层设置。首 先,要修改项目的 urls.py 文件,把针对 Rango 应用的请求交给 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')), # 上面的映射把以 rango/ 开头的 URL 交给 rango 应用处理 url(r'^admin/', admin.site.urls), ] ``` 可以看出,urlpatterns 是个 Python 列表。新增的映射寻找能匹配 ^rango/ 模式的 URL。遇到这 样的 URL 时,rango/ 后面的部分传给 Rango,由 rango.urls 处理。这一步是通过 django.conf.urls 模块中的 include() 函数实现的。 这是一种分段处理 URL 字符串的方式,如图 3-2 所示。这里,完整的 URL 先去掉域名,余下的 部分(rango/)传给 tango_with_django 项目,找到匹配的映射后,再把 rango/ 去掉,把空字符串 传给 rango 应用处理。  图 3-2:分段处理 URL,域名后的不同的部分由不同的 url.py 文件处理 根据上述设置,我们要在 rango 应用的目录中新建 urls.py 文件,让它处理余下的 URL(即把空字 符串映射到 index 视图上): ``` from django.conf.urls import url from rango import views urlpatterns = [ url(r'^$', views.index, name='index'), ] ``` 这段代码先导入 Django 处理 URL 映射的函数和 Rango 应用的 views 模块,然后在 urlpatterns 列表中调用 url 函数映射 index 视图。 本书所指的 URL 字符串,都是去掉主机地址后的部分。主机地址是指向 Web 服务器的地址或域 名,例如 http://127.0.0.1:8000 或 http://www.tangowithdjango-china.com 。去掉主机地址后,Django 便只需处理 URL 中余下的部分。例如,对 http://127.0.0.1:8000/rango/about/ 这个 URL 来说, Django 得到的 URL 字符串是 /rango/about/。 上述代码中的 URL 映射调用 Django 的 url() 函数,其第一个参数是正则表达式 ^$。这个正则表 达式匹配空字符串,因为 ^ 表示开头,$ 表示结尾,而且二者之间没有任何内容,所以只能匹配 空字符串。用户访问的 URL,只要匹配这个模式,Django 就会调用 views.index() 视图。你可能 觉得匹配空 URL 没有什么意义,那为什么要这样做呢?还记得吗,匹配 URL 模式时,只会考虑 原 URL 的一部分。Django 先使用项目的 URL 模式处理 URL 字符串(rango/),去掉 rango/ 部 分之后得到空字符。然后把空字符串传给 Rango 应用,交给 rango/urls.py 中的 URL 模式处理。 传给 url() 函数的下一个参数是 index 视图,指明处理入站请求的函数。后面的 name 参数是可选 的,这里把它设为字符串 'index'。为 URL 命名的目的是反向解析 URL,即通过名称引用 URL 映射,而不直接使用 URL。讲到模板时再说明这一点。如果想深入了解这个话题,请阅读 Django 文档。 现在,重启 Django 开发服务器,然后访问 http://127.0.0.1:8000/rango/ 。如果一切正常,你应该能 看到文本“Rango says hey there partner!”,如图 3-3 所示。  图 3-3:Web 浏览器中显示着首个由 Django 驱动的网页 每个应用中都可以有一些 URL 映射。一开始,URL 映射十分简单,不过随着开发的深入,我们 将添加更多复杂的参数化 URL 映射。 你要理解 Django 处理 URL 的方式。现在你可能还有点迷糊,不过用得多了,终究会明白的。如果想深入了解 URL 映射,想看更多的示例,请阅读 [Django 文档](https://docs.djangoproject.com/en/1.9/topics/http/urls/ "Django 文档")。 >正则表达式 Django 的 URL 模式使用正则表达式匹配 URL,因此你要熟练使用 Python 的正则表达式。 Python 官方文档中有一篇关于[正则表达式的指南](https://docs.python.org/2/howto/regex.html "正则表达式的指南"),此外也可以查看 [Regex Cheat Sheet 网站](http://regexcheatsheet.com/ "Regex Cheat Sheet 网站")中 的速查表。 # 3.6 基本流程 本章内容可以总结为一系列操作。这一节给出我们所执行的两个任务的操作步骤。如果以后记不 得了,可以随时翻阅。 ### 创建 Django 项目项目 ➊ 执行 python django-admin.py startproject
命令,其中
是想创建的项目名称。 ### 创建 Django 应用 ➊ 执行 python manage.py startapp
命令,其中
是想创建的应用名称。 ➋ 把应用名称添加到项目配置目录中的 settings.py 文件里,放到 INSTALLED_APPS 列表的末 尾,告诉 Django 项目这个应用的存在。 ➌ 在项目的 urls.py 文件中添加一个映射,指向新建的应用。 ➍ 在应用的目录中新建 urls.py 文件,把入站 URL 与视图对应起来。 ➎ 在应用的 view.py 文件中编写所需的视图,确保视图返回一个 HttpResponse 对象。