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

时间:2012-05-17 18:07:07

标签: django django-middleware

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

session = Session.objects.get(pk=request.session._session_key)

session_key = request.COOKIES[settings.SESSION_COOKIE_NAME]
session = Session.objects.get(pk=session_key)

我收到错误:

Session matching query does not exist.

我已将我的中间件放在我MIDDLEWARE_CLASSES文件的django.contrib.sessions.middleware.SessionMiddleware末尾和settings.py之后。

我可以在中间件中设置会话密钥,但看起来好像只在显示完整页面后生成/可访问session_key。因为首次显示页面{{ request.session.session_key }}会在我的模板中返回None。当我刷新页面时,我会看到session_key。有关如何访问session_key的任何提示都非常受欢迎。

2 个答案:

答案 0 :(得分:5)

我设法让它发挥作用。事实证明,通常只有在渲染完整页面后才会保存会话。

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

request.session.save()

然后我可以保存我的模型(请注意会话后的_id,这允许您在我的情况下设置foreign key using only an integer or varchar):

visitor = Visitor()
visitor.session_id = request.session.session_key
visitor.save()

答案 1 :(得分:1)

我能够用以下方法做到这一点,它对你有用吗?

Session.objects.get(session_key=request.session.session_key)

如果没有,或许@ilvar在您激活之前尝试访问会话是正确的。