[英]Django user is still AnonymousUser after calling auth.login()
I'm trying to log in a user after they scan an RFID tag on their ID badge, however after calling auth.login()
, the user is not logged in, and request.user
is still AnonymousUser
. 我尝试在用户扫描其ID徽章上的RFID标签之后登录用户,但是在调用
auth.login()
,该用户未登录,并且request.user
仍然是AnonymousUser
。
I'm using the following view to authenticate the user: 我正在使用以下视图来验证用户身份:
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})
I also have a custom authentication backend to check the badge numbers: 我也有一个自定义的身份验证后端来检查徽章编号:
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
When trying to log in, the user is successfully redirected to the menu page, but then the template raises an error when it tries to put their name on the page: 尝试登录时,用户已成功重定向到菜单页面,但是模板在尝试将其名称放在页面上时引发错误:
'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)
Your get_user
method should take the primary key of the user, not the id_badge
. 您的
get_user
方法应使用用户的主键,而不是id_badge
。 Since you are using the built in user, you could use the same implementation as Django's ModelBackend
. 由于您使用的是内置用户,因此可以使用与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
You try extending this to do the checks on the deleted
and system_user
fields. 你试试这个扩展上做了支票
deleted
和system_user
领域。 If you do this, test to make sure it works as expected when a user is deleted, I'm not 100% sure it will lead to the user being logged out. 如果执行此操作,请进行测试以确保删除用户后它可以按预期运行,但我不是100%确定它将导致用户注销。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.