在Django中有非常强大的URL模块,可以按照开发者的想法来制定清晰的URL,同时支持正则表达式。此外,在URL中还可以传递参数。
Django处理请求的方式
1) Django通过URLconf模块来进行判断。通常情况下,这就是ROOT_URLCONF配置的价值,但是如果请求携带了一个urlconf的属性(通常被中间件设置),那么这个被携带的urlconf将会替代ROOT_URLCONF的配置。
2) Django会调用Python模块并寻找各种urlpatterns。这是一个属于django.conf.urls.url()实例的python列表。
3) Django会遍历每个URL pattern,自上而下,并且选取收割匹配请求URL的pattern。
4) 一旦匹配某个url pattern的正则表达式,Django将导入并调用相关的view(这是一个简单的python函数,或者是一个class-based view)
这个view将会传递下列参数:
l 一个HttpRequest的实例
l 如果匹配了URL中一个no named group,那么参数将会按根据URL中的位置一一对应
l 如果匹配了URL中一个named group,且参数传递是通过named group来匹配的,那么参数将会被指定的kwargs代替。
5) 如果没有任何一个正则表达式被匹配,那么Django会抛出异常,并报错。
1 无参数情况
配置URL及其视图如下:
- (r'^hello/$', hello)
- def hello(request):
- return HttpResponse("Hello World")
访问http://127.0.0.1:8000/hello,输出结果为“Hello World”
2 传递一个参数
配置URL及其视图如下,URL中通过正则指定一个参数:
- (r'^plist/(.+)/$', helloParam)
- def helloParam(request,param1):
- return HttpResponse("The param is : " + param1)
访问http://127.0.0.1:8000/plist/china,输出结果为”The param is : china”
3 传递多个参数
参照第二种情况,以传递两个参数为例,配置URL及其视图如下,URL中通过正则指定两个参数:
- (r'^plist/p1(\w+)p2(.+)/$', helloParams)
- def helloParams(request,param1,param2):
- return HttpResponse("p1 = " + param1 + "; p2 = " + param2)
访问http://127.0.0.1:8000/plist/p1chinap22012/
输出为”p1 = china; p2 = 2012″
从这里可以看出,视图的参数是根据URL的正则式,按顺序匹配并自动赋值的。虽然这样可以实现任意多个参数的传递,但是却不够灵活,URL看起来很混乱,而且由于是正则匹配,有些情况下容易出错。
4 通过传统的”?”传递参数
例如,http://127.0.0.1:8000/plist/?p1=china&p2=2012,url中‘?’之后表示传递的参数,这里传递了p1和p2两个参数。
通过这样的方式传递参数,就不会出现因为正则匹配错误而导致的问题了。在Django中,此类参数的解析是通过request.GET.get方法获取的。
配置URL及其视图如下:
- (r'^plist/$', helloParams1)
- def helloParams(request):
- p1 = request.GET.get('p1')
- p2 = request.GET.get('p2')
- return HttpResponse("p1 = " + p1 + "; p2 = " + p2)
输出结果为”p1 = china; p2 = 2012″