路由系统
路由的两种写法
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)不加装饰器使用