具有查看功能–;如何在Flask中获取蓝图路由的URL?

具有查看功能–;如何在Flask中获取蓝图路由的URL?,flask,Flask,我使用的缓存系统()使用URL来计算缓存密钥。我从代码中的另一个位置获得了一个视图函数,然后需要检查视图是否已被缓存 首先,Flask Cache的当前迭代需要计算缓存键的请求,但我已经做了一个改进,通过使用URL\u获取(view\u function.\uu\u name\uu,**kwargs)的URL,解决了简单情况下的不足 问题是,现在我已经开始使用,只是简单地使用了view\u函数。的url\u中的\uu名称\uuuuuuuuuuu将找不到蓝图路由(引发构建错误) 简单烧瓶应用程序

我使用的缓存系统()使用URL来计算缓存密钥。我从代码中的另一个位置获得了一个视图函数,然后需要检查视图是否已被缓存

首先,Flask Cache的当前迭代需要计算缓存键的请求,但我已经做了一个改进,通过使用
URL\u获取(view\u function.\uu\u name\uu,**kwargs)
的URL,解决了简单情况下的不足

问题是,现在我已经开始使用,只是简单地使用了
view\u函数。
url\u中的\uu名称\uuuuuuuuuuu
将找不到蓝图路由(引发构建错误)

简单烧瓶应用程序
@app.route(“/user/”)
def用户页面(用户id):
返回“你好用户%s”%user\u id
def检查缓存(查看功能,**kwargs):
url=url(查看函数、名称、**kwargs)
... 使用URL检查缓存。。。
检查缓存(用户页面,用户id='123')
蓝图烧瓶应用程序
从flask导入蓝图
bp=蓝图(“用户蓝图”,“名称”)
@bp.route(“/user/”)
def用户页面(用户id):
返回“你好用户%s”%user\u id
def检查缓存(查看功能,**kwargs):
url=url(查看功能.uuu名称,**kwargs)#不适用于蓝图
... 使用URL检查缓存。。。
检查缓存(用户页面,用户id='123')
当路由/视图功能是通过蓝图定义的时,如何获取其URL


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

尝试使用
app.view\u函数

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

试用
app.view\u功能

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

默认情况下,Blueprints在端点名称前加上blueprint名称。这样,字符串的url_:

url = url_for('user_page')
变成:

url = url_for('user_blueprint.user_page')
现在,您正在为具有函数名的字符串创建url_,因此您可以切换到如上所述显式传递端点字符串,或者使用:

url = url_for('user_blueprint.' + view_function.__name__)

我不知道有什么编程方法可以从view_函数中自动找到blueprint名称。

默认情况下,Blueprints在端点名称前面加上blueprint名称。这样,字符串的url_:

url = url_for('user_page')
变成:

url = url_for('user_blueprint.user_page')
现在,您正在为具有函数名的字符串创建url_,因此您可以切换到如上所述显式传递端点字符串,或者使用:

url = url_for('user_blueprint.' + view_function.__name__)

我不知道有哪种编程方式可以从查看功能中自动找到蓝图名称。

也许可以从
app.url\u map
app.view\u功能
返回,但我不知道如何返回?(参考资料:)也许可以从
app.url\u map
app.view\u函数
返回,但我不知道如何返回?(参考:)最后一行正是我的问题:在Flask缓存中,我不知道view函数属于哪个蓝图。如果
请求
可用,您似乎可以通过
当前应用程序获取蓝图。蓝图[request.blueprint]
,但在我的用例中
请求
不可用(参考:),为什么您不能直接切换到使用url\u作为字符串?然后,您的check\u缓存将变成check\u缓存(url\u代表字符串,**kwargs):url=url\u代表字符串)…Flask缓存使用装饰器(通常调用为
@app.cache.cached
),因此只有实际可用的函数,而不是视图/端点/路由的名称。最后一行正是我的问题:在Flask缓存中,我不知道视图函数属于哪个蓝图。如果
请求
可用,您似乎可以通过
当前应用程序获取蓝图。蓝图[request.blueprint]
,但在我的用例中
请求
不可用(参考:),为什么您不能直接切换到使用url\u作为字符串?然后,您的check\u缓存将成为check\u缓存(url\u表示字符串,**kwargs):url=url\u表示字符串(url\u表示字符串)…Flask缓存使用装饰器(通常调用为
@app.cache.cached
),因此只有实际可用的函数,而不是视图/端点/路由的名称。这是正确的解决方案。我的下一个问题是,在
Flask Cache
内部,如果路由装饰器和缓存装饰器之间存在装饰器,则给定的view函数不一定引用存储在
app.view\u函数中的同一个函数。这是正确的解决方案。我的下一个问题是,在
Flask Cache
中,如果路由装饰器和缓存装饰器之间存在装饰器,那么给定的view函数不一定引用存储在
app.view\u函数中的同一个函数。