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

当我们在编写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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值