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)
| 归档时间: |
|
| 查看次数: |
10128 次 |
| 最近记录: |