加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 一个Flask装饰器怎么有参数?

发布时间:2020-12-16 23:15:13 所属栏目:Python 来源:网络整理
导读:我以与这里相同的方式实现了装饰器 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 我
我以与这里相同的方式实现了装饰器
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

但仍然是一个uknown的关键…

解决方法

装修者在进口时执行,基本上是语法糖:
@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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读