我希望在我的应用程序中使用某种设计模式,但我不确定我的模式是否真的适合于烧瓶机制。我只是核实一下,我并没有忽视现有的解决办法。
我希望有一个顶层视图来呈现另一个代理请求的响应。问题是,我不是代理外部URL,而是从同一个应用程序中查看(有点像依赖于其他蓝图的蓝图)。类似于'render_template()‘函数,我正在寻找类似于render_view,甚至更好的*request_view_as_string*。然后,我需要处理响应和重新呈现。
我正在尽我最大的能力使用模板继承(jinja2),但我的大部分困难来自于模板块之间的大量非模板处理。我仍然对忍者有一种感觉,我的模板开始受到黑客的污染。
编辑
基本上,我误解了忍者的角色。我的应用程序需要在jinja上构建更重的程序。我一直试图尽可能快地进出jinja,这就是我嵌套的依赖关系开始造成问题的地方。最终,我的“子视图”所需的大部分功能都是内置到Jinja中的,我只是不知道如何将它们与FLask进行适当的集成。
发布于 2013-07-10 05:42:19
首先,Jinja2支持macros,它允许您在模板之间共享功能:
{# helpers.jinja #}
{% macro generate_select(itrbl) %}
<select{{kwargs|xmlattrs}}>
{% for item in itrbl %}
<option value="{{item.value}}">{{item.text}}</option>
{% endfor %}
</select>
{% endmacro %}
{# page1.jinja #}
{% import "helpers.jinja" as helpers %}
{{ helpers.generate_select(data, name="my_data_field") }}对于更复杂的功能(A /B测试,根据用户帐户启用的内容加载不同的功能,等等),extends、include和import可以采用可变值:
{# A custom template with a *lot* of hooks #}
{% extends base_template %}
{% import custom_functionality_provider as provider %}
{% block common_name %}
{% if features.feature_x %}
{% include feature_x_include %}
{% endif %}
{{ provider.operation() }}
{% endblock common_name %}@app.route("/some-route")
def some_route():
# Of course, in real life you would determine these values
# on the basis of user / condition lookups, rather than
# hardcoding values in your render_template call
render_template("custom.jinja", base_template="AB/A/base.jinja",
custom_functionality_provider="macros/lowcostplan.jinja",
feature_x_include="AB/A/features/feature_x.jinja",
features=some_features_object)最后,您可以将返回字符串的调用传递给任何Jinja模板,使您能够访问Python的全部功能:
def custom_implimentation_a(**context_args):
return render_template("template_a.jinja", **context_args)
def custom_implimentation_b(**context_args):
return render_template("template_b.jinja", **context_args)
@app.route("/some-route")
def some_route():
if condition:
provider = custom_implimentation_a # Note, no parenthesis
else:
provider = custom_implimentation_b
return render_template("some_page.jinja", provider=provider)发布于 2013-07-20 03:21:46
我确实认为Sean的第一个答案是最合适的,但我确实遇到了这个小机制,因为Jinja使Python任务变得有点困难。
http://werkzeug.pocoo.org/docs/local/
这应该比烧瓶的g变量更有效率。还请参阅略有不同的用法(当一个全局“命名空间”不再可管理时)
http://flask.pocoo.org/snippets/13/
我经常忘记,酒瓶和韦尔克祖是相关的项目。这样做的巨大好处是,它们的许多功能与其他项目没有重叠。
当你的新手从酒瓶边靠近时,如果你觉得烧瓶漏掉了几个齿轮,那很有可能是因为他们已经把它们包括在Werkzeug中了。
https://stackoverflow.com/questions/17562664
复制相似问题