• URLconf处理其三:URL匹配返回结果

    URL配置的处理过程
    服务器君一共花费 10.128 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    匹配结果

    匹配结果是指当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配置的处理过程。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [PHP程序设计] PHP中的Hash算法 3 个条目
  2. [数据库技术] MySQL常用自带函数 3 个条目
  3. [Python程序设计] Django与表单 4 个条目
  4. [Python程序设计] Python Web部署的背景知识 9 个条目
  5. [移动开发] Android View注入框架Butter Knife 3 个条目
  6. [移动开发] Android抽屉导航NavigationDrawer 5 个条目
  7. [PHP程序设计] 对输入文件类型的检测 1 个条目
  8. [移动开发] 从代码角度去认识 Activity 4 个条目
  9. [C语言程序设计] C语言里的全局变量 2 个条目
  10. [移动开发] 从代码角度去认识 Handler 4 个条目
  11. [PHP程序设计] httpd.conf设置相关 3 个条目
  12. [搜索引擎优化] 百度搜索引擎优化指南 3 个条目
窗口 -- [八点]