路由系统 为何如此简洁高效

flask路由系统

先来看一下falsk是如何定义路由:

from flask import Flask, escape, request

app = Flask(__name__)

@app.route('/')
def hello():
    name = request.args.get("name", "World")
    return f'Hello, {escape(name)}!'

通过代码可知,app.route是定义路由的装饰器,其源码实现为:

class Flask(_PackageBoundObject):

    @setupmethod
    def add_url_rule(self, rule, endpoint=None, view_func=None, provide_automatic_options=None, **options):
        """
        删除枝叶代码,保留主干
        """
        if endpoint is None:
            endpoint = _endpoint_from_view_func(view_func)

        options["endpoint"] = endpoint
        methods = options.pop("methods", None)

        if methods is None:
            methods = getattr(view_func, "methods", None) or ("GET",)

        methods = set(item.upper() for item in methods)

        required_methods = set(getattr(view_func, "required_methods", ()))

        methods |= required_methods

        rule = self.url_rule_class(rule, methods=methods, **options)
        rule.provide_automatic_options = provide_automatic_options

        self.url_map.add(rule)
        if view_func is not None:
            old_func = self.view_functions.get(endpoint)
            if old_func is not None and old_func != view_func:
                raise AssertionError(
                    "View function mapping is overwriting an "
                    "existing endpoint function: %s" % endpoint
                )
            self.view_functions[endpoint] = view_func


    def route(self, rule, **options):

        def decorator(f):
            endpoint = options.pop("endpoint", None)
            self.add_url_rule(rule, endpoint, f, **options)
            return f

        return decorator

由代码可知,route函数其实调用add_url_rule函数。基本参数为:rule methods enpoint等;
add_url_rule的作用主要构造路由相关逻辑,包含werkzeugrouting模块的Map类和Rule类。
url_map就是Map类的实例化对象,ruleRule的实例化对象,实例化的同时将rule和endpint的关系绑定,同时将rule对象传递给self.url_map的add函数,同时更新view_functions字典,将enpointview_func的对应关系更新进去。

rule[本质是url]view_func的对应关系由endpoint进行匹配的,此时endpoint如果用户未定义的话,默认是view_func__name__属性,即view_func的名称;

简单的两个函数,就把整个路由逻辑处理的很完美,这又体现出flask微框架的简单高效。

到此,路由相关的处理逻辑就结束了;

「真诚赞赏,手留余香」

roc

请我喝杯咖啡?

使用微信扫描二维码完成支付