我在我的应用程序中使用flask会话.在我的一个处理程序中,我设置会话值,而在其他处理程序中没有设置会话.但我发现在每个响应中都有一个http标头:Set Cookie
存在.为什么会这样?
app = Flask(__name__) app.secret_key = r"A0Zr98j/3yX R~XHH!jmN'LWX/,?RT" @app.route('/auth/login', methods=['POST']) @crossdomain(origin='*') def authlogin(): user = User(username=username, registered_at=sqlnow()) user.accounts = [Account(provider='weibo', access_token=access_token, uid=uid)] account = user.accounts[0] session['user_id'] = account.user_id return jsonify({ 'status': 'success', 'data': { 'user_id': account.user_id, 'uid': account.uid } }) @app.route('/api/movies/') def moviescoming(movie_type): if movie_type == 'coming': return getmovies(MOVIE_TYPE_PLAYING, offset, limit) else: return getmovies(MOVIE_TYPE_COMING, offset, limit) app.run(host='0.0.0.0', debug=True)
代码显示在这里:https: //github.com/aisensiy/dianying/blob/master/index.py
这是设计使然,但最近Flask的更改允许您通过使用该SESSION_REFRESH_EACH_REQUEST
选项来更改此行为.截至发布此答案时,该选项尚未在Flask的稳定版本中发布.
让我们回过头来讨论一下cookie应该如何工作:
RFC 6265定义了当代理(浏览器)声明会话关闭时(通常是在浏览器关闭时),cookie应该到期,除非提供了一些机制来告诉浏览器cookie何时应该实际到期:
除非cookie的属性另有说明,否则cookie [...]会在当前会话结束时(由用户代理定义)到期.
[...]
如果cookie既没有Max-Age也没有Expires属性,则用户代理将保留cookie,直到"当前会话结束"(由用户代理定义).
如果服务器希望cookie能够在代理重新启动后继续存在,则需要设置过期时间.请注意,Expires属性通常是首选,因为Internet Explorer具有不良支持max-age
的历史记录.
因此,不可能说cookie应该是"永久性的".当人们谈论一个"永久性"cookie时,他们真正在谈论的是一个在浏览器重启后幸存下来的cookie.我知道创建这个"永久"cookie有两种策略:
将cookie的到期时间设置为足以被视为永久性的内容(例如,9999年).
将cookie的到期时间设置为将来相对较新的内容(例如,31天),但每次使用cookie时,请再次更新到期日.例如,在1月1日我们将cookie设置为在2月1日到期,但是当用户在1月2日使用cookie时,我们将更新cookie(通过使用Set-Cookie
)以使其在2月2日到期.
第一种方法要求Set-Cookie
标题只能设置为客户端一次(除非cookie内容需要更改).
第二种方法需要在Set-Cookie
每次更新时发送标头,以便在用户继续使用服务时不断"推迟"过期.请注意,它也不是真正的"永久",因为超过31天不使用您的网站的用户将使其Cookie过期.
RFC 6265在定义到期日期方面有一点说法:
虽然服务器可以将cookie的过期日期设置为
遥远的未来,但大多数用户代理实际上并未保留cookie
数十年.
服务器应该通过
根据cookie的目的选择合理的cookie有效期来促进用户隐私,而不是选择无偿的长期有效期.对于
例如,一个典型的会话标识符可合理地设置为
在两周内到期.
因此,虽然它没有明确说明是否要不断更新到期日期,但似乎确实说使用远期日期不应被视为良好做法.
Flask使用第二种方法(不断更新cookie到期时间Set-Cookie
).默认情况下,cookie的到期时间为31天(可配置PERMANENT_SESSION_LIFETIME
).对于每个请求,Flask将使用另一个请求将Set-Cookie
过期时间推迟另外31天(或者您设置永久会话生命周期值的任何内容).因此,Set-Cookie
即使会话未更改,也会出现您看到的每个请求.
然而,最近,关于Set-Cookie
仅在cookie改变时使用的拉取请求中已经进行了讨论.这导致了一项新功能,允许用户更改其工作方式.Flask将继续按原样运行,但用户可以将新SESSION_REFRESH_EACH_REQUEST
选项设置为False,这将导致Set-Cookie
仅在cookie更改时发送标头.
新项目记录为:
此标志控制永久会话的刷新方式[原文如此].如果设置为
True
(默认值),则每次刷新生命周期的cookie都会刷新cookie.如果设置为False
一个set-cookie
标题如果会话被修改才会发送.非常任会议不受此影响.
这个新选项与现有选项一起PERMANENT_SESSION_LIFETIME
,允许Flask开发人员更好地调整他们的"永久"cookie将如何设置为过期.
截至本答复的发布日期(2013年12月24日),该SESSION_REFRESH_EACH_REQUEST
选项尚未成为任何Flask发布的一部分,因此希望使用它的用户需要等待未来的Flask发布.