Jinja2 有三種定界符語法:flask
{{ ... }}
用來標記變量;{% ... %}
用來標記語句;{# ... #}
用來標記註釋;若是你同時使用了 JavaScript 模板引擎,而該 JavaScript 模板引擎也使用相同的語法標記符,那就會產生衝突。通常來講,有下面三種兼容性處理方式:後端
第一種方式最直觀,使用 Jinja2 的 raw 標籤聲明原生代碼塊,也就是不須要進行後端渲染的代碼塊。使用 raw
和 endraw
標籤把 JavaScript 模板部分標記出來便可,好比:app
{% raw %}
<div id="app">
{{ js_var }}
</div>
{% endraw %}複製代碼
這種方式的反作用最少,儘管須要多幾行代碼,但不會影響你寫 Jinja2 或其餘 JavaScript 庫的語法習慣。框架
第二種方式是修改 Jinja2 的語法定界符號,通常只修改變量定界符便可,其餘的按需修改。具體經過修改程序實例的下面幾個屬性來實現:測試
from flask import Flask
app = Flask(__name__)
app.jinja_env.block_start_string = '(%' # 修改塊開始符號
app.jinja_env.block_end_string = '%)' # 修改塊結束符號
app.jinja_env.variable_start_string = '((' # 修改變量開始符號
app.jinja_env.variable_end_string = '))' # 修改變量結束符號
app.jinja_env.comment_start_string = '(#' # 修改註釋開始符號
app.jinja_env.comment_end_string = '#)' # 修改註釋結束符號複製代碼
第三種方式是修改 JavaScript 模板的語法定界符號,具體方法因 JavaScript 模板/框架而異,能夠參見相關文檔瞭解。以 Vuejs 爲例,下面將模板定界符改成中括號:spa
var app = new Vue({
el: "#app",
delimiters: ["[[", "]]"],
data: {
message: "Hello Vue!"
}
})複製代碼
若是你以爲使用 raw
標籤太麻煩,而修改語法定界符又不習慣,這裏還有一個折中方法:兩邊都使用雙花括號做爲定界符,但根據花括號內部是否添加空格來進行區分。code
具體來講,對 Jinja2 變量使用 Jinja2 標準語法,也就是使用 {{
做爲變量開始符號,注意花括號右側有一個空格,結束符號相似,須要在花括號左側加入一個空格,即 }}
。實際示例以下:模板引擎
{{ jinja_var }}複製代碼
而 JavaScript 模板使用沒有空格的雙花括號,即:ip
{{js_var}}複製代碼
這是一種更適合心細的懶人的方法,若是是團隊項目,可能會對不習慣這種用法的人形成困擾,記得在文檔裏註明。這種方式只須要修改 Jinja2 定界符:文檔
app.jinja_env.variable_start_string = '{{ '
app.jinja_env.variable_end_string = ' }}'複製代碼
另外須要注意的是,若是你使用了其餘 Flask 擴展的內置 Jinja2 模板或宏,須要確保它們都使用了包含空格的標準 Jinja2 語法。舉例來講,用來方便集成 Bootstrap 的 Flask-Bootstrap 就無法使用,須要使用替代的 Bootstrap-Flask。其餘擴展,好比 Flask-Admin,Flask-Security 暫未測試,歡迎瞭解的同窗反饋兼容狀況。