你可以使用两个HTML模板,如Handlebars和Jinja

时间:2013-06-26 18:41:31

标签: ember.js flask jinja2 handlebars.js

我正在尝试使用ember.js库在javascript中编写一个应用程序,该库很大程度上依赖于Handlebars模板系统。但是,我正在使用FLASK,它也使用jinja模板系统。

是否可以同时使用两个模板渲染器?或者我需要使用一个而不是另一个。任何有使用flask和ember.js经验的人都知道哪一个可能更容易替换另一个?(也许把手更容易替换Jinja,反之亦然)。

4 个答案:

答案 0 :(得分:10)

请注意,这两个模板引擎位于不同的位置。 Jinja2将在服务器端运行,Handlebars将在客户端运行。如果需要,你可以在没有干扰的情况下使用它们。

但话说回来,如果你有像ember.js这样的富客户端框架,就没有必要使用服务器端模板。在您的情况下,Flask服务器可能会有通过ajax请求将数据提供给ember.js客户端的路由,因此客户端实际上是模板呈现发生的最佳位置。

答案 1 :(得分:3)

您可以将代码段标记为{% raw %},以告知jinja2忽略它。将handlebars.js模板包装在原始标签中,如下所示:

{% raw %}
<script id="foo-template" type="text/x-handlebars-template">
    <p>{{foo}} - {{bar}}</p>
</script>
{% endraw %}

答案 2 :(得分:2)

正如@Miguel所说,如果你使用ember.js,你真的不需要Jinja2,我想知道如果你不想渲染这些模板,只需返回flask.send_file('你的html文件在这里')返回flask.render_template('你的html文件在这里')。有关详细信息,请参阅docs

答案 3 :(得分:1)

虽然我从根本上同意@Miguel和@Ali,但我合作的几家公司将REST的RESTful模型与服务器生成的HTML混合在一起。 [注意:使用Ember时不应该这样,但我在当前客户端的代码库中使用Flask / Jinja2和Backbone。]

根据Pybars的一些内容,我实际上找到了使用Khan Academy's style guide的解决方案:

@app.template_filter("handlebars")
def handlebars_filter(context, filepath):
    source = open( filepath, "r").read().decode('utf-8')
    template = pybars.Compiler().compile( source )

    return Markup( u"".join( template( context )))