描述:
在django会话文档中,它说:
您可以在任何时候阅读并写入request.session。
但在对同一视图进行第二次请求时,我无法访问会话:
views.py
class Login(APIView):
def post(self, request):
print("before: ", request.session.get("user")
request.session["user"] = "admin"
print(request.session.get("user")) #outputs 'admin'
return Response()
预期输出:
在第二个请求(用jquery$.post发出(之后,它应该输出:
"admin"
输出:
相反,它输出:
None
如何在独立请求之间提供会话?
正如@AbdulAzizBarkat在评论中提到的,问题是会话凭据没有发送到后端。会话在跨域场景中的工作方式是:
- 在后端验证用户
- 会话被发送到前端并存储在浏览器中
- 每次请求都必须将会话凭据发送到后端
但是,您不能阅读此会话cookie,如这里所述:
出于安全原因,浏览器无法访问从ajax请求中收到的第三方cookie,但它会自动为您处理这些cookie!
提供的使用ajax和设置xhrFields: { withCredentials: true }
的解决方案对我不起作用。
答案:
我使用了fetch请求,而不是ajax请求。
设置credentials: "include"
非常重要,否则cookie将不会跨原点发送。请求如下:
fetch(`${API}/login`, {
credentials: "include",
method: "POST",
body: data,
}).then(...).catch(...);