簡體   English   中英

調用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

你試試這個擴展上做了支票deletedsystem_user領域。 如果執行此操作,請進行測試以確保刪除用戶后它可以按預期運行,但我不是100%確定它將導致用戶注銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM