gpt4 book ai didi

cookies - Flask Session() 对象不是永久性的

转载 作者:行者123 更新时间:2023-12-03 16:57:25 25 4
gpt4 key购买 nike

在我的 Flask API 中,我试图让 session 保持永久状态,以便即使在浏览器关闭后它仍然存在。我的前端是用 React 编写的,并使用 Fetch API 发出请求。但是,在测试了我到目前为止所拥有的之后,它似乎不起作用。我的代码(省略了一些不相关的数据库内容):

@bp.route('/login', methods=('POST',))
def login():
...

error=None
res = {}

db = get_db()
cursor = db.cursor(dictionary=True)
...
user = cursor.fetchone()

...

if error is None:
session.clear()
session.permanent = True
session['userID'] = user['id']
current_app.logger.debug(session['userID'])

res['actionSuccess']= True
else:
res['actionSuccess'] = False
res['error'] = error

return jsonify(res)

到目前为止,我可以看出 session 确实存储了 userID 值。然后我写了另一个路由来告诉我用户 ID 值是否存储在 session 中,如下所示:
@bp.route('/init', methods=('GET',))
def init():
userID = session.get('userID')
if userID is None:
res = {"signedIn": False}
else:
res = {"signedIn": True, "username": userID}
return jsonify(res)

但是,每次我调用 '/init' 时,即使我以前登录过,它也会返回 False。我不知道为什么 session 在这里不是永久的。是因为我在我的机器上本地运行客户端吗?我需要在 Chrome 浏览器的某个地方允许 cookie 吗?我使用 Chrome 查看为客户端存储的 cookie,那里没有存储“ session ”。我是否需要在前端做一些额外的事情来存储 cookie/ session ,还是它们会自动存储?我误解了 Flask session 的用法吗?

最佳答案

经过大量研究,找出 session 不起作用的原因! Flask session 本质上是 cookie,我使用 Fetch API 来执行 CORS 操作。默认情况下,Fetch() 不允许接收或发送 cookie,必须进行配置才能使用 Flask session 。

在我的 React.js 客户端上,我通过为“凭据”设置“包含”来做到这一点:

        fetch(url, {
method: 'POST',
mode: 'cors',
body: JSON.stringify(loginObj),
credentials: 'include',
headers: {
'Content-Type': 'application/json'
}
})
.then(res => res.json())
...

由于这种配置,请求不被视为“简单请求”,客户端实际上将使用 OPTIONS 请求“预检”POST 请求。这意味着在发送我的 POST 请求之前,将首先向我的 Flask 服务器发送一个 OPTIONS 请求测试以查看服务器是否具有正确的访问权限。

预检 OPTIONS 请求将测试来自服务器的响应是否具有包含“Access-Control-Allow-Origin”、“Access-Control-Allow-Credentials”和“Access-Control-Allow-Headers”的正确 header 。如果 OPTIONS 请求发送的测试失败,则不会发送实际的 POST 请求,您将收到 Fetch 错误。

然后我在 Flask 服务器上相应地设置 header ,如下所示:
@bp.route('/login', methods=('POST','OPTIONS'))
def login():
if request.method == 'OPTIONS':
resp = Response()
resp.headers['Access-Control-Allow-Origin'] = clientUrl
resp.headers['Access-Control-Allow-Credentials'] = 'true'
resp.headers['Access-Control-Allow-Headers'] = "Content-Type"

return resp
else:

'''
use session for something
'''

res['actionSuccess'] = False
js = json.dumps(res)

resp = Response(js, status=200, mimetype='application/json')
resp.headers['Access-Control-Allow-Origin'] = clientUrl
resp.headers['Access-Control-Allow-Credentials'] = 'true'
resp.headers['Access-Control-Allow-Headers'] = "Content-Type"

return resp

请注意,“Access-Control-Allow-Credentials”设置为“true”,而不是 Python bool 值 True,因为客户端将无法识别 Python bool 值。

有了这个,一个 Flask Session 对象应该存储在你的 cookie 中。

关于cookies - Flask Session() 对象不是永久性的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com