我的應用程序中有一個路由,其URL基於請求中的Accepts標頭以不同的方式響應。這個想法是,如果URL在瀏覽器中輸入,將會呈現一個HTML模板。如果我的客戶端Javascript請求該URL,則會返回JSON。下面是一個簡單的示例(Python /瓶):使用HTML/JSON路由的瀏覽器緩存和歷史記錄
# From http://flask.pocoo.org/snippets/45/
def requested_json():
''' Determine whether JSON was requested. '''
best = request.accept_mimetypes.best_match([MIME_JSON, MIME_HTML])
return best == MIME_JSON and request.accept_mimetypes[best] > request.accept_mimetypes[MIME_HTML]
@app.route('/assembly/<assembly_serial_no>', methods=['GET'])
def assembly_get(assembly_serial_no):
''' HTML/JSON route for getting the details of an assembly unit. '''
assembly_model_id = g.pcb_db.get_assembly_model_id_for(assembly_serial_no)
if not assembly_model_id:
abort(404)
assembly_unit = g.pcb_db.get_assembly(assembly_serial_no)
if requested_json():
return jsonify(assembly_unit)
else:
return render_template('assembly.html',
assembly_unit=assembly_unit,
)
這一直很好,直到我遇到了與緩存/瀏覽器歷史記錄順利。如果用戶以前在瀏覽器中加載了URL,但最近對該URL的請求是由帶有Accept:application/json的Javascript完成的,如果使用後退按鈕返回到該URL,則瀏覽器具有JSON版本緩存,並顯示,而不是HTML版本。
我可以區分JSON和HTML網址(例如追加?json = True),但是如果有更好的方法來正確使用HTTP標頭,我想知道它是什麼。
謝謝,很棒的提示。 – bsa