Django:如何在中间件中访问session_key

Sne*_*ick 3 django django-middleware

我无法访问session_key自定义Django中间件中的。我尝试使用以下方式访问它:

session = Session.objects.get(pk=request.session._session_key)
Run Code Online (Sandbox Code Playgroud)

要么

session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
session = Session.objects.get(pk=session_key)
Run Code Online (Sandbox Code Playgroud)

我得到错误:

Session matching query does not exist.
Run Code Online (Sandbox Code Playgroud)

我已经把我的中间件在结束MIDDLEWARE_CLASSES之后django.contrib.sessions.middleware.SessionMiddleware在我的settings.py文件。

我可以在中间件中设置会话密钥,但似乎只有在显示整个页面后才能生成/访问session_key。因为第一次显示页面时会{{ request.session.session_key }}返回None我的模板。刷新页面时,我会看到session_keysession_key非常欢迎您提供任何有关如何访问的提示。

Sne*_*ick 5

我设法使它起作用。事实证明,通常仅在呈现整个页面后才保存会话。

我设法使用以下方式将会话过早地保存在中间件中:

request.session.save()
Run Code Online (Sandbox Code Playgroud)

然后,我可以像这样保存我的模型(请注意会话后的_id,在这种情况下,您可以仅使用整数或varchar来设置外键):

visitor = Visitor()
visitor.session_id = request.session.session_key
visitor.save()
Run Code Online (Sandbox Code Playgroud)