我希望能够收集用户使用网络应用程序的基本统计数据,包括匿名用户和登录用户。
这里的共同点是,使用会话 ID,我可以存储登录和注销用户的数据,并且仍然能够将存储的统计信息链接到给定的会话(会话属于谁并不重要)。
但是,我在收集
session_key
时遇到了问题,因为当匿名用户进入站点时,这似乎并未设置(可能是因为 Django 会话仅在修改时保存。
当我使用登录用户测试视图时:
def create(request, *args, **kwargs):
print request.session.session_key
对于登录用户,会打印
session_key
。对于注销用户或匿名用户,这是 None
。第一次请求站点时,会话不存在,因此不可用于视图。
我当前的计划是创建一个自定义中间件作为官方会话中间件的子类,但重写
process_request()
为那些没有通过 session.save()
的人实例化会话。
我对这种方法唯一担心的是,我不确定它是否会对 Django 的其他部分产生不可预见的后果 - 人们有什么建议吗?
在过去的项目中,我做了您所建议的操作,但只是在一个视图中,我需要对未经身份验证的访问者使用
session_key
。它没有在我的项目中造成任何问题:
if not request.session or not request.session.session_key:
request.session.save()
# request.session.session_key now set
您可以通过设置选择保存每个请求的会话:
SESSION_SAVE_EVERY_REQUEST = True
这强制 django 为每个会话分配会话密钥
https://docs.djangoproject.com/en/2.1/topics/http/sessions/#when-sessions-are-saved