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将会调用错误处理函数。
相关文章推荐
- 更改hosts后还是无法使用Google,Facebook,Twitter等服务怎么办?
- 《An Industrial-Strength Audio Search Algorithm》译文
- 《An Industrial-Strength Audio Search Algorithm》译文
- Go语言并发之美
- STL::算法::常见算法
- mongo分片
- Introduction to Algorithm - Summary of Chapter 2(0) - Getting started
- google git resource
- 主库磁盘满,从库io线程报错Got fatal error 1236 from master when reading data from binary log
- Git Tutorial 1 - Goto Staging Area
- 创建django项目报错:Django not found
- [转]How Hash Algorithms Work
- about golang
- google浙大招聘笔试题
- category extension
- High Performance Django
- go安装windows源码
- webrtc doubango linphone
- 一幅图看看mongondb对企业级数据的管理
- 在线安装 IntelliJ IDEA的 golang 插件