Python 中Url.py的调度
来源:互联网 发布:nginx 二级域名 转发 编辑:程序博客网 时间:2024/05/22 14:57
RegexURLResolver.reslove() 调用的理解。假设工程名为 mysite,并且创建了 app people。
from django.conf.urls import patterns, include, urlurlpatterns = patterns('', url(r"^$","mysite.views.index"), url(r"^about/","mysite.views.about"), url(r"^people/",include(people.urls)), url(r"^contact/","mysite.views.contact"), url(r"^update/","mysite.views.update"),)
当访问 http://exapmle.com/people/daoluan/ 的时候 URL dispatcher 的调度过程(蓝色部分):
BaseHandler.get_response() 中根据 settings.py 中的 ROOT_URLCONF 设置选项构造 RegexURLResolver 对象, 并调用 RegexURLResolver.resolve(“/people/daoluan/”) 启动解析, 其中 RegexURLResolver.regex = “^\”, 也就是说它会过滤 “\”, url 变为 “people/daoluan/”;
resolve() 中调用 RegexURLResolver.url_patterns(), 加载了所有的匹配信息如下(和图中一样):
(类型)RegexURLPattern (正则匹配式)[^$]
RegexURLPattern [^about/]
RegexURLResolver [^people/]
RegexURLPattern [^contact/]
RegexURLPattern [^update/]
语句 for pattern in self.url_patterns: 开始依次匹配. 第一个因为是 RegexURLPattern 对象, 调用 resolve() 为 RegexURLPattern.resolve(): 它直接用 [^$] 去匹配 “people/daoluan/”, 结果当然是不匹配.
下一个 pattern 过程同上.
第三个 pattern 因为是 RegexURLResolver 对象, 所以 resolve() 调用的是 RegexURLResolver.resolve(), 而非上面两个例子中的 RegexURLPattern.resolve(). 因为第三个 pattern.regex = “^people/”, 所以会将 “people/daoluan/” 过滤为 “daoluan/”. pattern.resolve() 中会调用 RegexURLResolver.url_patterns(), 加载了所有的匹配信息如下(和图中一样):
RegexURLPattern [^daoluan
]RegexURLPattern[sam ]
RegexURLPattern [^jenny$]
语句 for pattern in self.url_patterns: 开始依次匹配. 第一个就中, 过程和刚开始的过程一样. 因此构造 ResolverMatch 对象返回. 于是 BaseHandler.get_response() 就顺利得到 ResolverMatch 对象, 其中记录了有用的信息. 在 BaseHandler.get_response() 中有足够的信息让你知道开发人员在 views.py 中定义的函数是 def daoluan(request): 在什么时候调用的:
# BaseHandler.get_response() 的定义# 处理请求的函数, 并返回 responsedef get_response(self, request): ...... # 实例化 RegexURLResolver, 暂且将其理解为一个 url 的匹配处理器, 下节展开 resolver = urlresolvers.RegexURLResolver(r'^/', urlconf) ...... # 调用 RegexURLResolver.resolve(), 可以理解为启动匹配的函数; 返回 ResolverMatch 实例 resolver_match = resolver.resolve(request.path_info) ...... # resolver_match 对象中存储了有用的信息, 譬如 callback 就是我们在 views.py 中定义的函数. callback, callback_args, callback_kwargs = resolver_match ...... # 这里调用的是真正的处理函数, 我们一般在 view.py 中定义这些函数 response = callback(request, *callback_args, **callback_kwargs) ...... return response
从上面知道, url 调度器主要 RegexURLResolver, RegexURLPattern, ResolverMatch 和三个辅助函数 url(), include(), patterns() 完成. 可以发现, url 的调度顺序是根据 urls.py 中的声明顺序决定的, 意即遍历一张表而已。
- Python 中Url.py的调度
- Python中url.py的配置
- web.py中关于url的总结
- web.py中关于url的总结
- python中__init__.py文件的作用
- python中__init__.py文件的作用
- python中__init__.py文件的作用
- Python中__init__.py文件的作用
- python中__init__.py文件的作用
- python中import自己写的.py
- python文件夹中__init__.py的用处
- Python中builtins.py文件的注解
- Django中关于URL配置文件urls.py的理解
- Django中关于URL配置文件urls.py的理解
- python中__init__.py
- python web py入门-3-URL映射
- python 的sitecustomize.py
- python的__init__.py
- java学习笔记8时间类
- 鼠标样式在网页上鼠标上生成气泡
- 课后习题
- 凸包Graham Scan算法实现
- Android性能优化之Listview(ViewHolder重用机制)
- Python 中Url.py的调度
- Java Curl 开发记录(三) 使用ndk编译libcurl
- Android spinner 的使用
- 一个球从100米高的自由落下,每次落地后反跳回原高度的一半,再落下,再反弹。求第 10次落地时,共经过多少米,第10次反弹多高。
- 横竖屏切换时候Activity的生命周期变化
- xargs
- CRC的校验原理
- iOS著名开源项目大全
- 字节序