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