1. 第一份视图: 在mysite文件夹中,创建一个叫做views.py的空文件。这个Python模块将包含这一章的视图。 我们的Hello world视图非常简单。 这些是完整的函数和导入声明,你需要输入到views.py文件:
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world")
每个视图函数至少要有一个参数,通常被叫作request。这是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest的一个实例,它必须是这个视图的第一个参数。
一个视图就是Python的一个函数。。这个函数第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。
2. 你的第一个URLconf
2.1 URLconf (即 urls.py 文件)就像是 Django 所支撑网站的目录。 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。
from django.conf.urls.defaults import *
urlpatterns = patterns('',
) #patterns函数当前只有一个参数—一个空的字符串。 (这个字符串可以被用来表示一个视图函数的通用前缀。具体我们将在第八章里面介绍。)
如果想在URLconf中加入URL和view,只需增加映射URL模式和view功能的Python tuple即可. 这里演示如何添加view中hello功能.
from django.conf.urls.defaults import *
from mysite.views import hello
urlpatterns = patterns('',
('^hello/$', hello),
) # (‘^hello/$’, hello), 这行被称作URLpattern,它是一个Python的元组。元组中第一个元素是模式匹配字符串(正则表达式);第二个元素是那个模式将使用的视图函数。简单来说,我们只是告诉 Django,所有指向 URL /hello/ 的请求都应由 hello 这个视图函数来处理。
2.2 讨论一下URLpattern的语法:
Django在检查URL模式前,移除每一个申请的URL开头的斜杠(/)。
模式包含了一个尖号(^)和一个美元符号($)。你大多数的URL模式会以^开始、以$结束,但是拥有复杂匹配的灵活性会更好。
默认地,任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。 (这是受配置文件setting中APPEND_SLASH项控制的)
如果你是喜欢所有URL都以’/’结尾的人(Django开发者的偏爱),那么你只需要在每个URL后添加斜杠,并且设置”APPEND_SLASH”为”True”。
我们把hello视图函数作为一个对象传递,而不是调用它。 这是 Python (及其它动态语言的) 的一个重要特性: 函数是一级对象(first-class objects), 也就是说你可以像传递其它变量一样传递它们。
现在启动Django开发服务器来测试修改好的URLconf,运行 python manage.py runserver 。打开浏览器访问 " http://12.0.0.1:8000/hello/ ",将看到页面上输出的 Hello world 。
3. 正则表达式。
Django URLconfs 允许你 使用任意的正则表达式来做强有力的URL映射,不过通常你实际上可能只需要使用很少的一 部分功能。
符号 匹配
. (dot) 任意单一字符
\d 任意一位数字
[A-Z] A 到 Z中任意一个字符(大写)
[a-z] a 到 z中任意一个字符(小写)
[A-Za-z ] a 到 z中任意一个字符(不区分大小写)
+ 匹配一个或更多 (例如, \d+ 匹配一个或 多个数字字符)
[^/]+ 一个或多个不为‘/’的字符
? 零个或一个之前的表达式(例如:\d? 匹配零个或一个数字)
* 匹配0个或更多 (例如, \d* 匹配0个 或更多数字字符)
{1,3} 介于一个和三个(包含)之前的表达式(例如,\d{1,3}匹配一个或两个或三个数字)
4. Django是如何处理请求的
4.1 所有均开始于 setting 文件。当你运行 python manage.py runserver ,脚本将在于 manage.py 同一个目录下查找名为 setting.py 的文件。这个文件包含了所有有关这个Django项目的配置信息,均大写: TEMPLATE_DIRS , DATABASE_NAME , 等. 最重要的设置时ROOT_URLCONF,它将作为 URLconf 告诉 Django 在这个站点中那些Python的模块将被用到。还记得什么时候django-admin.py startproject创建文件settings.py和urls.py吗?自动创建的 settings.py 包含一个 ROOT_URLCONF 配置用来指向自动产生的 urls.py 。打开文件 settings.py 你将看到如下: ROOT_URLCONF = 'mysite.urls' ,相对应的文件是 mysite/urls.py 。当访问 URL /hello/ 时,Django 根据 ROOT_URLCONF 的设置装载 URLconf 。 然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。 当找到这个匹配 的URLpatterns就调用相关联的view函数,并把 HttpRequest 对象作为第一个参数。正如我们在第一个视图例子里面看到的,一个视图功能必须返回一个HttpResponse。 一旦做完,Django将完成剩余的转换Python的对象到一个合适的带有HTTP头和body的Web Response。
总结一下:
进来的请求转入/hello/.
Django通过在ROOT_URLCONF配置来决定根URLconf.
Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。
如果找到匹配,将调用相应的视图函数
视图函数返回一个HttpResponse
Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
你现在知道了怎么做一个 Django-powered 页面了,真的很简单,只需要写视图函数并用 URLconfs把它们和URLs对应起来。
5. 第二个视图:动态内容
这个视图需要做两件事情: 计算当前日期和时间,并返回包含这些值的HttpResponse 。
将如下代码放入视图函数:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "It is now %s." % now
return HttpResponse(html)
函数的第二行代码用 Python 的格式化字符串(format-string)功能构造了一段 HTML 响应。
在urls.py中添加URL模式,以告诉Django由哪一个URL来处理这个视图。
from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime
urlpatterns = patterns('',
('^hello/$', hello),
('^time/$', current_datetime),
)
完成后即可启动服务器( python manage.py runserver ),在浏览器输入 http://127.0.0.1:8000/time/ 。
6. URL配置和松耦合
简单的说,松耦合是一个 重要的保证互换性的软件开发方法。
Django的URL配置就是一个很好的例子。 在Django的应用程序中,URL的定义和视图函数之间是松 耦合的,换句话说,决定URL返回哪个视图函数和实现这个视图函数是在两个不同的地方。 这使得 开发人员可以修改一块而不会影响另一块。
例如,考虑一下current_datetime视图。 如果我们想把它的URL 从原来的 /time/ 改变到 /currenttime/ ,我们只需要快速的修改一下URL配置即可, 不用担心这个函数的内部实现。 同样的,如果我们想要修改这个函数的内部实现也不用担心会影响 到对应的URL。
此外,如果我们想要输出这个函数到 一些 URL, 我们只需要修改URL配置而不用 去改动视图的代码。