Django:如何在中间件中访问会话密钥
我无法在自定义Django中间件中访问会话密钥。我尝试使用以下方式访问它:Django:如何在中间件中访问会话密钥,django,django-middleware,Django,Django Middleware,我无法在自定义Django中间件中访问会话密钥。我尝试使用以下方式访问它: session = Session.objects.get(pk=request.session._session_key) 或 我得到一个错误: Session matching query does not exist. 我已将我的中间件放在我的settings.py文件中django.contrib.sessions.middleware的末尾和后面 我可以在中间件中设置会话密钥,但似乎只有在显示完整页面后才会
session = Session.objects.get(pk=request.session._session_key)
或
我得到一个错误:
Session matching query does not exist.
我已将我的中间件放在我的settings.py
文件中django.contrib.sessions.middleware
的末尾和后面
我可以在中间件中设置会话密钥,但似乎只有在显示完整页面后才会生成/访问会话密钥。因为当页面第一次显示时,
{{request.session.session_key}}
在我的模板中返回None
。当我刷新页面时,我会看到会话\u键
。非常欢迎提供有关如何访问会话\u键的任何提示。我可以通过以下方法实现这一点,它对您有用吗
Session.objects.get(session_key=request.session.session_key)
如果不是,那么@ilvar可能是正确的,您试图在会话激活之前访问它。我设法使它工作。结果表明,通常只有在呈现完整页面后才保存会话
我使用以下方法在中间件中提前保存了会话:
request.session.save()
然后我可以像这样保存我的模型(注意会话后的_id,它允许您在我的案例中设置):
你为什么要问这个问题?为什么不直接访问request.session
?我有一个引用django_session表的表,例如:session=models.ForeignKey(session),当我使用request.session创建它的实例时,它会给我以下错误:无法分配“”:“Visitor.session”必须是“session”实例。这就是为什么我试图查询session表以获得一个“session”实例。当你点击数据库时,你真的有session键吗?新会话仅在会话中间件上的process\u response
中创建,因为它们需要存储视图中的任何内容,并且在视图完全处理之前无法这样做。
request.session.save()
visitor = Visitor()
visitor.session_id = request.session.session_key
visitor.save()