Flask装饰器如何有参数?

时间:2012-12-18 11:09:45

标签: python decorator flask

我以与此处相同的方式实现了一个装饰器 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

但仍然是一个未知的密钥......

1 个答案:

答案 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