Django会话在两个单独的请求中不可用



描述:

在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(...);

相关内容

最新更新