注:以下内容转载自 现代魔法学院 网站的 URLconf处理其三:URL匹配返回结果 一文,仅供学习使用。
匹配结果
匹配结果是指当 URL 被正确匹配时,需返回的匹配结果。匹配结果需指定以下几个内容:
- 一个可调用对象。通常是视图函数。
- 视图函数参数。通常是 URL 模式中正则表达式命名组匹配的值。
- 视图函数关键字参数。通常是 url 方法中设置传递给视图函数的参数(字典形式)。
- 可选的 URL 名称参数。
- 可选的 APP 名称参数。
- 可选的命名空间参数。
类 django.core.urlresolvers.ResolverMatch 用来表示匹配结果。
ResolverMatch 类实现了 __getitem__ 方法,可以同元组操作一样,获取视图函数引用与视图函数参数,从而具备调用视图函数的条件。
class ResolverMatch(object):
def __init__(self, func, args, kwargs, url_name=None, app_name=None, namespaces=None):
self.func = func
self.args = args
self.kwargs = kwargs
self.app_name = app_name
if namespaces:
self.namespaces = [x for x in namespaces if x]
else:
self.namespaces = []
if not url_name:
if not hasattr(func, '__name__'):
# An instance of a callable class
url_name = '.'.join([func.__class__.__module__, func.__class__.__name__])
else:
# A function
url_name = '.'.join([func.__module__, func.__name__])
self.url_name = url_name
def namespace(self):
return ':'.join(self.namespaces)
namespace = property(namespace)
def view_name(self):
return ':'.join([ x for x in [ self.namespace, self.url_name ] if x ])
view_name = property(view_name)
def __getitem__(self, index):
return (self.func, self.args, self.kwargs)[index]
def __repr__(self):
return "ResolverMatch(func=%s, args=%s, kwargs=%s, url_name='%s', app_name='%s', namespace='%s')" % (
self.func, self.args, self.kwargs, self.url_name, self.app_name, self.namespace)
URL 配置处理过程
通过对 URL 模式,URL 分解器,URL 匹配结果的了解,基本上对 URL 配置的处理过程了解大半了。
看看开始处理 URL 配置的代码:
if hasattr(request, "urlconf"):
# Reset url resolver with a custom urlconf.
urlconf = request.urlconf
urlresolvers.set_urlconf(urlconf)
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
callback, callback_args, callback_kwargs = resolver.resolve(
request.path_info)
得益于 URL 分解器的层级设计,这几行代码便完成了对 URL 配置的处理过程。