gpt4 book ai didi

python - Flask 装饰器怎么会有参数?

转载 作者:太空狗 更新时间:2023-10-29 17:58:06 25 4
gpt4 key购买 nike

我用和这里一样的方式实现了一个装饰器 How to make a python decorator function in Flask with arguments (for authorization)但是问题还是没有解决...

我用装饰器实现了这个功能

@blueprint.route('<var>')
@blueprint.my_decorator(var)
def function(var):
do stuff

我得到了这个错误

NameError: global name 'var' is not defined

我该如何解决?


更新

蓝图是继承蓝图类的类。所以我实现了方法

def my_decorator(self, fn):
@wraps(fn)
def decorator(*args, **kwargs):
value = kwargs['value']
# do stuff with value
return fn(*args, **kwargs)
return decorator

但是这个值仍然是一个未知的键...

最佳答案

装饰器在导入时执行,它们本质上是语法糖:

@foo(bar)
def baz():
return 'w00t!'

相当于

def baz():
return 'w00t!'
baz = foo(bar)(baz)

因此在上面的示例中,变量 bar 在作为参数传递给装饰器之前必须存在于该模块的全局范围内。这就是您遇到的错误告诉您的内容。


更新

根据下面的讨论,问题中的代码应该拦截传递给 View 函数的值并对其进行处理。这是一个演示它的例子:

from functools import wraps
from flask import Flask, abort

app = Flask(__name__)

def foobar(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
value = kwargs['value']
# Do something with value...
if value == 'foobar':
abort(400)
return fn(*args, **kwargs)
return decorated_view

@app.route('/<value>')
@foobar
def view(value):
return value

关于python - Flask 装饰器怎么会有参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13931633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com