Django学习总结之三-视图和url配置

一、创建视图

1、在mysite文件夹下新建一个文件命名为views.py ,内容为:

from django.http import HttpResponse

def hello(request)
	return HttpResponse("Hello World")
每个视图函数至少有一个参数,通常叫作request。

2、修改urls.py文件,添加views.py 中视图函数与url的映射。

from django.conf.urls.defaults import patterns, include, url
from mysite.views import hello

urlpatterns = patterns('',
	('^hello/$', hello),
)

添加该视图函数hello的引用:from django.views import hello;添加url与视图函数的映射:('^hello/$', hello),这是一个元组,第一部分是一个正则表达式,指明url地址,第二个对应的是视图函数名称。其中,上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。

如果我们用尾部不是$的模式’^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/foo 和/hello/bar,而不仅仅是/hello/。类似地,如果我们忽略了尖号(^),’hello/$’,那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。如果我们简单使用hello/,即没有^开头和$结尾,那么任何包含hello/的URL将会匹配,如:/foo/hello/bar。因此,我们使用这两个符号以确保只有/hello/匹配,不多也不少。

3、测试

运行服务器:python manange.py runserver

在浏览器中输入:http://127.0.0.1/hello/

二、正则表达式

符号 匹配
. (dot) 任意单一字符
\d 任意一位数字
[A-Z] AZ中任意一个字符(大写)
[a-z] az中任意一个字符(小写)
[A-Za-z] az中任意一个字符(不区分大小写)
+ 匹配一个或更多 (例如, \d+ 匹配一个或 多个数字字符)
[^/]+ 一个或多个不为‘/’的字符
? 零个或一个之前的表达式(例如:\d? 匹配零个或一个数字)
* 匹配0个或更多 (例如, \d* 匹配0个 或更多数字字符)
{1,3} 介于一个和三个(包含)之前的表达式(例如,\d{1,3}匹配一个或两个或三个数字)

django处理请求的过程:

在用django-admin.py startproject mysite 创建工程时,自动在配置文件setings.py 文件中的ROOT_URLCONF赋值为:

ROOT_URLCONF = 'mysite.urls'

它将作为URLconf告诉Django在这个站点中那些Python的模块将被用到。

1、访问URL/hello/时,django根据setings.py 中的ROOT_URLCONF的设置装载URLconf。

2、逐个匹配URLpatterns。

3、匹配成功,则调用相应的视图函数,视图函数返回一个HttpResponse

4、django转换HttpResponse为合适的HTTP response,以web page展现出来。

三、动态内容

动态显示当前时间,views.py 的内容

from django.http import HttpResponse
import datetime

def hello(request):
    return HttpResponse("Hello world")

def current_datetime(request):
    now = datetime.datetime.now()
    html = "It is now %s." % now
    return HttpResponse(html)
urls.py 内容:

from django.conf.urls.defaults import patterns, include, url
from mysite.views import hello,current_datetime

urlpatterns = patterns('',
	('^hello/$', hello),
	('^datetime/$', current_datetime),
)
四、动态url

方法:使用通配符

例子:计算时间差:

urls.py 中添加

(r'^time/plus/(\d{1,2})/$', current_datetime),
\d表示的数字,{1,2}限制在两位数以内,即0~99

r,表示不需要处理里面的反斜杠。

想把这些数字作为参数传递到视图函数中,需要用圆括号把他们括起来。

视图函数:

def hours_ahead(request, offset):
	try:
		offset = int(offset)
	except ValueError:
		raise Http404()
	dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
	html = "In %s hour(s), it will be %s." % (offset, dt)
	return HttpResponse(html)

我们把从url捕获到的offset转换成int类型的原因是:因为url捕获到的参数永远都是string类型。

可以在程序中添加:assert False 触发出错页,通过查看Local vars查看局部变量,这是一种调试方式。

本文为Eliot原创,转载请注明出处: http://blog.csdn.net/xyw_eliot/article/details/8842120


你可能感兴趣的:(django)