簡體   English   中英

Django的身份驗證方法不起作用

[英]Django authenticate method not working

我正在嘗試使用django.contrib.auth authenticate()方法中的默認Django進行身份驗證(如果用戶存在)。 我在用戶注冊后立即執行此操作。 用戶注冊,並將他們的用戶名,電子郵件和密碼輸入數據庫,但是當我調用authenticate(username=username, password=password) ,由於某種原因它返回None 密碼存儲為哈希值,值得注意的是,我使用的是我自己的自定義用戶模型,但該繼承自django.contrib.auth用戶模型。

這是我的看法:

class RegisterView(SuccessMessageMixin, View):
    form_class = RegisterForm
    template_name = 'oauth/auth_form.html'
    success_message = "You have successfully created an account!"

    # Display blank form
    def get(self, request):
        form = self.form_class(None)
        return render(request, self.template_name, {'form': form})

    def post(self, request):
        form = self.form_class(request.POST)

        if form.is_valid():
            user = form.save(commit=False) # Do not save to table yet

            username = form.cleaned_data['username']
            password = form.cleaned_data['password']

            try:
                validate_password(password, user)

            except ValidationError as e:
                form.add_error('password', e)  # to be displayed with the field's errors
                return render(request, self.template_name, {'form': form})

            user.set_password(password)
            user.save()

            # Let's try to login the user
            user = authenticate(username=username, password=password)

            if user is not None:

                login(request, user)
                return redirect('http://google.com')


        return render(request, self.template_name, {'form': form})

為什么驗證方法對我不起作用?

盡管@schwobaseggl的答案可以解決您的問題,即“無需身份驗證,只需直接登錄”,但我在一個較舊的項目中做了非常相似的事情,也許可以為您提供幫助。

在這里,注冊過程自動登錄用戶,並且我們使用電子郵件令牌作為密碼:

def get_or_create_user(mobile):
    UserModel = get_user_model()
    try:
        user = UserModel.objects.get(mobile=mobile)
    except UserModel.DoesNotExist:
        user = UserModel(mobile=mobile, username=mobile)
        user.set_unusable_password()
        user.save()
    return user

...

class UserRegistrationAndLogin(View):
    ...

    def post(self, request):
        form = self.form_class(request.POST)
        next_url = request.GET.get('next')
        if form.is_valid():
            entered_token = form.cleaned_data['otp']
            if entered_token == self.token:
                user = get_or_create_user(mobile=self.mobile)
                login(request, user)
                return redirect(next_url or settings.LOGIN_REDIRECT_URL)
            else:
                form.add_error('otp', 'OTP does not match!')
        return render(request, self.template_name, context={'form': form, 'mobile': self.mobile})

暫無
暫無

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

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