1、中间件
可以全局的控制请求和响应
Flask的中间件在蓝图中提供了封装好的装饰器,直接使用即可,开发者也可以自定义全局装饰器
全局装饰器
装饰器 | 描述 |
---|---|
before_request | 有返回值,就地返回,不执行视图。 不写返回值(return),或者return None,再执行视图 |
after_request | 必须有返回值 |
template_global | 装饰器函数直接在模板中可以以变量全局使用 |
template_filter | 装饰器函数直接在模板中可以以过滤器全局使用 |
1.1 使用蓝图提供的装饰器
# 调用蓝图的装饰器
@bule_print.add_app_template_global
def page_process():
user_id = request.cookies.get("user_id")
user = Person.query.get(int(user_id))
result = {
"username": user.nickname,
"job": ""
}
job = user.person_job_map.j_name
result["job"] = job
return result
在项目中调用去全局变量
<li>欢迎您:{{ page_process().username }} {{ page_process().job }}</li>
1.2 自定义全局装饰器
创建的过程和过滤器很像
1.2.1 定义函数
from flask import session
from BluePrint.user.models import *
def middleware_template():
# 数据
data = {
"show_subordinate": True, # 是否显示下属考勤
"show_news": True, # 是否显示新闻管理
"show_person": True, # 是否显示职员管理
"show_permission": True, # 是否显示权限管理
}
# 当前用户
username = session.get("username")
person = Person.query.filter(Person.username == username).first()
# 新闻管理权限
p_news = Permission.query.get(1)
# 人事管理权限
p_person = Permission.query.get(2)
# 权限管理权限
p_permission = Permission.query.get(4)
data["show_subordinate"] = True if person.person_position_map.level > 1 else False # 是否显示下属
data["show_news"] = True if person.person_position_map in p_news.permission_position_map else False # 是否显示新闻
data["show_person"] = True if person.person_position_map in p_person.permission_position_map else False # 是否显示职员管理
data["show_permission"] = True if person.person_position_map in p_permission.permission_position_map else False # 是否显示权限管理
# 返回
return data
1.2.2 注册
# app注册装饰器
from BluePrint.middleware import middleware_template
app.add_template_global(middleware_template, "middleware_template")
1.2.3 使用
{% if middleware_template().show_news %}
<li>
<a href="/news"><i class="fa fa-envelope-o fa-fw"></i> 新闻管理</a>
</li>
{% endif %}
{% if middleware_template()["show_permission"] %}
<li>
<a href="/permission"><i class="fa fa-table fa-fw"></i> 权限管理</a>
</li>
{% endif %}