Flask:如何删除cookie?

43

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

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 对象是不可变的。我该怎么办?

3个回答

70

没有用于删除cookie的HTTP标头。传统上,您只需将cookie设置为一个过去的虚拟值,这样它就会立即过期。

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

这将把会话 ID cookie 设置为空字符串,并在 Unix 时间 0(几乎肯定是过去的时间)时过期。


鉴于ThiefMaster的回答,这还有必要吗? - Oliver
一个 cookie 可以存在但仍然为空。使用 expires 将实际删除它。但是区别非常小,是的。 - Eevee
由于Flask会话存储在客户端,那么一个行为不良的客户端是否有可能忽略此请求并仍然保留Cookie? - oeter
@oeter 当然,一个行为不端的客户端可以做任何事情。这就是它行为不端的原因 :) - Eevee

26
我们可以利用 Flask.Response 中提供的 delete_cookie()。
resp.delete_cookie('username')

这将在响应中删除cookie。以下是delete_cookie文档

此外,您可能希望添加路径(默认设置为“/”)和(默认设置为无)。

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

以下是Flask.Response中delete_cookie对象的解释:

Python Interpreter Screenshot


这不会删除开发者工具>应用程序中的Cookie。我不确定为什么。这是我的代码片段:res = make_response('', 204) res.delete_cookie(key='refresh_token', path='/') return res - Ryan Aquino
通过将域名设置为localhost进行检查。如果使用域名设置了cookie,则可以通过传递域名来删除它。 - Reck
我已经想到了,每个请求都应该将credentials: 'include'设置为headers,这样包括请求的cookies。 - Ryan Aquino

9
您需要设置具有过去到期日期的cookie。
resp = make_response(render_template(...))
resp.set_cookie('username', expires=0)
return resp

顺便说一下,我希望你不要期望用户名的cookie是安全的。因为它并不是。用户可以在其中放置任何内容。解决方法通常是使用Flask会话,它使用签名cookie,用户无法修改。


嗯,好的。我知道它们不安全,但我还没有找到时间去弄清楚如何使用不同服务读取签名的 cookie(我正在让 Flask 与一个 node.js 应用程序通信)。 - Oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接