urlconf = settings.ROOT_URLCONF
urlresolvers.set_urlconf(urlconf)
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
set_urlconf,如果没有设置urlconf的文件路径,保存;有,删掉。下边生成 resolver对象。
resolver_match = resolver.resolve(request.path_info)
callback, callback_args, callback_kwargs = resolver_match
request.resolver_match = resolver_match
找到RegexURLResolver里的resolve,match = self.regex.search(path)是匹配上边的 r'^/',也就是path_info必须是’/‘开头,如果不匹配直接404。然后,生成新地址为去掉’/‘剩下的。获得url_patterns,从rulconf得到urlconf_module,从urlconf_module得到urlpatterns,就是url配置文件里的变量。然后返回urlpatterns。
然后遍历urlpatterns,这里要先看一下urls.py里的三个函数了,patterns, include, url。
def include(arg, namespace=None, app_name=None):
判断arg为tuple的写法是:include((urlconf_module, app_name, namespace))并且不能有namespace参数。这种写法没用过
不是tuple,判断arg的类型为string,导入urls.py.然后不是string就是mudule了。然后都获取urls.py里定义的urlpatterns。然后下边验证了一下每一个规则的类型。返回数据。返回的数据和参数一样,当arg为tuple时就是返回arg。
def url(regex, view, kwargs=None, name=None, prefix='')
先判断view为 list或者tuple就是有include的时候,返回RegexURLResolver对象。
否则view是string,返回RegexURLPattern对象。
def patterns(prefix, *args):
还是先判断是否可以为list和tuple,如果是,调用url()。说明在urls.py里url完全可以不写。如果是RegexURLPattern,添加前缀。最后返回所有的regex。也就是说最终的urlpatterns就是一个包含所有RegexURLPattern的list。
上边在dist-packages/django/core/urlresolvers.py里RegexURLPattern里的resolve,for循环urlpatterns,然后用每一个regex对象的resolve方法去匹配新的地址。当是include的时候 对象还是RegexURLResolver,所以还是这个resolve,起到递归循环。当是RegexURLPattern时,如果匹配成功,返回一个ResolverMatch,arg或kwargs是匹配的url参数,再在后边又更新上url()配置里的参数。如果匹配到最后还没匹配到,404。
ResolverMatch有一个ResolverMatch方法,用在这句上,callback, callback_args, callback_kwargs = resolver_match
并且将返回的ResolverMatch存到request里。
url匹配完了
上一篇: django源码阅读,WSGIHandler里middleware,view流程
下一篇: pyrasite项目总结为一条命令
0 Responses so far.