我正在尝试使用严重依赖 Handlebars 模板系统的 ember.js 库用 javascript 编写应用程序。但是,我使用的 FLASK 也使用了 jinja 模板系统。
是否可以同时使用两个模板渲染器?还是我需要使用一个。任何有使用烧瓶和 ember.js 经验的人都知道哪个更容易被另一个替换?(也许把手更容易替换 Jinja,反之亦然)。
我正在尝试使用严重依赖 Handlebars 模板系统的 ember.js 库用 javascript 编写应用程序。但是,我使用的 FLASK 也使用了 jinja 模板系统。
是否可以同时使用两个模板渲染器?还是我需要使用一个。任何有使用烧瓶和 ember.js 经验的人都知道哪个更容易被另一个替换?(也许把手更容易替换 Jinja,反之亦然)。
请注意,这两个模板引擎位于不同的位置。Jinja2 将运行在服务器端,Handlebars 将运行在客户端。如果需要,您可以在不受干扰的情况下同时使用两者。
但是话虽如此,如果您拥有像 ember.js 这样的富客户端框架,则确实不需要使用服务器端模板。在您的情况下,Flask 服务器可能具有通过 ajax 请求将数据提供回 ember.js 客户端的路由,因此客户端确实是进行模板渲染的最佳场所。
您可以将代码段标记为{% raw %}
告诉 jinja2 忽略它。将您的 handlebars.js 模板包装在原始标签中,如下所示:
{% raw %}
<script id="foo-template" type="text/x-handlebars-template">
<p>{{foo}} - {{bar}}</p>
</script>
{% endraw %}
正如@Miguel 所说,如果您使用 ember.js,您实际上并不需要 Jinja2,我想如果您不想渲染这些模板,只需返回 flask.send_file('your html file here') 而不是返回 flask。 render_template('你的 html 文件在这里'). 有关更多详细信息,请参阅文档。
虽然我基本同意@Miguel 和@Ali,但我合作过的几家公司将 API 的 RESTful 模型与服务器生成的 HTML 混合在一起。[注意:使用 Ember 时不应该出现这种情况,但我正在当前客户端的代码库中使用 Flask / Jinja2 和 Backbone。]
根据可汗学院风格指南的一些阅读,我实际上找到了一个使用Pybars的解决方案:
@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 )))