如何从 Frozen-Flask 有条件地导入 relative_url_for
How to import relative_url_for conditionally from Frozen-Flask
我正在使用 Flask that I want to freeze using Frozen-Flask 创建一个网站,但也有网站 运行 上线。
我已经关注 the documentation 并仅在冻结站点时将 FREEZER_RELATIVE_URLS
配置选项设置为 True
。此功能正常,在模板引擎中将 url_for
替换为 relative_url_for
。
仅当设置了配置选项时,我如何才能在我的 Python 代码中使用 relative_url_for
?
我想我需要这样的东西:
if config['FREEZER_RELATIVE_URLS']:
from flask_frozen import relative_url_for as url_for
else:
from flask import url_for
但是,如果我尝试使用 views.py
中的其他导入访问 flask.current_app.config
,我会收到错误消息:RuntimeError: working outside of application context
.
您正在尝试在视图之外访问 current_app
,因此没有应用上下文可以告诉 Flask current_app
指向什么。创建一个辅助函数,它将在调用时选择调用哪个 url 函数,而不是在导入时决定。
from flask import current_app, url_for as live_url_for
from flask_frozen import relative_url_for
def url_for(endpoint, **values):
if current_app.config['FREEZER_RELATIVE_URLS']:
return relative_url_for(endpoint, **values)
return live_url_for(endpoint, **values)
在您的视图中使用此 url_for
帮助器而不是其他两个函数。您还可以用此函数替换 Jinja 模板中使用的 url_for
函数。
# during app creation
from helpers import url_for
app.add_template_global(url_for)
app.context_processor(lambda: {'url_for': url_for})
我正在使用 Flask that I want to freeze using Frozen-Flask 创建一个网站,但也有网站 运行 上线。
我已经关注 the documentation 并仅在冻结站点时将 FREEZER_RELATIVE_URLS
配置选项设置为 True
。此功能正常,在模板引擎中将 url_for
替换为 relative_url_for
。
仅当设置了配置选项时,我如何才能在我的 Python 代码中使用 relative_url_for
?
我想我需要这样的东西:
if config['FREEZER_RELATIVE_URLS']:
from flask_frozen import relative_url_for as url_for
else:
from flask import url_for
但是,如果我尝试使用 views.py
中的其他导入访问 flask.current_app.config
,我会收到错误消息:RuntimeError: working outside of application context
.
您正在尝试在视图之外访问 current_app
,因此没有应用上下文可以告诉 Flask current_app
指向什么。创建一个辅助函数,它将在调用时选择调用哪个 url 函数,而不是在导入时决定。
from flask import current_app, url_for as live_url_for
from flask_frozen import relative_url_for
def url_for(endpoint, **values):
if current_app.config['FREEZER_RELATIVE_URLS']:
return relative_url_for(endpoint, **values)
return live_url_for(endpoint, **values)
在您的视图中使用此 url_for
帮助器而不是其他两个函数。您还可以用此函数替换 Jinja 模板中使用的 url_for
函数。
# during app creation
from helpers import url_for
app.add_template_global(url_for)
app.context_processor(lambda: {'url_for': url_for})