Django用户登录验证和自定义验证类

一、FBV 用户登录验证

1.1 登录验证并加入 session

用户登录时,使用 authenticate 验证用户名和密码是否正确,正确则返回一个用户对象。

用户名默认的字段名是 username

密码默认的字段名是 password

将已验证的用户添加到当前会话(session)中,可使用 login() 函数完成。

python 复制代码
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.
        ...

1.2 登出

python 复制代码
from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    # Redirect to a success page.

注意,如果用户未登录,logout() 不会报错。

调用 logout() 后,当前请求的会话数据会被全部清除

1.3 限制对未登录用户的访问

限制访问页面最简单的办法就是检查 request.user.is_authenticated 并重定向到登录页面。

这个校验的属性同样使用模板语言中

{% if request.user.is_authenticated %}
登录成功
{% endif %}

login_required 装饰器实现

python 复制代码
from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

二、 CBV 用户登录验证

这里假设用户的 model 是 UsersProfile 是继承于 AbstractUser

2.1 登录验证

2.1.1 默认的验证类

Django 的 LoginView 用于对用户登录时提供的用户名和密码进行校验.

注意:

LoginView 也是只验证用户名和密码,并且要求存入数据库的密码字段的值必须是密文的。

django.contrib.auth.hashers 中的 make_password 可以对明文加密。

python 复制代码
from django.contrib.auth.hashers import make_password
make_password('明文密码')

① 设置 settings

首先,需要在 settings.py 中设置如下内容

python 复制代码
from django.urls import reverse_lazy
# 用户登录成功后跳转的 URL
LOGIN_REDIRECT_URL = reverse_lazy("users:users")

# 用户登录 GET 请求的 URL和登录验证失败后跳转到的 URL
LOGIN_URL = reverse_lazy('users:login')

② 视图

views.py 中编写如下 CBV

python 复制代码
from django.contrib.auth.views import LoginView


class UserLoginView(LoginView):
    # 指定一个用于接收到 GET 请求时,需要返回的模板文件
    template_name = 'login.html'

三、 自定义验证类

假如,希望在用户登录的时候,可以支持多种方式,比如: 邮箱,手机号等。

那就需要对这些字段进行校验,默认的验证类 LoginView 是无法实现的,此时就需要自定义一个验证类。

3.1 登录验证

① 编写自定义验证类

可以在项目 app 的任意一个文件中编写这个类,之后设置一下就可以了。

比如在 users 应用下新建一个文件 users_auth.py, 添加如下内容

python 复制代码
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q


User = get_user_model()

class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            # 通过用户名或邮箱来获取用户对象
            user = User.objects.get(
                Q(username=username) |
                Q(email=username ) |
                Q(mobile = username)
            )
            # 验证用户的密码
            if user.check_password(password):
                return user
        except Exception:
            return None

② 在 settings.py 中设置

python 复制代码
# 自定义登录验证类
AUTHENTICATION_BACKENDS = (
    'users.users_auth.CustomBackend',  # 注意后面的逗号
)

3.2 限制对未登录用户的访问

用基于类的视图时,可以使用 LoginRequiredMixin 实现和 login_required 相同的行为。这个 Mixin 应该在继承列表中最左侧的位置。

python 复制代码
from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'

示例:

python 复制代码
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin

class AssetListView(LoginRequiredMixin, ListView):
    # 假如没有登录,页面将会跳转到下面设置的路由
    login_url = reverse_lazy("users:login")
    ...

3.3 退出登录

退出时候,用户的所以未保存的信息将会丢失,比如正则编写的一个页面中的内容。

同时用户信息和登录状态将会删除。

python 复制代码
from django.contrib.auth.views import LogoutView

class UserLogoutView(LogoutView):
    # 用户退出登录后,将要跳转的 URL
    next_page = reverse_lazy('users:login')
相关推荐
码界筑梦坊5 小时前
353-基于Python的大湾区气候数据可视化分析系统
开发语言·python·信息可视化·数据分析·django·vue·毕业设计
badhope9 小时前
前端已死?前端角色演进的四维技术证据链(2026年实证)
react.js·django·node.js
源码之家12 小时前
计算机毕业设计:Python汽车销量数据采集分析可视化系统 Flask框架 requests爬虫 可视化 车辆 大数据 机器学习 hadoop(建议收藏)✅
大数据·爬虫·python·django·flask·课程设计·美食
coderlin_14 小时前
Django DRF开发
python·django·sqlite
sxhcwgcy14 小时前
Elasticsearch(ES)基础查询语法的使用
python·elasticsearch·django
源码之家15 小时前
计算机毕业设计:Python二手车交易价格预测分析平台 Django框架 随机森林 可视化 数据分析 汽车 车辆 大数据 hadoop(建议收藏)✅
大数据·爬虫·python·机器学习·django·汽车·课程设计
小陈工15 小时前
Python Web开发入门(二):Flask vs Django,项目结构大比拼
前端·数据库·python·安全·web安全·django·flask
wellc15 小时前
Django视图与URLs路由详解
数据库·django·sqlite
源码之家1 天前
计算机毕业设计:基于Python的美食推荐分析系统 Django框架 爬虫 协同过滤推荐算法 可视化 推荐系统 数据分析 大数据(建议收藏)✅
爬虫·python·机器学习·django·flask·课程设计·美食
creaDelight1 天前
基于 Django 5.x 的全功能博客系统 DjangoBlog 深度解析
后端·python·django