2013-07-19 67 views
1

我的應用程序中有一個路由,其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標頭,我想知道它是什麼。

回答