繁体   English   中英

Flask装饰器如何有参数?

[英]How can a Flask decorator have arguments?

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

我的装饰器具有此功能

@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM