flask/odoo/werkzeug的url mapping

本文深入探讨了Werkzeug库在Flask和Odoo中如何实现URL映射,从Map、MapAdapter、Rule到Endpoint的详细过程。通过源码分析,阐述了构建阶段的规则添加和匹配阶段的视图函数查找,对比了Flask的灵活性和Odoo的集中处理方式。
摘要由CSDN通过智能技术生成

参考:
Werkzeug库——routing模块
flask 源码解析:路由
odoo(8.0)源码
werkzeug(0.14.1)源码
flask(0.11.1)源码

一个web框架必须解决一个问题:当一个Request进入系统时,怎样去确定使用哪个函数或方法来处理。

Django自己处理这个问题。
Flask和Odoo(一个OpenERP)使用Werkzeug库(本身就是Flask的关联库)。

Werkzeug定义了三个类:
werkzeug.routing.Map
werkzeug.routing.MapAdapter
werkzeug.routing.Rule

Map的实例map存储所有的URL规则,这些规则就是Rule的实例rule

一、Map

add(self, rulefactory)
该方法会将传入的rule,通过rulebind方法来与map实例关联。并且,在map_rules属性中插入rule实例,在_rules_by_endpoint属性中,创建rule.endpointrule实例的关联。
具体代码如下:

    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

_rules_by_endpoint可见,一个endpoint可对应多个rule

bind(self, server_name, ..., path_info, ...)
返回一个MapAdapter实例map_adapter

bind_to_environ(self, environ, server_name=None, subdomain=None)
调用上述的bind方法,传入environ中的信息。比如说path_inforequest_method等等。

二、MapAdapter

该类执行具体的URL匹配工作。

__init__(self, map, server_name, script_name, subdomain, url_scheme, path_info, default_method, query_args=None)
初始化时,会处理传入的map

    def __init__(self, map, ...):
        self.map = map

match(self, path_info=None, method=None, return_rule=False, query_args=None)
通过传入的path_info(路径信息,若为None,则使用初始化时传入的path_info),和method(HTTP方法)来从self.map._rules中找到匹配的rule(通过调用rule.match(path, method)),从而返回ruleendpoint和一些参数rv

dispatch(self, view_func, path_info=None, method=None, catch_http_exceptions=False)
调用match方法,如果找到了对应的rule,则会执行该rule对应的view_func(视图函数)。

三、Rule

继承自RuleFactory

__init__(self, string, defaults=None, subdomain=None, methods=None, build_only=False, endpoint=None, strict_slashes=None, redirect_to=None, alias=False, host=None)
string就是url,另两个关键关键参数是endpointmethods

get_rules(self, m

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值