我们在Django建立helloworld自定义页面创建的页面,只能算是一个静态页,发起一个请求,返回一个固定的值,并不能满足我们动态的需求。今天我们创建一个带参数的URLconf,根据参数展示不同的内容。
另一个试图函数
打开views.py,创建一个试图函数
1 def current_dt(request): 2 now = datetime.datetime.now() 3 html = "<html><body>it is now %s.</body></html>" % now 4 return HttpResponse(html)
这里我是沿用helloWord那个views.py文件,需要引入datetime模块
from django.http import HttpResponse import datetime
打开urls.py,配置一个URL
url(r'^curtime/$',current_dt),
好了,我们访问一下这个地址吧,效果如下
每次刷新都会显示当前时间,当然这不是我们的动态效果。
带参数的视图函数
在当前时间基础上增加时差的视图。
我们重复上述动作,新建试图函数(只不过除了request,多一个参数-时差数)
1 def hours_ahead(request,phours): 2 try: 3 phours = int(phours) 4 except VauleError: 5 raise Http404() 6 7 dt = datetime.datetime.now() + datetime.timedelta(hours=phours) 8 html = "<html><body>In %s hour(s),it will be %s.</body></html>" % (phours,dt) 9 return HttpResponse(html)
注意:捕获值(传递的参数)永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。
因此这里我们使用int()进行转换
phours = int(phours)
配置URLconf
那么,我们如何设计程序来处理任意数量的时差?
答案是:使用通配符(wildcard URLpatterns)。一个URL模式就是一个正则表达式,因此,这里可以使用d+来匹配1个以上的数字。
在这里我们就设置了99个小时的时间段限制。
现在我们已经设计了一个带通配符的URL,我们需要一个方法把它传递到视图函数里去,这样我们只用一个视图函数就可以处理所有的时间段了。 我们使用圆括号把参数在URL模式里标识出来。在这个例子中,我们想要把这些数字作为参数,用圆括号把 d{1,2} 包围起来
url(r'^ptime/plus/(d{1,2})/$',hours_ahead),
另外一个重点,正则表达式字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。 在普通Python字符串中,反斜杠用于特殊字符的转义。比如n转义成一个换行符。 当你用r把它标示为一个原始字符串后,Python不再视其中的反斜杠为转义字符。也就是说,“n”是两个字符串:“”和“n”。由于反斜杠在Python代码和正则表达式中有冲突,因此建议你在Python定义正则表达式时都使用原始字符串。
好,我们访问一下看看效果吧
到此为止,我们已经可以传递参数,根据参数来显示内容了。