让我们开始运用Django。本章主要是给你一个关于创建新项目和新应用过程的概览。在本章的末尾,你将建立起一个简单的由Django驱动的网站。
3.1 配置测试
让我们测试以下你的Python和Django安装是否满足本教程的要求。首先,打开新的命令行窗口并输入以下命令,查看安装的Python版本。
$ python --version
显示的python版本应该是2.7.5+ 或者 3.4+。
如果使用虚拟环境,记得先激活它。
接下来检查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
指令查看该环境下安装了哪些包。
如果在安装Django的过程中遇到了苦难,或者安装了不同版本,可以参考系统设置章节或者官方文档中的安装指南 。
提示
在本书中,你需要留意代码片段中包含的两个东西。
以美元符号($)开头的代码,表示这是命令行指令。
以>>>开头的代码,是需要输入到Python解释器的。
$ python
或$ py
可以启动解释器。退出解释器的命令是exit()
或者quit()
。
3.2 创建Django项目
进入你的工作区目录,发布以下指令:
$ django-admin.py startproject tango_with_django_project
如果还没有工作区目录,可以建立一个,这样你可以把你的Django项目和其他代码项目存放在这个目录中。我们将用<workspace>
引用你的工作区目录,你需要将它转换成自己实际的目录,比如 /Users/leifos/Code/ 或者 /Users/maxwelld90/Workspace/。
找不到 django-admin.py?
试试输入django-admin 看看。根据你的设置,有些系统可能不认识 django-admin.py。
对于Windows,你可能必须输入django-admin.py的完整路径,比如:
python c:python27scriptsdjango-admin.py startproject tango_with_django_project
这个命令将调用django-admin.py文件,为你创建一个叫做 tango_with_django_project 的项目。通常,我们在Django项目目录后面加上后缀_project,使之意义明确。当然,具体怎么命名你自己说了算。
你会在工作区中看到一个新建的 tango_with_django_project 目录。在这个新目录中,有两样东西:
- 另一个跟项目同名的目录 tango_with_django_project;
- 一个叫做 manage.py 的Python文件。
我们将这个嵌入的tango_with_django_project目录称为项目配置目录。在这个目录中,你可以看到四个Python文件。稍后我们会具体讨论这些文件,现在先了解一下:
- _init_.py,一个空白的Python文件,用来告诉解释器该目录是一个Python包;
- settings.py,储存所有Django项目设置的地方;
- urls.py,储存项目URL模式的Python文件;
- wsgi.py,用于运行开发服务器和将你的项目部署到生成环境。
在项目目录中,还有另外一个文件manage.py。我们在开发项目的过程中将总要调用它。它提供了一系列让你可以维护你的Django项目的指令。比如,manage.py 允许你运行Django内建的开发服务器,测试你的应用程序,运行各种数据库指令等。事实上,我们想运行的大多数Django命令,基本都会用到这个文件。
Django Admin 和 Manage
如果想要深入了解Django admin文件,可以参考官方文档的Admin and Manage scripts。
运行
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.
在输出信息中,我们可以看到很多东西。首先,没有问题阻碍程序运行。第二,有一个警告信息,unapplied migrations
未实施的数据迁移。我们将在设置数据库章节深入讨论它,现在暂时忽略。第三,最重要的一点,Django开发服务器的地址被指定为URL http://127.0.0.1:8000/ 。
现在,打开你的网页浏览器然后输入地址http://127.0.0.1:8000/ ,看到的应该是类似下面的情况:
![ch3-django-powered-page](E:Python3 Learningooks ango_with_django_19-master ango_with_django_19-mastermanuscriptimagesch3-django-powered-page.png)
你可以随时通过在命令行窗口中输入 CTRL+C 命令来停止开发服务器。如果你希望在不同的端口上运行开发服务器,或者允许用户从其他机器上访问,你可以通过设置一些可选参数来达成。例如下面的命令:
$ python manage.py runserver <your_machines_ip_address>:5555
执行这条命令将使开发服务器回应TCP端口5555上的请求。你需要把<your_machines_ip_address>替换成你自己电脑的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_machine_ip_address>:<port>/就可以浏览你的网站。当然,这还涉及到你所在网络的具体设置。可能有代理服务器或者防火墙需要配置。如果你不能远程浏览你的网站,请与你的网络管理员联系确认。
3.3 建立Django App
每个Django项目是组成特定网络应用或网站的一些配置文件和app的集合。通过开发一些app,然后可以将其复用到不同的项目中,只造成很小的影响。这种方法很好的促进了软件工程化。
每个Django app有自己特定的任务。你需要建立一些为你的网站提供特定功能的app。比如,我们可以假设一个项目可能包括以下app:一个投票app,一个注册app,以及一个指定内容相关app。在另一个项目中,我们可能想复用投票和注册app,这样我们就可以把这两个app包括在第二个项目中。稍后我们详细讨论。眼下我们先建立一个Rango app。
首先,用命令行窗口在你的工作区目录中运行以下命令:
$ python manage.py startapp rango
startapp
命令在你的项目根目录中创建一个叫做rango的新目录,它包含以下Python文件:
- 又一个_init_.py,与前文讨论的功能一样;
- admin.py,在这里你可以注册你的模型,然后享受Django便利的管理界面;
- apps.py,所有app的具体配置;
- models.py,储存app数据模型;
- tests.py,储存app代码的测试函数;
- views.py,处理请求并响应;
- migrations 目录,模型的数据库具体信息;
views.py 和 models.py 在任何app中都要用到,并组成Django的主要建造设计模式,即 Model-View_template 模式。你可以参考官方文档,了解模型、视图和模板具体是怎么关联到一起的。
在开始建立你自己的模型和视图之前,你得先让你的Django项目知道新app的存在。这需要在项目配置目录中,修改settings.py文件。打开该文件,找到 INSTALLED_APPS元组。将rango app添加到元组的末尾,像下面这样:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rango',
]
重启开发服务器,如果没有出现错误,那么rango app已经纳入项目,你可以进入下一个步骤。
startapp魔法
当用
python manage.py startapp
命令创建新app时,Django可能会自动将app名称添加到setting.py文件中的 INSTALLED_APPS 列表中。尽管如此,在继续深入之前,检查一下看所有东西是否都设置正确是一个良好的做法。
3.4 建立视图
现在Rango app已经建立了,现在我们建立一个简单的视图。作为我们的第一个视图,我们不妨先只返回一些文本内容到客户端——暂时先不考虑使用模型和模板。
在你的IDE中,打开新建的rango app目录中的views.py文件。删除注释`# Create your views here.,这样你就有了一个空白文件。
现在你可以添加以下代码:
from django.http import HttpResponse
def index(request):
returen HttpResponse("Rango says hey there partner!")
分解这三行代码:
- 我们首先从django.http模块导入HttpResponse对象;
- views.py文件中的每个视图都是相互独立的函数。在这个实例中,我们只建立了一个视图,叫做index。
- 每个视图至少具有一个参数——一个HttpRequest对象。按照常规,这是一个已命名的请求,但是你可以按照自己的意愿重命名。
- 每个视图必须返回一个HttpResponse对象。一个简单的HttpResponse对象具有一个字符串参数,用于描述客户端请求的视图页面上下文。
当视图建立好以后,距离用户可以访问它还有其他步骤。为了让用户看到你的视图,你必须将一个Uniform Resurece Locator(URL)映射到该视图:
打开项目目录中的urls.py文件,键入以下urlpatterns代码,来建立一个入门级映射:
from rango import views
urlpatterns=[
url(r'^$',view.index,name='index'),
url(r'^admin/',admin.site.urls),
]
这将rango app的index视图映射到基础URL上。运行开发服务器,访问http://127.0.0.1:8000, 或你设置的其他开发服务器地址。你将看到index视图渲染过的输出页面。
3.5 映射URLs
除了将URLs直接从项目映射到app,我们可以通过改变视图的接入URL,将我们的app更加模块化(然后可以复用)。首先,我们需要修改项目的urls.py文件,将它指向Rango app来处理所有涉及Rango app的请求。然后我们需要指定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),
]
Django框架将urlpatterns设计成一个Python列表。添加的映射查找能匹配^rango/模式的URL字符串。当匹配成功后,该URL字符串的其他部分将通过include()函数(来自django.conf.urls)传递到rango.urls处理。
将这想象成一个访问URL字符串的URL链——如上面的URL链图。在这个链中,域名被去掉,URL字符串的其他部分(rango/)被传递到tango_with_django项目,然后找到匹配模式并去掉rango/,剩余一个空字符串传递到rango应用,供其操作。
接下来,我们需要在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的views模块。这使我们可以调用url函数,并将urlpatterns中的映射指向index视图。
当我们谈论URL字符串时,我们认为给出的URL主机部分已经被去掉了。URL主机部分表示映射到网络服务器的主机地址或者域名,比如http://127.0.0.1:8000 或者 http://www.tangwithdjango.com。去掉主机部分意为着Django组件只需要处理剩余的URL字符串。举个例子,给出的URL为http://127.0.0.1:8000/rango/about/,Django得到的URL字符串为 /rango/about/。
我们创建的URL映射调用Django的url()函数,其中第一个参数是正则表达式 ^$
,它匹配的是空字符串。因为^
表示字符串开头,$
表示字符串结尾,首尾之间没有任何东西,所以只能匹配空字符串。用户提供的任何可以匹配该表达式的URL字符串将调用视图函数 views.index()。你可能会想,匹配一个空的URL没有任何用处——使用它干嘛?记住,这不是整个空的URL,只是URL字符串中的一部分。这是因为Django首先在项目urls.py中的正则表达式(比如 rango/)中匹配原始字符串,成功后去掉 rango/部分。然后Django将剩下的空字符串传递到rango应用,再通过rango/urls.py中的正则表达式匹配。
下一个传递给url()函数的参数是index视图,它将处理传入的请求。再后的是一个可选参数name,它被设置为字符串'index'。通过命名URL映射,后面我们可以使用反向URL匹配。这样我们可以通过名称而不是URL引用URL映射。下文建立模板时我们将解释怎么使用它。更多信息可以参考官方文档的相关章节。
现在,重启Django开发服务器,访问http://127.0.0.1:8000/rango/。如果一切顺利,你应该看到文本<Rango says hey there partner!>。如下面的截屏:
在每个app中,你将会创建很多URL映射。这个入门的映射相当简单,但是随着本书的深入,我们将建立一些更复杂、更参数化的URL映射。
领会Django时怎么处理URLs也是很重要的。现在它可能看起来很令人困惑,但是随着教程深入,我们会建立越来越多的URL映射,所以你很快就会成为专家。更多具体信息和实例请参考URLs官方文档。
正则表达式
Django URL模式使用正则表达式进行匹配。花时间熟悉怎么在python中使用正则表达式是很值得的。Python官方文档包含了一个良好的正则表达式指南。另外regexcheatsheet.com 提供了一个整洁的通用表达式概览。
如果你正在使用版本控制,现在是一个推送工作区更改的好时机。
3.6 基本工作流程
本章中所学习的内容可以简单概括为一个步骤列表。这里,我们提供你所完成的两个主要任务的列表。以后当你需要复习某些步骤时,可以回头看本小节。
创建新的Django项目
- 通过命令
$ python django-admin.py startproject <name>
创建项目,<name>
是你的项目名称。
创建新的Django应用
- 通过命令
$ python manage.py startapp <appname>
创建app,<appname>是你的应用名称。 - 将新建的app添加到项目settings.py文件中的INSTALLED_APPS元组中,让Django认识你的app。
- 在项目urls.py文件中,添加指向app的映射。
- 在app目录中新建urls.py文件,处理传入的URL字符串,指定视图。
- 在app目录的views.py中,创建请求的视图,确保它们返回一个HttpResponse对象。
练习
现在你可以运行Django和你的新app,完成下面的练习,巩固你所学的知识。到达这个阶段是学习Django的一个重大里程碑。创建视图和指向视图的URL映射,是开发更复杂和可以复用的网络应用的第一步。
- 复习本章,确保你了解了URL是怎么映射到视图的。
- 创建一个叫做about的新视图,返回HttpResponse对象:<'Rango says here is the about page.'>
- 将这个视图映射到 /rango/about。对于这一步,你只需要编辑Rango app的urls.py文件。注意/rango/部分由项目urls.py处理。
- 修改index视图的HttpResponse对象,使之包含一个指向about页面的链接。
- 修改about视图的HttpResponse对象,使之包含一个指向index页面的链接。
- 现在你真正开始学习本书了,作者的Twitter @tangowithdjano 。
提示
如果你感觉很难完成以上练习,以下这些提示应该可以提供灵感去解决它们。
- 在views.py中,建立一个函数,
def about(request):
,使它返回一个HttpResponse对象,将你的HTML插入这个对象。- 在rango/urls.py中添加新的映射到about()视图,用来匹配
的正则表达式为 `r'^about/' 。 - 更新你的index()视图,加入指向about视图的链接。可以像这样:
Rango says hey there partner! <br/><a href='/rango/about/'>About</a>
。- 在about()视图中也加上可以返回主页面的链接
<a href="/rango/">Index</a>
。- 如果你还没度过Django官方教程的第一部分,现在是时候停下来去读了。(译者注:中文版的教程可以参考博客园大江东流大神的博客)