匿名用户的 Django 会话

Posted

技术标签:

【中文标题】匿名用户的 Django 会话【英文标题】:Django sessions for anonymous users 【发布时间】:2015-12-04 04:32:39 【问题描述】:

我希望能够收集匿名用户和登录用户使用网络应用程序的基本统计数据。

这里的共同点是使用会话 ID,我可以为登录和注销的用户存储数据,并且仍然能够将存储的统计信息链接到给定的会话(会话属于谁并不重要) .

但是,我在收集 session_key 时遇到了问题,因为匿名用户进入网站时似乎没有设置它(可能是因为 Django 会话是 only saved when modified。

当我使用登录用户测试视图时:

def create(request, *args, **kwargs):
    print request.session.session_key

对于已登录的用户,将打印 session_key。对于已注销的用户或匿名用户,这是None。在第一次向站点请求时,会话不存在,因此视图不可用。

我目前的计划是创建一个自定义中间件作为官方会话中间件的子类,但覆盖process_request() 以通过session.save() 为没有会话的人实例化会话。

我对这种方法的唯一担心是我不确定它是否会对 Django 的其他部分产生无法预料的后果 - 人们有什么建议吗?

【问题讨论】:

我会创建一个新的中间件来实现这一点,对我来说,它似乎更健壮,并且未来不太可能中断。 【参考方案1】:

在过去的项目中,我按照您的建议进行了操作,但只是在我需要为未经身份验证的访问者使用 session_key 的视图中。它没有在我的项目中造成任何问题:

if not request.session or not request.session.session_key:
   request.session.save()

# request.session.session_key now set

【讨论】:

【参考方案2】:

您可以通过设置选择保存每个请求的会话:

SESSION_SAVE_EVERY_REQUEST = True

这会强制 django 为每个会话分配会话密钥

https://docs.djangoproject.com/en/2.1/topics/http/sessions/#when-sessions-are-saved

【讨论】:

完全错了,这不会为匿名用户设置会话cookie

以上是关于匿名用户的 Django 会话的主要内容,如果未能解决你的问题,请参考以下文章

FastAPI 中的会话

不要为匿名用户启动会话

Parse 平台中会话过期时重复的匿名用户

Spring Stomp SimpUserRegistry 匿名用户

django 会话密钥在身份验证时更改

如何为 django 中的每个匿名用户提供一些唯一的 id