我以与此处相同的方式实现了一个装饰器 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
我该如何解决这个问题?
更新
蓝图是继承Blueprint类的类。 所以我实现了方法
def my_decorator(self, fn):
@wraps(fn)
def decorator(*args, **kwargs):
value = kwargs['value']
# do stuff with value
return fn(*args, **kwargs)
return decorator
但仍然是一个未知的密钥......
答案 0 :(得分:20)
装饰器在导入时执行,它们基本上是语法糖:
@foo(bar)
def baz():
return 'w00t!'
相当于
def baz():
return 'w00t!'
baz = foo(bar)(baz)
因此,在上面的示例中,变量bar
必须存在于此模块的全局范围内,然后才能作为参数传递给装饰器。这就是你所得到的错误告诉你的。
<强>更新强>
根据下面的讨论,问题中的代码应该拦截传递给视图函数的值并对其执行某些操作。这是一个演示它的例子:
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