假設我想使用Flask與我從數據庫中獲取的某些特定數據來呈現頁面(不僅僅是JSON)。例如如何從沒有AJAX的Flask中返回JSON數據
display_data.html
包括:
<script src='display_data.js'></script>
...
<h1>Data display page!</h1>
<div id="chartContainer"></div>
display_data.js
:
$(function() {
draw_chart($("#chartContainer"), json_data);
//draw_chart is defined elsewhere and json_data is what I want to pass in
});
的Python:
@app.route('/<data_id>')
def get_display_data_page(data_id):
data = get_data_by_id(data_id)
return render_template('display_data.html', data = data)
我想,如果我想只是 「渲染模板」,我會必須包括display_data.html
以下的其他地方:
<script>window.json_data = {{ data | tojson | safe}}</script>
這種模式味道不好:我要離開一個對象的全局命名空間(這樣我的JS文件都可以訪問它),顯示數據爲純文本,並呈現在一個字符串被解析成JSON所以JS可以使用它。看起來不好,但這確實奏效。其他
兩個選項:
返回與AJAX的數據。鑑於這篇文章的標題,我特別試圖避免ajax。其原因主要是我正在構建一個移動網站,並希望減少回到服務器的ping數量。我也在考慮封裝頁面(也許更形而上):一旦你擁有了它,你就擁有了全部。
通過Flask和Jinja呈現我的JS文件。這似乎是一個無賴,因爲我不得不寫下一條路線,並根據我在
get_display_data_page
中的相同邏輯渲染JS:通過其ID等查找數據。代碼複製和動態JS聲音像大不,不是我的。
有沒有一個已知的模式來做到這一點呢?