路由系统
路由的两种写法
1
| app.add_url_rule('/index', 'index', index)
|
路由加载源码的流程
将URL和函数打包成为Rule对象
将Rule对象添加到map对象中
app_url_map = map对象
动态路由
1 2 3
| @app.route('/index/<string:name>') def index(name): return f'{name}'
|
uuid类型 类似于xxxxx-xxxxxxx-xxxxxx-xxxxxx
自定义路由
必须继承BaseConverter
1 2 3 4 5 6 7 8 9 10 11
| from werkzeug.routing import BaseConverter class RegexConverter(BaseConverter): def __init__(self, map, regex): super().__init__(map) self.regex = regex
def to_python(self, value): return value
app.url_map.converters['regex'] = RegexConverter
|
视图
FBV
1
| @app.route('/user', method=['GET', 'POST'])
|
CBV
1 2 3 4 5 6 7 8 9 10 11
| class UserView(views, MethodView): method = ['GET', 'POST'] decorators = [test1, test2] //CBV添加装饰器 def get(self): return 'get'
def post(self): return 'post'
app.add_url_rule('/user', view_func=UserView.as_view('user'))
|
模板(jinja2)
基本用法
模板可继承
被继承:
{% block content %} ? {% endbloack %}
继承:
{% extends 'layout.html' %} {% block content %} ? {% endbloack %}
引入:
{% include 'from.html' %}
1 2 3 4
| def dunc(arg): return arg
render_template('md.html', nums=nums, f=func) //可以传递函数名
|
定义全局模板方法
1 2 3 4 5 6 7 8 9 10 11
| @app.template_glabol() //模板中全局使用 {{ func('haha') }} def func(arg): return arg
@app.template_filter() //模板全局使用 {{ 'haha'|f('e') }} def f(arg,h): return arg + h
@app.route('/md/hg') def index(): return render_template('md_hg.html')
|
如果想要将一个方法限制为一个蓝图域中使用,只需将app修改即可
特殊装饰器
1 2 3 4 5 6 7 8 9 10 11 12
| @app.before_request //视图函数运行前运行 def f1():// 一旦返回值为真,则停止行为向下传播(判断用户登录等), 反之空,则继续 print('f1')
@app.after_request //视图函数运行结束后运行 def f2(response): //视图函数有返回值,就必须返回一个Responce print('f2') return response
@app.route('/index') def index(): return render_template('index.html')
|
或
app.before_request(func)
不加装饰器使用