Python的Django框架中从url中捕捉文本的方法
每个被捕获的参数将被作为纯Python字符串来发送,而不管正则表达式中的格式。举个例子,在这行URLConf中:
(r'^articles/(?P<year>\d{4})/$',views.year_archive),
尽管\d{4}将只匹配整数的字符串,但是参数year是作为字符串传至views.year_archive()的,而不是整型。
当你在写视图代码时记住这点很重要,许多Python内建的方法对于接受的对象的类型很讲究。许多内置Python函数是挑剔的(这是理所当然的)只接受特定类型的对象。一个典型的的错误就是用字符串值而不是整数值来创建datetime.date对象:
>>>importdatetime >>>datetime.date('1993','7','9') Traceback(mostrecentcalllast): ... TypeError:anintegerisrequired >>>datetime.date(1993,7,9) datetime.date(1993,7,9)
回到URLconf和视图处,错误看起来很可能是这样:
#urls.py fromdjango.conf.urls.defaultsimport* frommysiteimportviews urlpatterns=patterns('', (r'^articles/(\d{4})/(\d{2})/(\d{2})/$',views.day_archive), ) #views.py importdatetime defday_archive(request,year,month,day): #ThefollowingstatementraisesaTypeError! date=datetime.date(year,month,day)
因此,day_archive()应该这样写才是正确的:
defday_archive(request,year,month,day): date=datetime.date(int(year),int(month),int(day))
注意,当你传递了一个并不完全包含数字的字符串时,int()会抛出ValueError的异常,不过我们已经避免了这个错误,因为在URLconf的正则表达式中已经确保只有包含数字的字符串才会传到这个视图函数中。
决定URLconf搜索的东西
当一个请求进来时,Django试着将请求的URL作为一个普通Python字符串进行URLconf模式匹配(而不是作为一个Unicode字符串)。这并不包括GET或POST参数或域名。它也不包括第一个斜杠,因为每个URL必定有一个斜杠。
例如,在向http://www.example.com/myapp/的请求中,Django将试着去匹配myapp/。在向http://www.example.com/myapp/?page=3的请求中,Django同样会去匹配myapp/。
在解析URLconf时,请求方法(例如,POST,GET,HEAD)并不会被考虑。换而言之,对于相同的URL的所有请求方法将被导向到相同的函数中。因此根据请求方法来处理分支是视图函数的责任。