路由系统
-
路由的两种写法
1.第一种方法: def index(): return render_template('index.html') app.add_url_rule('/index', 'index', index) 2. 公司里一般用这种方式 @app.route('/login') def login(): return render_template('login.html')
解析
1. 第一种方法中执行"add_url_rule"方法,这个方法里边需要的参数解析: def add_url_rule( self, rule, endpoint=None, view_func=None, provide_automatic_options=None, **options ): self:是当前这个app对象; rule: 当前这个路由:'/login' endpoint: 当前这个视图的别名; view_func: 指定执行的视图函数 2.第二种:@app.route('/login'),第二种的这个方法其实内部都是调用了"add_url_rule"这个方法;内部实现都是一样的。
-
路由加载的源码流程
- 将url和函数打包成为 rule 对象 # rule = self.url_rule_class(rule, methods=methods, **options) - 将rule对象添加到map对象中。 # self.url_map.add(rule) - app.url_map = map对象 # self.url_map = self.url_map_class()
-
动态路由
@app.route('/login') def login(): return render_template('login.html') @app.route('/login/<name>') def login(name): print(type(name)) return render_template('login.html') @app.route('/login/<int:name>') def login(name): print(type(name)) return render_template('login.html')
-
支持正则表达式的路由
from flask import Flask,render_template app = Flask(__name__) from werkzeug.routing import BaseConverter class RegConverter(BaseConverter): def __init__(self, map, regex): super().__init__(map) self.regex = regex app.url_map.converters['regex'] = RegConverter @app.route('/index/<regex("d+"):x1>') def index(x1): return render_template('index.html') if __name__ == '__main__': app.run()
DEFAULT_CONVERTERS = {
"default": UnicodeConverter,
"string": UnicodeConverter,
"any": AnyConverter,
"path": PathConverter,
"int": IntegerConverter,
"float": FloatConverter,
"uuid": UUIDConverter,
}
1. flask中提供了这些动态路由的方法,针对不同的值有着不同的操作方法,装换成不同的类型值;
2. 并且flask也支持自定义的正则表达式的路由