我正在使用扩展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对象。如果返回重定向,则不会。此外,如果我完全离开该页面,则该用户将再次未经身份验证且匿名,从而失去会话。
对于为什么会发生这种情况的任何帮助,将不胜感激。
答案 0 :(得分:0)
重定向时,请求已完成,并且重定向代码已发送给客户端,客户端随后向新页面发出新请求,而没有用于登录表单的POST数据。用户可能没有得到他们的令牌。在这种情况下,请渲染页面以将其记录在延迟状态中几秒钟,然后将其重定向到正确的位置。
答案 1 :(得分:0)
因此,可以通过将userGateway()转换为适当的auth后端并像这样实现来解决此问题。
原因说明:
django中的sessionID存储用户PK的哈希值以及用于登录的auth后端。每当发送新请求时,都会使用此哈希值从数据库中延迟加载所需的数据。
这就是为什么login()在登录页面上正确验证用户身份的原因,因为它几乎被迫进行身份验证。但是,一旦发生另一个请求,它将无法从数据库中加载用户的数据,并将刷新sessionid。