Django学习笔记(第三节) 动态URL

来源:互联网 发布:sql修改数据库名字 编辑:程序博客网 时间:2024/05/16 09:20

当我们在编写URLConf时,经常会出现多个URL只有某一部分有很小的差别,例如:

urlpatterns = patterns('',
    url(r'^time/plus/1', 'zSite.views.one_hour_ahead', name='one_hour_ahead'),

    url(r'^time/plus/2', 'zSite.views.two_hour_ahead'', name='two_hour_ahead'),

    url(r'^time/plus/3', 'zSite.views.three_hour_ahead', name='three_hour_ahead'),
)

在这里后面四个url只有中间的数字是有区别的。分开处理会有很多冗余的视图函数,而整个应用也被限制了只支持预定义的四个时间,如果我们需要发布5小时,就需要单独创建新视图函数和配置URL。

为了避免这些问题,django引入动态URL。

动态URL的本质就是正则表达式匹配多条记录,根据匹配的URL的微小不同,在视图函数中进行处理。

将上面的例子进行改写、合并为:

urlpatterns = patterns('',
    url(r'^time/plus/\d+', 'zSite.views.hour_ahead', name='hour_ahead'),
)

\d+表示匹配1次或多次任意数字,也就是匹配任意整数的意思

当我们需要对其进行控制,比方说我们希望最大不超过99,只需要对这部分进行修改,如下:

(r'^time/plus/(\d{1,2})/$', 'zSite.views.hour_ahead', name='hour_ahead'),

将\d{1,2}用括号包裹起来那么这个正则表达式将匹配到全部字符串,但是只返回括号中的值。这个值将成为视图函数中的参数。

在views.py中添加函数:

#request是一个HttpRequest对象,set是从正则中匹配的结果。def hours_ahead(request,oset):    try:        #字符转化为数字        oset = int(oset);    except ValueError:        #当类型转换失败时,进入404页面        raise Http404()    #timedelta()方法是两个时间之间的时间差,详见Document    dt = datetime.datetime.now() + datetime.timedelta(hours = oset)    html = "<html><body>In %s hour(s), it will be %s.</body></html>" %(oset , dt)    return HttpResponse(html)

启动服务,输入地址验证结果。Http404是需要导入的:from django.http import Http404 。

页面将显示oset小时后的时间,如果输入的不是数字或者大于99都将进入404。

在这个页面中将显示一些敏感信息,但是这仅仅是django 的debug模式才显示的。关闭debug模式就不用担心在出现这些信息了。

在开发的过程中,这些信息可以用来帮助调试程序,代替使用print调试。



0 0
原创粉丝点击