路由解析器
路由解析器(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/的处理过程如下:
自动创建
需要指出的是,在Django框架中,路由解析器是在每次处理WSGI请求时, 根据项目配置的路由表信息自动创建的,不需要我们手动构造。
Django自动创建的路由解析器总是匹配规则^/:
resolver = RegexURLResolver(r'^/',urlpatterns)
因此,我们在路由表中定义的URL模式,不需要书写开头的/。
修改示例代码:
1. 创建视图v_test
2. 创建路由项,将URL模式test/指向视图v_test,并添加到路由表中
3. 使用路由解析器解析URL/test/并调用对应的视图