拥有视图功能 - 如何在Flask中获取蓝图路径的URL?

时间:2016-01-13 11:06:28

标签: flask

我正在使用的缓存系统(Flask-Cache)使用URL来计算缓存密钥。从代码中的不同位置我传递一个视图函数,然后需要检查视图是否已被缓存。

首先,Flask-Cache的当前迭代需要计算缓存密钥的请求,但是我已经通过获取url_for(view_function.__name__, **kwargs)的URL来设置patch来修复简单情况的缺陷。

问题是,现在我已经开始使用Flask Blueprints了,只需在view_function.__name__中使用url_for就找不到蓝图路径(引发BuildError)。

Simple Flask app

@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')

Blueprint Flask app

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?

或者,如何在使用蓝图时制作可以使用的缓存键? (并且可以通过视图函数上的装饰器计算,并且当两个或多个蓝图具有相同名称的视图函数时不会发生冲突)

2 个答案:

答案 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 ...