【问题标题】:Why set_cookie not setting a cookie and instead returning None in flask?为什么 set_cookie 不设置 cookie 而是在烧瓶中返回 None?
【发布时间】:2020-11-05 04:27:21
【问题描述】:

我试图在烧瓶环境中为我的 web 应用程序设置一个 cookie,但由于某种未知原因,该 cookie 没有被设置并且没有显示错误。一年前我尝试过同样的方法,它完美地工作,但不知何故它不再工作了。

此代码作为 app.py 文件中的一个单独函数编写,该文件在其他 @app.route 函数中被调用以获取 user_id 值。

Flask 调试代码

user_id = None
user_id = request.cookies.get('nuid')
if user_id is None:
    response = make_response()
    print(user_id)
    response.set_cookie('nuid', value=cookie.nuid())
    print(cookie.nuid())
    user_id = request.cookies.get('nuid')
    print(user_id)
    return response
print(user_id)
return user_id

输出

None
76fbacf3e38090f86acb7dcfd8b36da2
None

cookie.nuid() 是一个创建的函数,它将创建一个新的随机字符串。 (这完全没有问题)。

【问题讨论】:

    标签: python flask cookies


    【解决方案1】:

    我相信有人比我有更准确的答案,但根据我的经验,request 对象内的任何字典都是不可变的,这意味着你不能给它们写信。我的猜测是,在请求处理函数存在之前,设置 cookie 并不会真正执行。然后,您将在下一个请求中看到 cookie。

    编辑:

    request 对象包含有关来自客户端的请求的信息。当您调用 user_id = request.cookies.get('nuid') 时,您正在检查不可变字典 cookies(这是 request 对象的属性)是否具有 'nuid'key 。它返回None,因为客户端没有在请求中发送一个。

    然后您将创建一个 cookie 并将其设置为 response 对象,这意味着您对客户端的响应将包括 nuid 键和 cookie 作为其值。但是,这并不意味着用户发送给您的原始请求包含nuid 键,因此当您调用user_id = request.cookies.get('nuid') 时,它仍然返回None一旦客户端的请求被解析为request对象,该对象就不能被修改了。

    如果在后续请求中,客户端选择将带有密钥 'nuid' 的 cookie 发回给您,您在 response 对象中提供了该 cookie,那么 user_id = request.cookies.get('nuid') 将返回 cookie 的值。

    【讨论】:

    • 我们没有在代码中的任何地方使用字典,cookie.nuid() 返回一个字符串,如输出所示。 "response.set_cookie('nuid', value=cookie.nuid())" 这是设置在默认日期自动过期的 cookie 值的格式。
    • 我认可编辑后的答案并完全理解你在说什么,但即使在函数运行之后,当我检查浏览器中的 cookie 值时,它仍然显示没有这样的 cookie,即 response.set_cookie 不工作.
    猜你喜欢
    • 2012-07-31
    • 2021-11-18
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2013-07-15
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多