Python 烧瓶装饰师怎么会有参数?

Python 烧瓶装饰师怎么会有参数?,python,decorator,flask,Python,Decorator,Flask,我以与这里相同的方式实现了一个装饰器 但问题仍然没有解决 我有这个函数和装饰 @blueprint.route('<var>') @blueprint.my_decorator(var) def function(var): do stuff 我如何解决这个问题 更新 blueprint是继承blueprint类的类。 所以我实现了这个方法 def my_decorator(self,fn): @包装(fn) def装饰器(*args,**kwargs): value=k

我以与这里相同的方式实现了一个装饰器 但问题仍然没有解决

我有这个函数和装饰

@blueprint.route('<var>')
@blueprint.my_decorator(var)
def function(var):
    do stuff
我如何解决这个问题


更新

blueprint是继承blueprint类的类。 所以我实现了这个方法

def my_decorator(self,fn):
@包装(fn)
def装饰器(*args,**kwargs):
value=kwargs['value']
#做有价值的事
返回fn(*args,**kwargs)
返回装饰器

但该值仍然是一个uknown键…

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

@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
从functools导入包装
从烧瓶导入烧瓶,中止
app=烧瓶(名称)
def foobar(fn):
@包装(fn)
def装饰视图(*args,**kwargs):
value=kwargs['value']
#做一些有价值的事情。。。
如果值==“foobar”:
中止(400)
返回fn(*args,**kwargs)
返回视图
@应用程序路径(“/”)
@福巴
def视图(值):
返回值

那么我如何才能使var等同于“”?不确定我是否在跟踪您。你能解释一下你想用自己的装饰器实现什么吗?我想根据url变量编辑一些html元素。哦,我想我现在明白了。不,你不是这样做的。decorator接受的参数在函数定义时传递。如果您想截取视图函数得到的参数,您需要在装饰器代码中执行此操作。我将用工作示例更新我的答案以演示这一点。这不会回答问题,因为装饰师不接受任何参数。如果答案正确回答了您的问题,您应该接受答案。:)
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