Flask装饰器如何有参数?

d3m*_*d3m 13 python decorator flask

我以与此处相同的方式实现了一个装饰器 如何在Flask中使用参数(用于授权)创建一个python装饰器函数 但问题仍未解决...

我有装饰器的这个功能

@blueprint.route('<var>')
@blueprint.my_decorator(var)
def function(var):
    do stuff
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

NameError: global name 'var' is not defined
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?


更新

蓝图是继承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
Run Code Online (Sandbox Code Playgroud)

但仍然是一个未知的关键...

Aud*_*kas 22

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

@foo(bar)
def baz():
    return 'w00t!'
Run Code Online (Sandbox Code Playgroud)

相当于

def baz():
   return 'w00t!'
baz = foo(bar)(baz)
Run Code Online (Sandbox Code Playgroud)

因此,在上面的示例中,变量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
Run Code Online (Sandbox Code Playgroud)

  • 由于装饰器不接受任何参数,因此不能回答这个问题. (3认同)
  • 这并没有回答问题,没有参数传递到装饰器中......在 @d3m 的示例中,他需要传递 `var` 。 (2认同)