更改页面后,Django request.user变为匿名。使用自定义用户模型

时间:2018-09-25 03:00:17

标签: python django

我正在使用扩展AbstractBaseUser的自定义用户模型。这是用户模型:

class cUser(AbstractBaseUser):
    def save(self, *args, **kwargs):
        pass
    role_id = models.IntegerField()
    user_id = models.IntegerField()
    email = models.CharField(max_length=40)
    password = models.CharField(max_length=40)
    f_name = models.CharField(max_length=40)
    l_name = models.CharField(max_length=40)
    address_id = models.IntegerField()
    phone_num = models.IntegerField()
    loan_item_count = models.IntegerField()
    id = models.IntegerField(unique = True, primary_key = True)

    def __init__(self, dictionary, *args, **kwargs):
        self.role_id = int(dictionary['role_id'])
        self.user_id = dictionary['user_id']
        self.email = dictionary['email']
        self.password = dictionary['password']
        self.f_name = dictionary['f_name']
        self.l_name = dictionary['l_name']
        self.address_id = dictionary['address_id']
        self.phone_num = dictionary['phone_num']
        self.loan_item_count = dictionary['loan_item_count']
        self.id = self.user_id

    USERNAME_FIELD = 'user_id'
    class Meta:
        managed = False

我不希望模型以任何方式影响数据库。我正在通过网关方法中的简单原始SQL查询来加载它。

这是我处理登录的方式:

def login_request(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = request.POST['username']
            password = request.POST['password']
            user = userGateway(username,password)
            if user is not None:
                print("=========USER==========")
                print(user.email)
                user.backend = 'django.contrib.auth.backends.ModelBackend'
                login(request,user)
                print(request.user.is_authenticated)
                if user.role_id==1:
                    return render(request, 'biblioteca/admin/landing.html')
                    # return HttpResponseRedirect('/')
                else:
                    return render(request, 'biblioteca/landing.html')
            else:
                print("=========NOT USER==========")
    else:
        if(request.user is not None and not request.user.is_anonymous):
            return render(request, 'biblioteca/admin/landing.html')
        form = LoginForm()
        return render(request, 'biblioteca/login.html', {'form': form})

如您所见,我在登录前将后端设置为无需通过密码即可进行身份验证-通过将传入的密码与检索到的密码进行比较来创建用户对象时,便完成了密码检查从数据库。

如果我返回一个render(如此处所示),则下一页将包含正确的request.user对象。如果返回重定向,则不会。此外,如果我完全离开该页面,则该用户将再次未经身份验证且匿名,从而失去会话。

对于为什么会发生这种情况的任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:0)

重定向时,请求已完成,并且重定向代码已发送给客户端,客户端随后向新页面发出新请求,而没有用于登录表单的POST数据。用户可能没有得到他们的令牌。在这种情况下,请渲染页面以将其记录在延迟状态中几秒钟,然后将其重定向到正确的位置。

答案 1 :(得分:0)

因此,可以通过将userGateway()转换为适当的auth后端并像这样实现来解决此问题。

原因说明:

django中的sessionID存储用户PK的哈希值以及用于登录的auth后端。每当发送新请求时,都会使用此哈希值从数据库中延迟加载所需的数据。

这就是为什么login()在登录页面上正确验证用户身份的原因,因为它几乎被迫进行身份验证。但是,一旦发生另一个请求,它将无法从数据库中加载用户的数据,并将刷新sessionid。