[urls.py设置技巧]URLconf处理其三:URL匹配返回结果

来源:互联网 发布:oracle数据库建表语句 编辑:程序博客网 时间:2024/05/29 08:15

        注:以下内容转载自 现代魔法学院 网站的 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 配置的处理过程。

0 0
原创粉丝点击