首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶- SubViews

烧瓶- SubViews
EN

Stack Overflow用户
提问于 2013-07-10 04:53:48
回答 2查看 1.1K关注 0票数 3

我希望在我的应用程序中使用某种设计模式,但我不确定我的模式是否真的适合于烧瓶机制。我只是核实一下,我并没有忽视现有的解决办法。

我希望有一个顶层视图来呈现另一个代理请求的响应。问题是,我不是代理外部URL,而是从同一个应用程序中查看(有点像依赖于其他蓝图的蓝图)。类似于'render_template()‘函数,我正在寻找类似于render_view,甚至更好的*request_view_as_string*。然后,我需要处理响应和重新呈现。

我正在尽我最大的能力使用模板继承(jinja2),但我的大部分困难来自于模板块之间的大量非模板处理。我仍然对忍者有一种感觉,我的模板开始受到黑客的污染。

编辑

基本上,我误解了忍者的角色。我的应用程序需要在jinja上构建更重的程序。我一直试图尽可能快地进出jinja,这就是我嵌套的依赖关系开始造成问题的地方。最终,我的“子视图”所需的大部分功能都是内置到Jinja中的,我只是不知道如何将它们与FLask进行适当的集成。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-10 05:42:19

首先,Jinja2支持macros,它允许您在模板之间共享功能:

代码语言:javascript
复制
{# 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测试,根据用户帐户启用的内容加载不同的功能,等等),extendsincludeimport可以采用可变值:

代码语言:javascript
复制
{# 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 %}

代码语言:javascript
复制
@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的全部功能:

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2013-07-20 03:21:46

我确实认为Sean的第一个答案是最合适的,但我确实遇到了这个小机制,因为Jinja使Python任务变得有点困难。

http://werkzeug.pocoo.org/docs/local/

这应该比烧瓶的g变量更有效率。还请参阅略有不同的用法(当一个全局“命名空间”不再可管理时)

http://flask.pocoo.org/snippets/13/

我经常忘记,酒瓶和韦尔克祖是相关的项目。这样做的巨大好处是,它们的许多功能与其他项目没有重叠。

当你的新手从酒瓶边靠近时,如果你觉得烧瓶漏掉了几个齿轮,那很有可能是因为他们已经把它们包括在Werkzeug中了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17562664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档