Django: 路由与视图 互动版

路由解析器

路由解析器(RegexURLResolver)是Django执行路由计算的类,它总是 基于一个路由表创建实例对象:

RegexURLResolver(regex,urlconf)

参数regex指定的正则表达式用来过滤URL。只有匹配这个表达式的URL,Django 才会使用参数urlconf指定的路由表来进行解析。例如,下面的示例中建立的路由 解析器,将只对/site1/开头的URL进行解析:

resolver = RegexURLResolver(r'^/site1/',site1_urlpatterns)

URL解析

路由解析器的最重要方法当然是解析URL:resolve(url),用来解析传入 的URL,返回匹配结果。resolve()的返回值也是一个ResolverMatch对象。

如果路由解析器没有匹配路由表中的任何一条规则,将抛出异常Resolver404。 因此,我们在使用resolve()方法时,应当进行异常处理:

try:
    view,args,kwargs = pattern.resolve(url_to_resolve)
except:
    #do sth.

前缀剔除

需要指出的是,当请求URL匹配regex参数指定的模式时,路由解析器会首先从 请求URL中剔除这部分,然后再使用路由表进行匹配。

例如,对于下面的代码:

site1_urlpatterns = [
    url(r'^$',v_index),
    url(r'^news/$',v_news),
]
resolver = RegexURLResolver(r'^/site1/',site1_urlpatterns)
view_func,args,kwargs = resolver.resolve('/site1/news/')

Django对URL/site/news/的处理过程如下:

resolver-strip

自动创建

需要指出的是,在Django框架中,路由解析器是在每次处理WSGI请求时, 根据项目配置的路由表信息自动创建的,不需要我们手动构造。

Django自动创建的路由解析器总是匹配规则^/

resolver = RegexURLResolver(r'^/',urlpatterns)

因此,我们在路由表中定义的URL模式,不需要书写开头的/

修改示例代码:

1. 创建视图v_test

2. 创建路由项,将URL模式test/指向视图v_test,并添加到路由表中

3. 使用路由解析器解析URL/test/并调用对应的视图