更改装饰器内部功能的参数

时间:2016-09-05 15:33:19

标签: python python-2.7 flask breadcrumbs

我正在使用用于python flask web服务器的flask-breadcrumbs附加组件, 但我认为这是python装饰的更普遍的问题,

@app.route('/dashboard')
@register_breadcrumb(app, '.', parameter)
def render_dashboard_page():
 ...

是否可以设置"参数"来自函数" render_dashboard_page"? 我需要根据" Accept-language"来选择参数。请求的标志,只有在方法被触发后才能确定。

顺便说一下," @ register_breadcrumb"的第3个输入是breadcrumb项目标题,我希望它基于" Accept-language"标志。

有关加载项的更多信息:http://flask-breadcrumbs.readthedocs.io/en/latest/

谢谢:)

1 个答案:

答案 0 :(得分:1)

不可能从函数内部向函数的decorator传递参数,因为装饰器在定义函数之前执行。关于装饰器如何工作的指南可以找到herehere - 本质上,装饰器是一个传递它下面的函数的函数,然后返回一个应该插入到命名空间中的函数。 / p>

更容易举个例子:

>>> def add_one(fn):
...     print("add_one called")
...     def wrap(n):
...         print("wrap called")
...         return fn(n) + 1
...     return wrap
>>> @add_one
... def times_by_two(n):
...     print("times_by_two called")
...     return n * 2
add_one called
>>> times_by_two(21)
wrap called
times_by_two called
43

我不完全确定Flask插件的工作原理,但您可以使用variable rules功能来执行您想要的操作。看起来您可以定义一个要调用的函数,该函数返回文本和面包屑的最后一个组件的URL,并且可以从该函数访问request对象;希望这足以确定用户的语言。