Django 请求不保存登录用户

Django request doesn't save the logged in user

所以我开始学习 Django 身份验证。

from django.contrib.auth import login as log_in

def login(request):
    ...
    if request.method == "POST":
            form = UserLoginForm(request.POST)
            if form.is_valid():
                user = User.objects.filter(email=form.cleaned_data["email"])
                if user.exists():
                    user = user.first()
                    if check_password(
                        form.cleaned_data["password"], user.password
                    ):
                        log_in(request,user)
                        return redirect("/main/")
                    else:
                        messages.warning(request, "email/password are incorrect")
                else:
                    messages.warning(request, "User not found")
    ...

我正在尝试在另一个视图中访问 request.user,如下所示:

if request.user.is_authenticated:
    #do somthing 

但在调试时我发现在第一个代码 log_in() 语句之后 request.user 已通过身份验证,但在第二个代码中却没有。

您必须设置身份验证后端:

    from django.conf import settings
    # ...
    user.backend = settings.AUTHENTICATION_BACKENDS[0]
    log_in(request, user)

我发现了问题, 问题是我使用的是带有电子邮件属性而不是用户名的自定义用户模型,因此我必须构建一个新的后端以与我的自定义模型一起使用,然后将其添加到 [=19] 中的 AUTHENTICATION_BACKENDS =] 文件.

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.hashers import check_password
from .models import User

class NewBackend(ModelBackend):
    def authenticate(self, request, email, password) -> User:
        try:
            user: User = User.objects.get(email=email)
            if user.check_password(password):
                return user
            else:
                return None
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

并在 views.py

def login(request: HttpRequest):
    if request.user.is_authenticated:
        return redirect("/main/")
    if request.method == "POST":
        form = UserLoginForm(request.POST)
        if form.is_valid():
            umail=form.cleaned_data['email']
            upasswd=form.cleaned_data['password']
            user = authenticate(request=request,email=umail,password=upasswd)
            if user is not None:         
                    log_in(request,user)
                    return redirect("/main/")
            else:
                messages.warning(request, "email/password are incorrect")
    form = UserLoginForm()
    context = {"title": "Login", "form": form}
    return render(request, "login.html", context)

settings.py:

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'login_signup.backend.NewBackend',
]