DRF匿名用户标识问题:如何获取提交问卷的匿名用户唯一ID
匿名用户唯一标识符获取方案
方案1:客户端生成持久化UUID存储
- 前端首次进入问卷页面时,生成合规的UUID v4字符串,存入浏览器的
localStorage/IndexedDB中,同时写入30天以上有效期的cookie - 提交问卷时,前端将该UUID作为
anonymous_id字段一起传入接口 - 后端直接接收该字段入库即可,无需额外生成逻辑
注意:该方案兼容性最好,用户清除浏览器数据后才会丢失标识,适合不需要高精准度识别的场景
方案2:后端基于请求特征生成指纹
- 后端提取请求的IP地址、User-Agent、Accept-Language三个核心特征,拼接后用
md5/sha256哈希生成固定长度的唯一标识 - 示例代码:
import hashlib from rest_framework.request import Request def generate_anonymous_fingerprint(request: Request) -> str: feature = f"{request.META.get('REMOTE_ADDR')}{request.META.get('HTTP_USER_AGENT')}{request.META.get('HTTP_ACCEPT_LANGUAGE', '')}" return hashlib.sha256(feature.encode('utf-8')).hexdigest()
注意:同局域网下相同设备配置的用户可能出现标识重复,适合作为辅助校验字段,不建议作为唯一主键使用
方案3:后端下发会话标识
- 匿名用户首次访问问卷接口时,后端生成UUID存入Django的
session中,设置会话过期时间为90天 - 后续所有请求都会自动携带sessionid,后端直接取
request.session.session_key或者预先存入session的anonymous_id即可 - 该方案不需要前端做额外存储逻辑,标识完全由后端管控,安全性更高
注意:需要确保DRF的SessionMiddleware正常开启,用户禁用cookie时会失效
选择建议
如果你的问卷允许跨设备提交、对重复提交校验要求不高,选方案1即可;如果需要管控重复提交、避免前端伪造标识,优先选方案3,搭配方案2的指纹做重复校验即可。
内容的提问来源于stack exchange,提问作者Эмиль Хазиев
相关产品推荐
相关产品推荐

