在Django中实现记住我功能

2023-04-11 00:00:00 django 功能 记住我

记住我功能通常用于网站登录模块,让用户在下一次访问网站时不必重新输入用户名和密码,直接使用之前保存的登录信息进行登录。

在Django中,实现记住我功能需要以下步骤:

  1. 在登录页面添加“记住我”选项,通常使用复选框来实现。
<form method="post">
  {% csrf_token %}
  <label for="username">Username:</label>
  <input type="text" name="username" id="username" required>
  <br>
  <label for="password">Password:</label>
  <input type="password" name="password" id="password" required>
  <br>
  <input type="checkbox" name="remember_me" id="remember_me">
  <label for="remember_me">Remember me</label>
  <br>
  <input type="submit" value="Login">
</form>
  1. 在视图函数中处理“记住我”选项。如果用户选择了“记住我”,则将登录信息保存到cookie中;否则,使用session保存登录信息。
from django.contrib.auth import authenticate, login
from django.http import HttpResponse
from django.shortcuts import render

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        remember_me = request.POST.get('remember_me')

        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            if remember_me:
                request.session.set_expiry(1209600)  # 设置session过期时间为两周
                response = HttpResponse('Login success with remember me.')
                response.set_cookie('username', username, max_age=1209600)  # 将用户名保存到cookie中
                response.set_cookie('password', password, max_age=1209600)  # 将密码保存到cookie中
                return response
            else:
                request.session.set_expiry(0)  # 关闭浏览器即失效
                return HttpResponse('Login success without remember me.')
        else:
            return HttpResponse('Invalid username or password.')
    else:
        return render(request, 'login.html')
  1. 在其他需要登录才能访问的视图函数中,先检查是否存在session或cookie中的登录信息,如果存在则自动登录。
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse

@login_required
def protected_view(request):
    username = request.session.get('username') or request.COOKIES.get('username')  # 优先使用session中的用户名
    password = request.session.get('password') or request.COOKIES.get('password')  # 优先使用session中的密码
    if authenticate(request, username=username, password=password):
        # 登录成功,返回受保护页面内容
        return HttpResponse('Protected content.')
    else:
        # 登录失败,跳转到登录页面
        return redirect('login')

这样就完成了Django中的记住我功能的实现。需要注意的是,保存在cookie中的用户名和密码是明文,存在安全风险,因此需要对密码进行加密和解密。此外,如果用户选择了记住我,保存在cookie中的信息需要设置过期时间,避免长期保存密码导致安全问题。

相关文章