【问题标题】:Django: How to access session_key in middlewareDjango:如何在中间件中访问 session_key
【发布时间】:2012-05-17 18:07:06
【问题描述】:

我无法在我的自定义 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 的提示。

【问题讨论】:

  • 你为什么要做那个查询?为什么不直接访问request.session
  • 我有一个引用 django_session 表的表,例如: session = models.ForeignKey(Session) 当我创建它的实例时,例如使用 request.session 它给了我以下错误:无法分配“”:“Visitor.session”必须是“Session”实例。这就是为什么我试图查询会话表以获取“会话”实例。
  • 您在访问数据库时是否真的有会话密钥?仅在会话中间件上的 process_response 中创建新会话 - 因为它们需要存储视图中的任何内容,并且在视图完全处理之前无法执行此操作。

标签: django django-middleware


【解决方案1】:

我设法让它工作。事实证明,通常只有在呈现完整页面后才会保存会话。

我设法在我的中间件中过早地保存了会话:

request.session.save()

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

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

【讨论】:

    【解决方案2】:

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

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

    如果不是,也许@ilvar 是正确的,您尝试在会话处于活动状态之前访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多