Flask 源碼解析之 route 規則的實現

Flask 的 route 的原理如果大家去看 flask 庫的第一個commit,可能會很好理解,現在的Flask 也是延續了這個設計,源碼如下:

def route(self, rule, **options):
    """A decorator that is used to register a view function for a
    given URL rule.  Example::

        @app.route('/')
        def index():
            return 'Hello World'
    """
    def decorator(f):
        if 'endpoint' not in options:
            options['endpoint'] = f.__name__
        self.url_map.add(Rule(rule, **options))
        self.view_functions[options['endpoint']] = f
        return f
    return decorator

在項目中生成 Flask 的實例 app 的時候,app 會初始化以下三個實例屬性,可以將 url_rule 路由到應該執行的view_function(通過url_map匹配到正確的endpoint, 再通過endpoint找到應該執行的view_function):

- view_functions :存儲格式爲 {'endpoint': <view_function對象>}
- url_map :存儲格式爲 {Rule(rule, **options): 'endpoint'}
- url_rule_class 存儲了 url 和 指定的請求方式,存儲格式如下:
    Rule '/hello' (HEAD, OPTIONS, GET) 
    代表 url 爲 host/hello 的 允許請求方式有 HEAD, OPTIONS, GET

那麼藍圖的 route 是怎麼實現的呢?

藍圖中的路由規則是調用了app.add_url_rule來將規則添加到 view_functions 和 url_map中,格式爲:

- view_functions {"%s.%s" % (self.blueprint.name, endpoint): <view_function對象>}
- url_map {Rule(rule, **options): "%s.%s" % (self.blueprint.name, endpoint)}

add_url_rule 的可傳入參數如下:

def add_url_rule(
        self,
        rule,
        endpoint=None,
        view_func=None,
        provide_automatic_options=None,
        **options
    ):

ps:

  • endpoint 默認爲 view_function.name
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章