【问题标题】:Flask: How to remove cookies?Flask:如何删除 cookie?
【发布时间】:2013-01-01 10:02:38
【问题描述】:

我使用文档中建议的代码设置 cookie:

from flask import make_response

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('username', 'the username')
    return resp

但是我该如何移除它们呢?没有 remove_cookie 方法。我试过了:

if request.cookies.get('sessionID');
    request.cookies.pop('sessionID', None)

但事实证明 request.cookies 对象是不可变的。我该怎么办?

【问题讨论】:

    标签: python cookies flask


    【解决方案1】:

    我们可以让我们从 flask.Response 获得 delete_cookie()。

    resp.delete_cookie('username')
    

    这将在响应时删除 cookie。 这里是delete_cookie documentation。

    您可能还想添加 path(默认设置为 '/')和 domain(默认设置为 None)。

    resp.delete_cookie('username', path='/', domain='yourdomain.com')
    

    这是解释器截图,它显示了 flask.Response 中的 delete_cookie 对象。

    【讨论】:

    • 这不会删除开发者工具 > 应用程序上的 cookie。我不知道为什么。这是我的 sn-p res = make_response('', 204) res.delete_cookie(key='refresh_token', path='/') return res
    • 检查作为本地主机传递的域。如果 cookie 设置了域,则可以在传递域的情况下将其删除。
    • 我想通了,credentials: 'include' 应该设置为每个请求的标头,这包括请求中的 cookie。
    【解决方案2】:

    您需要将 cookie 设置为过去的过期时间。

    resp = make_response(render_template(...))
    resp.set_cookie('username', expires=0)
    return resp
    

    顺便说一句,我希望您实际上并不期望用户名 cookie 是安全的。因为不是。用户可以将任何他想要的东西放在那里。解决方案通常是使用 Flask 会话,该会话使用用户无法修改的签名 cookie。

    【讨论】:

    • 嗯,好的。我知道它们不安全,但我还没有弄清楚如何使用不同的服务读取签名的 cookie(我让 Flask 与 node.js 应用程序对话)
    【解决方案3】:

    没有用于删除 cookie 的 HTTP 标头。传统上,您只需将 cookie 设置为具有过去过期日期的虚拟值,因此它会立即过期。

    resp.set_cookie('sessionID', '', expires=0)
    

    这会将会话 id cookie 设置为在 unixtime 0 过期的空字符串,这几乎可以肯定是过去。

    【讨论】:

    • 鉴于ThiefMaster的回答,这有必要吗?
    • cookie 可以存在但仍为空。使用 expires 实际上会删除它。但差别很小,是的。
    • 由于烧瓶会话存储在客户端,表现不佳的客户端是否有可能忽略此请求并仍然保留 cookie?
    • @oeter 好吧,当然;表现不佳的客户可能会做任何事情。这就是它表现不佳的原因:)
    猜你喜欢
    • 1970-01-01
    • 2013-04-04
    • 2011-01-09
    • 2015-02-24
    • 2013-07-22
    • 2015-09-26
    相关资源
    最近更新 更多