详解Django的 login() 函数:用户登录

  • Post category:Python

Django的login()函数是用于用户认证的函数,主要用于登录。该函数接收两个必要参数:请求对象和用户对象,以及一个可选的参数,即后端参考表名称。

该函数的作用是将认证后的用户信息保存到会话中。登录成功并返回HttpResponseRedirect时,会在HttpResponseRedirect中设置session cookie,该cookie中包含用户ID和哈希值,用于在后续请求中识别已经登录的用户。

以下是该函数的使用方法的完整攻略:

参数

def login(request, user, backend=None)
  • request:必需,请求对象。
  • user:必需,表示登录的用户。若用户不存在,则调用方应在解释底层的用户身份验证功能后尝试创建用户。
  • backend:表示要使用的身份验证后端的名称。

实现

在实现中,需要引入login()函数和render()函数。login函数为Django自带的函数,render函数则是从Django.shortcuts模块中导入。

代码示例:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login

def user_login(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:
            return render(request, 'login.html',{'error':'用户名或密码错误'})
    return render(request, 'login.html')

user_login 函数接受POST请求。当登录表单提交时,函数从请求对象中获取用户名和密码。函数使用Django内置函数 authenticate() 验证用户凭据。如果用户存在且输入的密码与库中存储的密码匹配,则 authenticate() 函数将返回验证的用户对象。在这种情况下,该函数还调用 login() 函数将认证的用户信息保存到会话中,并返回 redirect() 函数以将用户重定向到 home 页面。如果没有验证的用户对象,则该函数重新渲染具有错误消息的 login.html 模板。如果函数收到GET请求,则渲染表单并将其返回给用户进行输入。

示例

下面提供了两个实例说明。

示例 1

为了说明login()函数的使用方法,下面使用一个基本的示例。首先要确保您已经使用django.contrib.auth 应用配置了认证系统,并定义了简单的 User 模型。

在视图中,需要使用 authenticatelogin 函数。假设在 login 页面上有一个HTML表单,其中包含用户名 username 和密码 password 字段。user_login 视图将从表单中获取这些值并传递给 authenticate 函数。

from django.contrib.auth import authenticate, login
from django.http import HttpResponse
from django.shortcuts import render, redirect

def user_login(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:
            return render(request, 'login.html', {'error': '用户名或密码错误'})
    return render(request, 'login.html')

当用户提交登录表单时,会调用user_login函数。函数从请求对象中获取用户名和密码。函数使用Django内置函数 authenticate() 验证用户凭据。如果用户存在且输入的密码与库中存储的密码匹配,则 authenticate() 函数将返回验证的用户对象。在这种情况下,该函数还调用 login() 函数将认证的用户信息保存到会话中,并返回 redirect() 函数以将用户重定向到 home 页面。如果没有验证的用户对象,则该函数重新渲染具有错误消息的 login.html 模板。

示例 2

下面是另一个示例,展示如何在 Django LoginView 中使用 login 函数。

from django.contrib.auth import login
from django.contrib.auth.views import LoginView
from django.urls import reverse_lazy

class UserLoginView(LoginView):
    template_name = 'login.html'
    success_url = reverse_lazy('home')

    def form_valid(self, form):
        response = super(UserLoginView, self).form_valid(form)
        login(self.request, self.get_user())
        return response

使用Django LoginView 时,您需要在您的URLconf文件中定义URL模式并指定要使用的视图。LoginView将重定向到success_url 属性定义的位置,并为用户保存cookie。

在示例中,UserLoginView 继承 LoginView 。 我们使用 reverse_lazy 生成要重定向到的URL 。然后我们重写 form_valid 方法以在处理表单时调用login 函数。form_valid 方法是LoginView 的默认实现,用于处理表单验证,用于分离验证和认证逻辑,当表单验证通过时调用 login 函数。