Flask路由原理分析

2017-03-12  本文已影响0人  Jakiro

本文大致梳理一下Flask框架在处理url路由时的主要过程。

类图

路由类图

route装饰器

在Flask应用中,我们一般通过decorator装饰view函数,来注册一个路由,表示url和处理函数的对应关系,例如:

@app.route('/')
def index():
      return 'Hello World'

route装饰器定义如下, 其本质是调用了Flask对象的add_url_rule函数:

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    

add_url_rule函数签名为def add_url_rule(self, rule, endpoint=None, view_func=None, **options),其主要做了以下4件事情:

werkzeug中的Rule、Map和MapAdapter对象

  1. 一个Rule对象代表一个url模式,其中重要的字段为:
  1. 一个Map对象包含了所有Rule对象集合,以及一些配置参数,其中重要的字段为:
  1. MapAdapter对象由Map对象的bind或bind_to_environ方法创建(与Rule的bind方法不同,后者是Rule与Map绑定),在RequestContext对象初始化时,会将请求参数environ传给Map对象创建MapAdapter对象,保存在url_adapter字段中,其主要字段和方法为:

请求路由过程

  1. Flask应用初始化过程
    此过程主要通过route装饰器(或直接调用add_url_rule方法)创建好Rule对象,并添加到Map对象中
  2. 请求分发过程
    def match_request(self):
        try:
            url_rule, self.request.view_args = \
                self.url_adapter.match(return_rule=True)
            self.request.url_rule = url_rule
        except HTTPException as e:
            self.request.routing_exception = e
上一篇 下一篇

猜你喜欢

热点阅读