在函数内更改装饰器的参数

Change decorator's parameter inside function

我正在使用 flask-breadcrumbs add-on 作为 python flask 网络服务器, 但我认为这是 python 装饰器的更普遍的问题,

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

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

顺便说一下,“@register_breadcrumb”的第三个输入是面包屑项标题,我希望它根据 "Accept-language" 标志进行本地化。

有关 add-on 的更多信息:http://flask-breadcrumbs.readthedocs.io/en/latest/

谢谢:)

无法从函数内部将参数传递给函数的装饰器,因为装饰器在函数定义之前执行。可以找到关于装饰器如何工作的指南 here and here - 本质上,装饰器是一个函数,它传递给它下面的函数,然后 returns 一个应该插入到命名空间中的函数。

举个例子比较简单:

>>> 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 功能来完成您想要的操作。看起来您可以定义一个要调用的函数,其中 returns 文本和面包屑最后一个组件的 URL,并且可以从该函数访问 request 对象;希望这足以确定用户的语言。