日常在使用flask网站的时候,经常对接口要进行权限设置,如果多个装饰器之间要进行传值,那么我们可以将这个值挂载到flask中自带的全局变量g上,然后在下一个装饰器使用,代码示例如下:
from functools import wraps
from flask import Flask, g
app = Flask(__name__)
def decorator1(func):
@wraps(func)
def wrapper(*args, **kwargs):
g.my_func = func_test # 将函数对象保存到 g 对象中
return func(*args, **kwargs)
return wrapper
def decorator2(func):
@wraps(func)
def wrapper(*args, **kwargs):
my_func = g.my_func # 从 g 对象中获取函数对象
return my_func(*args, **kwargs)
return wrapper
@app.route('/')
@decorator1
@decorator2
def index():
return "Hello, Flask!"
if __name__ == '__main__':
app.run()
注意:在 Flask 中,使用 g
对象来共享数据是安全的,因为每个请求都有自己的上下文,并且 g
对象只在当前请求的上下文中共享。
如果想向装饰器内传值,则需在装饰器外包一层函数,示例代码如下:
from functools import wraps
from flask import Flask, g
app = Flask(__name__)
def decorator1(func):
@wraps(func)
def wrapper(*args, **kwargs):
g.my_func = func_test # 将函数对象保存到 g 对象中
return func(*args, **kwargs)
return wrapper
def decorator2(func):
@wraps(func)
def wrapper(*args, **kwargs):
my_func = g.my_func # 从 g 对象中获取函数对象
return my_func(*args, **kwargs)
return wrapper
def test(value):
def decorator3(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("value:",value) #获取调用装饰器传递的值
return my_func(*args, **kwargs)
return wrapper
@app.route('/')
@decorator1
@decorator2
@test
def index():
return "Hello, Flask!"
if __name__ == '__main__':
app.run()