您的位置:首页 > 编程语言 > Go语言

Django路由算法

2015-11-11 23:11 441 查看

路由表

前文Django和WSGI已提到,Django项目是一个WSGI应用对象,它的核心模块有两个路由表和视图应用。流程就是WSGI服务器从浏览器接收到的URL地址,由路由表的解析找到对应的视图函数处理。
在Django中,包含一个或者多个路由项的列表(List)对象,就是一个合法的路由表。例如下面示例:
urlpatterns = [
url(r'^$',v_index),
url(r'^news/$',v_news),
]

路由项
路由项记录一个URL正则表达模式和一个视图函数的对应关系,主要作用是通过用户请求的URL找到对应的视图函数。
在Django中,使用url(regex, view)函数创建了一个RegexURLPattern对象。参数regex是一个用来匹配URL的正则表达式,而参数view则指向视图函数。
RegexURLPattern对象最重要的方法是resolve(),传入url串,如果和它匹配则返回一个ResolveMatch对象,负责返回None
匹配结果
匹配结果ResolveMatch最重要的三个属性:view - 视图函数

args - 位置参数列表

kargs - 关键字参数字典

由于ResolveMatch重载了__getitem__()函数,因此,我们可以一次提取这些属性:
view,args,kwargs = urlpattern.match('about/')
print view(None,*args,**kwargs)

路由解析器

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

参数regex指定正则表达式用来过滤URL。只有匹配regex的URL,Django才会使用urlconf指定的路由表来进行解析。
URL解析
路由解析器最重要的方法当然是解析URL:resolve(url),用来解析传入的URL,返回匹配结果。resolve()返回值也是一个ResolveMatch对象。
如果路由解析器没有匹配路由表的任何一项,将会抛出一个Resolver404的异常。所以,在使用这个方法是,应当进行异常处理。
前缀剔除
需要指出的是,当请求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 /site1/news/的处理过程如下:

路由算法

当用户请求一个网页时,Django使用如下的算法计算路由:

创建路由解析器
每当收到一个WSGI服务器的处理请求,Django将首先交给根路由模块创建一个路由解析器。将哪个模块设置为根路由模块,通常是由全局配置项ROOT_URLCONF来决定。但如果HttpRequest对象带有urlconf,那么将使用这个属性指定的模块作为根路由模块。

URL匹配测试
使用用户的URL跟每一项URL模式进行匹配,直到找到一个对应的URL模式。

调用匹配项的视图
Django会把HttpRequest实例对象和其他附加数据传入匹配的视图函数。

异常处理
如果没有任何URL模式可以匹配当前请求的URL,或者出现异常,Django将会调用错误处理函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: