在函数内更改装饰器的参数
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
对象;希望这足以确定用户的语言。
我正在使用 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
对象;希望这足以确定用户的语言。