调用 auth.login() 后 Django 用户仍然是 AnonymousUser
Django user is still AnonymousUser after calling auth.login()
我正在尝试在用户扫描其 ID 徽章上的 RFID 标签后登录用户,但是在调用 auth.login()
后,用户未登录,并且 request.user
仍然是 AnonymousUser
.
我正在使用以下视图对用户进行身份验证:
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
try:
Models.People.objects.get(id_badge=form.cleaned_data['badge_number'], deleted=False, system_user=True)
except Models.People.DoesNotExist:
form.add_error('badge_number', 'Badge number not recognised')
return render(request, 'login.html', {'form':form})
user = user.authenticate(id_badge=form.cleaned_data['badge_number'])
if user is not None:
auth.login(request, user)
return redirect(reverse('main-menu'))
else:
form.add_error('badge_number', 'Badge number not recognised')
else:
form = LoginForm()
return render(request, 'login.html', {'form': form})
我还有一个自定义身份验证后端来检查徽章号码:
class RFIDBackend(object):
def authenticate(id_badge=None):
try:
person = Models.People.objects.get(info1=id_badge, deleted=False, system_user=True)
except Models.People.DoesNotExist, Models.People.MultipleValuesReturned:
return None
try:
user = User.objects.get(username=person.login)
except User.DoesNotExist:
return None
if user.is_active:
return user
return None
def get_user(id_badge=None):
try:
person = Models.People.objects.get(info1=id_badge, deleted=False, system_user=True)
except Models.People.DoesNotExist, Models.People.MultipleValuesReturned:
return None
try:
user = User.objects.get(username=person.login)
except User.DoesNotExist:
return None
return user
尝试登录时,用户成功重定向到菜单页面,但随后模板在尝试将他们的名字放在页面上时引发错误:
'AnonymousUser' object has no attribute 'first_name'
应该是cleaned_data
不是cleaned_date
?
Models.People.objects.get(id_badge=form.cleaned_data['badge_number'], deleted=False, system_user=True)
您的 get_user
方法应该使用用户的主键,而不是 id_badge
。由于您使用的是内置用户,因此您可以使用与 Django 的 ModelBackend
.
相同的实现
from django.contrib.auth import get_user_model
class RFIDBackend(object):
...
def get_user(self, user_id):
UserModel = get_user_model()
try:
return UserModel._default_manager.get(pk=user_id)
except UserModel.DoesNotExist:
return None
您尝试扩展它以对 deleted
和 system_user
字段进行检查。如果你这样做,测试以确保它在删除用户时按预期工作,我不是 100% 确定它会导致用户被注销。
我正在尝试在用户扫描其 ID 徽章上的 RFID 标签后登录用户,但是在调用 auth.login()
后,用户未登录,并且 request.user
仍然是 AnonymousUser
.
我正在使用以下视图对用户进行身份验证:
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
try:
Models.People.objects.get(id_badge=form.cleaned_data['badge_number'], deleted=False, system_user=True)
except Models.People.DoesNotExist:
form.add_error('badge_number', 'Badge number not recognised')
return render(request, 'login.html', {'form':form})
user = user.authenticate(id_badge=form.cleaned_data['badge_number'])
if user is not None:
auth.login(request, user)
return redirect(reverse('main-menu'))
else:
form.add_error('badge_number', 'Badge number not recognised')
else:
form = LoginForm()
return render(request, 'login.html', {'form': form})
我还有一个自定义身份验证后端来检查徽章号码:
class RFIDBackend(object):
def authenticate(id_badge=None):
try:
person = Models.People.objects.get(info1=id_badge, deleted=False, system_user=True)
except Models.People.DoesNotExist, Models.People.MultipleValuesReturned:
return None
try:
user = User.objects.get(username=person.login)
except User.DoesNotExist:
return None
if user.is_active:
return user
return None
def get_user(id_badge=None):
try:
person = Models.People.objects.get(info1=id_badge, deleted=False, system_user=True)
except Models.People.DoesNotExist, Models.People.MultipleValuesReturned:
return None
try:
user = User.objects.get(username=person.login)
except User.DoesNotExist:
return None
return user
尝试登录时,用户成功重定向到菜单页面,但随后模板在尝试将他们的名字放在页面上时引发错误:
'AnonymousUser' object has no attribute 'first_name'
应该是cleaned_data
不是cleaned_date
?
Models.People.objects.get(id_badge=form.cleaned_data['badge_number'], deleted=False, system_user=True)
您的 get_user
方法应该使用用户的主键,而不是 id_badge
。由于您使用的是内置用户,因此您可以使用与 Django 的 ModelBackend
.
from django.contrib.auth import get_user_model
class RFIDBackend(object):
...
def get_user(self, user_id):
UserModel = get_user_model()
try:
return UserModel._default_manager.get(pk=user_id)
except UserModel.DoesNotExist:
return None
您尝试扩展它以对 deleted
和 system_user
字段进行检查。如果你这样做,测试以确保它在删除用户时按预期工作,我不是 100% 确定它会导致用户被注销。