我正在使用的缓存系统(Flask-Cache)使用URL来计算缓存密钥。从代码中的不同位置我传递一个视图函数,然后需要检查视图是否已被缓存。
首先,Flask-Cache的当前迭代需要计算缓存密钥的请求,但是我已经通过获取url_for(view_function.__name__, **kwargs)
的URL来设置patch来修复简单情况的缺陷。
问题是,现在我已经开始使用Flask Blueprints了,只需在view_function.__name__
中使用url_for
就找不到蓝图路径(引发BuildError)。
@app.route('/user/<user_id>')
def user_page(user_id):
return 'Hello user %s' % user_id
def check_cache(view_function, **kwargs):
url = url_for(view_function.__name__, **kwargs)
... use URL to check cache ...
check_cache(user_page, user_id='123')
from flask import Blueprint
bp = Blueprint('user_blueprint', __name__)
@bp.route('/user/<user_id>')
def user_page(user_id):
return 'Hello user %s' % user_id
def check_cache(view_function, **kwargs):
url = url_for(view_function.__name__, **kwargs) # WON'T WORK WITH BLUEPRINTS
... use URL to check cache ...
check_cache(user_page, user_id='123')
如何通过蓝图定义路径/视图功能的URL?
或者,如何在使用蓝图时制作可以使用的缓存键? (并且可以通过视图函数上的装饰器计算,并且当两个或多个蓝图具有相同名称的视图函数时不会发生冲突)
答案 0 :(得分:2)
默认情况下,蓝图会在端点名称前加上蓝图名称。这样,url_for字符串:
url = url_for('user_page')
变为:
url = url_for('user_blueprint.user_page')
现在,您正在使用函数名创建url_for字符串,因此您可以切换到如上所述显式传递端点字符串,或使用:
url = url_for('user_blueprint.' + view_function.__name__)
我不知道从view_function中自动查找蓝图名称的编程方法。
答案 1 :(得分:1)
尝试使用app.view_functions
def check_cache(view_function, **kwargs):
flipped_view_functions_dict = dict((v, k) for k, v in app.view_functions.iteritems())
view_name = flipped_view_functions_dict[view_function]
url = url_for(view_name, **kwargs)
... use URL to check cache ...