在我的Django web应用程序中,每个用户在进入之前都必须注册。为了方便起见,我想让新用户先跳过这个过程,在决定创建帐户之前先玩这个应用程序。用户的操作结果被持久化在关系数据库中,所以即使我不想保存他们的身份,我也必须有某种"用户"对象来从一开始就一致地持久化他们的数据。
所以我想,每当一个新用户来到网站,而他没有通过身份验证时,我会在DB中为创建一个假用户,并通过会话/cookie来识别他。
当用户决定创建一个帐户时,"假"用户将被修改以匹配他的注册数据。
如何以及何时创建此类用户?这是一个好方法吗?
我不确定这是否是最佳选项,但您可以使用AbstractBaseUser
并向用户添加session_id
。您必须使其他字段不需要,如用户名和密码。然后你可以做这样的事情:
from django.contrib.auth import login
from .models import MyUser
def home_view(request):
if not request.user.is_authenticated(): # user not logged in
user, is_new = MyUser.objects.get_or_create(session_id=request.session.session_key) # Make or get the user
login(request, user) # Log them in
###
这应该将session_id绑定到一个用户,如果该用户第二次访问该网站,它将保留他们以前的信息,而不会为他们创建新用户。通过这种方式,你可能会遇到很多孤立用户,例如,当有人注销时,当他们重新访问网站时,他们会创建一个新用户,然后以真实帐户的身份登录。您可以对session_id
禁用级联删除,这样用户在注销时就不会被删除。您也可以将session_id
设置为None
,这样就可以解决这个问题。