【问题标题】:How to set cookie in Python Flask?如何在 Python Flask 中设置 cookie?
【发布时间】:2018-03-21 12:38:51
【问题描述】:

这样,我想设置我的cookie。但是设置失败。

@app.route('/')
def index():
    res = flask.make_response()
    res.set_cookie("name", value="I am cookie")

当我打印 res 时,它显示 <Response 0 bytes [200 OK] 但未设置 cookie

【问题讨论】:

  • 您可能不知道 cookie 的实际工作原理:您指示浏览器在一个请求中设置它,并在来自同一浏览器的下一个请求中设置 cookie。您的代码不足以测试它。
  • @KlausD。我认为这样说并不完全公平:一旦服务器用 cookie 响应,就意味着响应绝对不是空的(0 字节)。是的,数据在 Set-Cookie 标头中,有效负载为零,但更详细的 res(ponse) 变量转储应该详细说明。
  • @Alex 请注意 a) 这个问题已经有将近 3 年的历史了,并且 b) 在我发表评论后已经被大量编辑。
  • @KlausD。我认为这个答案可能会成为来自其他堆栈(例如:PHP 或 Java)并尝试学习 Flask 的人的参考 - 就像我的情况一样。

标签: python cookies flask


【解决方案1】:

设置cookie后必须返回响应。

@app.route('/')
def index():
    resp = make_response(render_template(...))
    resp.set_cookie('somecookiename', 'I am cookie')
    return resp 

这样会在你的浏览器中生成一个cookie,但是你可以在下一个请求中获取这个cookie。

@app.route('/get-cookie/')
def get_cookie():
    username = request.cookies.get('somecookiename')

【讨论】:

【解决方案2】:

如果您使用其他工具查看您设置的 cookie(例如:在 Firefox 或 Chrome 中按 F12 使用开发者工具)或在呈现的响应中使用一段 JavaScript 代码,您设置的 cookie 将可见。

cookies 设置在浏览器上浏览器本身 (JavaScript) 或作为来自服务器的响应。

区别非常重要,因为即使 cookie 是由服务器设置的,也可能不会在浏览器上设置 cookie(例如:cookie 被完全禁用或丢弃的情况)。

因此,即使服务器可能会告诉“我设置了 cookie” - cookie 也可能不会出现在浏览器上。

为了让服务器确保设置了 cookie,需要来自浏览器的后续请求(请求标头中存在 cookie)。

因此,即使 Flask 的响应(res 变量)会提到 cookie 已设置,我们也只能确定它是由服务器设置的,但浏览器不会对此进行确认.

高级 另一方面是关于 Flask 或任何其他 API 如何创建响应。由于有效负载(html/模板代码)和标头(cookie)是同时设置的 - 有效负载(html/模板代码)内的“代码”可能无法访问 cookie。 因此,您可能无法设置 cookie 并将其显示在响应中。

一个想法可能是(能够)首先设置 cookie,然后呈现上下文和设置顺序是重要的 - 以便 html/模板知道已经设置的值。但即使在这种情况下,也只是服务器确认它设置了 cookie。

解决方案

@app.route('/')
def index():
    res = flask.make_response()
    res.set_cookie("name", value="I am cookie")

    # redirect to a page that display the cookie
    resp.headers['location'] = url_for('showcookies') 

    return resp, 302

【讨论】:

    【解决方案3】:

    此响应将在您的浏览器中设置 cookie

    def func():
        response = make_response( render_template() )
        response.set_cookie( "name", "value" )
        return response
    

    【讨论】:

    • 您的答案已被接受的答案所涵盖
    猜你喜欢
    • 2020-03-19
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2019-05-23
    • 2017-03-28
    • 2018-01-25
    相关资源
    最近更新 更多