2013-06-26 31 views
7

我正在嘗試在javascript中使用ember.js庫編寫應用程序,該庫非常依賴Handlebars模板系統。不過,我正在使用也使用jinja模板系統的FLASK。您可以使用兩個HTML模板,如Handlebars和Jinja

是否可以同時使用兩個模板渲染器?或者我需要一個在另一個之上。任何有使用flask和ember.js的經驗的人都知道哪一個可能更容易替換另一個?(也許把柄替換Jinja更容易,反之亦然)。

回答

7

請注意,這兩個模板引擎位於不同的地方。 Jinja2將在服務器端運行,Handlebars將在客戶端運行。如果需要,您可以使用兩者而不受干擾。

但是有了這樣的說法,如果您擁有像ember.js這樣的富客戶端框架,實際上不需要使用服務器端模板。在你的情況下,Flask服務器可能會有通過ajax請求將數據提供給ember.js客戶端的路由,所以客戶端真的是模板渲染髮生的最佳位置。

+0

我正在使用node.js作爲服務器,並且正在使用混合了jade和把手模板。玉仍然給我,最重要的是我的設計師和另一個非技術人員一個非常簡單的文件來編輯。 (他們仍然可以編輯原始html,但是jade只是非常乾淨)當我必須把handlebars動作和鏈接到的時候,我只需在模板中使用原始html。爲我們工作得很好。 – WallMobile

+8

最好的網絡應用程序(最高性能)在首次加載時呈現完整的HTML頁面,然後使用客戶端渲染來更新它。依靠客戶端完全引導初始頁面會顯着增加頁面負載(必須進行後續的Ajax調用)。 –

+0

需要注意的是 - 把手可以在任何一邊進行渲染,但Jinja在客戶端很少見。 – cwallenpoole

2

正如@Miguel所說的,如果你使用ember.js,你不需要Jinja2,我想如果你不想渲染這些模板,只需返回flask.send_file('你的html文件在這裏')而是返回flask.render_template('你的html文件在這裏')。請參閱docs瞭解更多詳情。

+2

將html文件處理爲靜態文件更好。在開發過程中,Flask可以直接從「靜態」文件夾提供它們。在製作過程中,您的Web服務器應該繞過Flask提供這些文件。你應該只使用Flask作爲ajax請求。祝你的項目好運! – Miguel

1

雖然我基本上都同意@Miguel和@Ali,但我曾與之合作過的幾家公司將API的RESTful模型與服務器生成的HTML混合使用。 [注:使用灰燼時,這不應該是這樣,但我與瓶/ Jinja2的,在我目前的客戶端的代碼基地骨幹工作]

我居然發現使用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))) 
3

您可以標記的代碼段爲{% raw %}告訴Jinja2的忽略它。將你的handlebars.js模板包裹在原始標籤中,如下所示:

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