flask为每个响应设置Cookie

  发布于 2023-02-08 12:10

我在我的应用程序中使用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

1 个回答
  • 简答:

    这是设计使然,但最近Flask的更改允许您通过使用该SESSION_REFRESH_EACH_REQUEST选项来更改此行为.截至发布此答案时,该选项尚未在Flask的稳定版本中发布.

    答案很长

    让我们回过头来讨论一下cookie应该如何工作:

    Cookies作为标准

    RFC 6265定义了当代理(浏览器)声明会话关闭时(通常是在浏览器关闭时),cookie应该到期,除非提供了一些机制来告诉浏览器cookie何时应该实际到期:

    除非cookie的属性另有说明,否则cookie [...]会在当前会话结束时(由用户代理定义)到期.

    [...]

    如果cookie既没有Max-Age也没有Expires属性,则用户代理将保留cookie,直到"当前会话结束"(由用户代理定义).

    如果服务器希望cookie能够在代理重新启动后继续存在,则需要设置过期时间.请注意,Expires属性通常是首选,因为Internet Explorer具有不良支持max-age的历史记录.

    创建永久Cookie

    因此,不可能说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实施"永久性Cookies"

    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发布.

    2023-02-08 12:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有