使用HTML / JSON路由的浏览器缓存和历史记录

时间:2013-07-19 02:42:33

标签: javascript python http rest flask

我的应用程序中有一个路由,其中​​包含一个URL,该路由根据请求中的Accepts标头做出不同的响应。我们的想法是,如果在浏览器中输入URL,则会呈现HTML模板。如果我的客户端Javascript请求该URL,则将返回JSON。这是一个简单的例子(Python / Flask):

# 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的最新请求是由Javascript with Accept:application / json完成的,如果使用后退按钮返回该URL,则浏览器具有JSON版本缓存,并显示而不是HTML版本。

我可以区分JSON和HTML URL(例如,追加?json = True),但是如果有更好的方法通过正确使用HTTP标头来做到这一点,我想知道它是什么。

1 个答案:

答案 0 :(得分:3)

您应该可以包含Vary:Accept标头。

根据http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44

  

Vary字段值表示请求标头字段的集合   完全确定响应是否新鲜,是否是缓存   允许使用响应来回复后续请求   再验证