【问题标题】:Browser caching and history with HTML/JSON route带有 HTML/JSON 路由的浏览器缓存和历史记录
【发布时间】:2013-07-19 02:42:33
【问题描述】:

我的应用程序中有一个带有单个 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 的请求是由带有 Accept: application/json 的 Javascript 完成的,如果返回按钮用于返回该 URL,则浏览器具有 JSON 版本缓存,并显示它而不是 HTML 版本。

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

【问题讨论】:

    标签: javascript python http rest flask


    【解决方案1】:

    您应该能够为此包含 Vary : Accept 标头。

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2017-10-19
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2016-12-15
      相关资源
      最近更新 更多