在Django中设置is_authenticated为True是标准的吗?

xpcnnkqh  于 2023-04-22  发布在  Go
关注(0)|答案(2)|浏览(124)

我是Django的新手,我使用的是Django 4.2。我正在制作一个网站,我一直被注销逻辑所困扰。我很困惑,我是否应该在www.example.com文件中将is_authenticated字段默认设置为Truemodels.py。
我已经谷歌了很多,但我运行不明白如何真正验证用户在登录和注销。
有谁能帮我理解其中的逻辑吗?我在哪里使用登录装饰器,以及如何在登录期间将is_authenticated字段设置为true,在注销期间设置为false

pjngdqdw

pjngdqdw1#

您不需要自己设置is_authenticated,因为此只读字段由AuthenticationMiddleware处理。
在Django文档中阅读更多关于:

  • is_authenticated属性
  • 认证中间件
  • 视图中的身份验证

以下是在自定义视图中登录用户的方法:

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST["username"]
    password = request.POST["password"]
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        # Redirect to a success page.
        ...
    else:
        # Return an 'invalid login' error message.
        ...

你也可以使用Django方便的基于类的LoginView:https://docs.djangoproject.com/en/4.2/topics/auth/default/#django.contrib.auth.views.LoginView
下面是在自定义视图中注销用户的方法:

from django.contrib.auth import logout

def logout_view(request):
    logout(request)

或者再次使用方便的LogoutView。
如果需要,可以在request.user上检查is_authenticated
使用登录装饰器,您可以只允许登录的用户访问。您可以将未经验证的用户重定向到装饰器中设置的login_url。或者如果跳过,它将自动重定向到settings.LOGIN_URL

bmvo0sr5

bmvo0sr52#

或者创建一个用户认证系统,你需要在构建模型中的用户,或者你创建一个新的模型并扩展用户模型。Django有自己的认证功能,通过接收用户发布的用户名和密码来进行认证,并检查数据库是否存在,如果它返回true django有一个相同的内置登录功能,它将is_authenticated属性设置为yes和之后,无论你想在登录后做什么,你都可以把逻辑放在那里。注销也是如此,django有相同的注销函数,你传入请求和用户,然后把is_authenticated属性设置为false给用户;

def login_view(request):
if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']
    
    user = authenticate(request, username=username, password=password)
    
    if user is not None:
        login(request, user)
        return redirect('home')
    else:
        error_message = 'ERROR LOGIN. Please try again.'
         #TAKING USER BACK TO LOGIN PAGE
        return render(request, 'login.html', {'error_message': error_message})

return render(request, 'login.html')

def logout_view(request):logout(request)return redirect('home ')

相关问题