zoukankan      html  css  js  c++  java
  • Werkzeug库的routing模块(Rule, Map)

    Werkzeug库的routing模块

    Werkzeug库的routing模块的主要功能在于URL解析。对于WSGI应用来讲,不同的URL对应不同的视图函数,routing模块则会对请求信息的URL进行解析并匹配,
    触发URL对应的视图函    数,以此生成一个响应信息。routing模块的解析和匹配功能主要体现在三个类上:Rule、Map和MapAdapter。
    

    Rule类

    Rule类继承自RuleFactory类。一个Rule的实例代表一个URL模式,一个WSGI应用可以处理很多不同的URL模式,这也就是说可以产生很多不同的Rule实例。
    这些Rule实例最终会作为参数传递给Map类,形成一个包含所有URL模式的对象,通过这个对象可以解析并匹配请求对应的视图函数。
    

    Rule类一些常用的方法:

    empty() ——在实际情况中,Rule实例会和一个Map实例进行绑定。通过empty()方法可以将Rule实例和Map实例解除绑定。
    
    get_empty_kwargs() ——在empty()方法中调用,可以获得之前Rule实例的参数,以便重新构造一个Rule实例。
    
    get_rules(map) 
    ——这个方法是对RuleFactory类中get_rules方法的重写,返回Rule实例本身。
    
    
    refresh() 
    ——当修改Rule实例(URL规则)后可以调用该方法,以便更新Rule实例和Map实例的绑定关系。
    
    bind(map, rebind=False) ——将Rule实例和一个Map实例进行绑定,这个方法会调用complie()方法,会给Rule实例生成一个正则表达式。
    
    complie() 
    ——根据Rule实例的URL模式,生成一个正则表达式,以便后续对请求的path进行匹配。
    
    match(path) ——将Rule实例和给定的path进行匹配。在调用complie()方法生成的正则表达式将会对path进行匹配。如果匹配,将返回这个path中的参数,以便后续过程使用。如果不匹配,将会由其他的Rule实例和这个path进行匹配。
    

    Rule类方法

    def __init__(self, string, defaults=None, subdomain=None, methods=None,
        build_only=False, endpoint=None, strict_slashes=None,
                 redirect_to=None, alias=False, host=None):
        if not string.startswith('/'):
            raise ValueError('urls must start with a leading slash')
        self.rule = string
        self.is_leaf = not string.endswith('/')
        self.map=None                                     
        self.strict_slashes = strict_slashes                                                                                                                                    
    def empty(self):
    	return type(self)(self.rule, **self.get_empty_kwargs()
    
    #生成器,调用后返回自身,submain首先获取**rule**,接着获取生成器
    def get_rules(self, map):
    	yield self   
    
    def refresh(self):
    	self.bind(self.map, rebind=True)
    
    #bind方法将rule绑定到self.map上面,那么rule就可以使用map实例的属性
    def bind(self, map, rebind=False):
    	if self.map is not None and not rebind:
    		raise RuntimeError('url rule %r already bound to map %r' %
    						   (self, self.map))
    	self.map = map                                                                                                                                                                         
    	if self.strict_slashes is None:
    		self.strict_slashes = map.strict_slashes
    	if self.subdomain is None:
    		self.subdomain = map.default_subdomain
    	self.compile()
    
    #调用self.map的的方法获得url转换的方法   
    def get_converter(self, variable_name, converter_name, args, kwargs):
    	if converter_name not in self.map.converters:                     
    		raise LookupError('the converter %r does not exist' % converter_name)
    	return self.map.converters[converter_name](self.map, *args, **kwargs)                                                           
    

    Map类

    通过Map类构造的实例可以存储所有的URL规则,这些规则是Rule类的实例。Map实例可以 通过后续的调用和给定的URL进行匹配。
    

    Map 方法

    add(rulefactory) ——这个方法在构造Map实例的时候就会调用,它会将所有传入Map类中的Rule实例和该Map实例建立绑定关系。该方法还会调用Rule实例的bind方法。
    
    bind方法 ——这个方法会生成一个MapAdapter实例,传入MapAdapter的包括一些请求信息,这样可以调用MapAdapter实例的方法匹配给定URL。
    
    bind_to_environ方法 ——通过解析请求中的environ信息,然后调用上面的bind方法,最终会生成一个MapAdapter实例。
    

    Map类源码

    def add(self, rulefactory):
        for rule in rulefactory.get_rules(self):
            rule.bind(self)
            self._rules.append(rule)
            self._rules_by_endpoint.setdefault(rule.endpoint, []).append(rule)
        self._remap = True
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    快速排序算法
    DirectX9(翻译):介绍
    奇葩的面试题
    新博客
    OpenCV2:幼儿园篇 第八章 视频操作
    编程规范:位运算
    编程规范:allocator
    深浅copy和浅copy
    模块和包
    递归函数
  • 原文地址:https://www.cnblogs.com/daviddd/p/11929493.html
Copyright © 2011-2022 走看看