打通 Django 认证:原生 Auth 组件实战与 API 改造

菜鸟教程里的 Auth 组件用法教了如何用 authenticatelogin 处理表单提交,但在如今前后端分离(React/Vue + Django REST Framework)的架构下,传统的模板重定向玩法已经不怎么适用了。

今天,我们以最小可行性产品(MVP)的原则,讲透如何在真实项目中"魔改" Django 原生 Auth 组件,将其包装成可供现代前端调用的 RESTful API。

一、 功能演示

在经典的 Django 教程中,认证流程通常是:接收表单 -> authenticate 查库 -> login 写 Session -> redirect 页面跳转。

但在我们现有的项目中,这套思路被精简重构成如下 MVP 流程:

  1. 接口化登录:接收前端传来的 JSON 格式账号密码,替代原先的 Form 表单。
  2. 原生校验 :依然使用 django.contrib.auth.authenticate 验证合法性,它会自动处理复杂的密码 Hash 比对逻辑。
  3. 双重状态保持 :验证通过后,既调用原生 login 写入服务端 Session,同时利用 SimpleJWT 生成 Token 返回给前端。这样既兼容了 Django 后台,又支持了前端的无状态请求。
  4. 接口化登出 :前端发请求,服务端调用原生 logout 清理 Session。

二、 核心代码

1. 登录逻辑

这里重写了登录视图,融合了原生 Auth 与 JWT 体系。

python 复制代码
from django.contrib.auth import authenticate, login as django_login
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_simplejwt.tokens import RefreshToken

class TokenAdminView(APIView):
    # 允许任何人访问登录接口
    permission_classes = [] 

    def post(self, request):
        # 1. 获取前端传来的账号密码
        username = request.data.get("username")
        password = request.data.get("password")

        # 2. 核心:调用原生 authenticate 验证身份
        # 内部会自动去 auth_user 表查询并比对密码哈希值
        user = authenticate(request, username=username, password=password)
        
        if not user:
            return Response({"detail": "账号或密码错误"}, status=400)

        # 3. 核心:调用原生 login 写入 Session
        django_login(request, user)
        
        # 4. 生成 JWT 令牌供前端后续调用接口使用
        refresh = RefreshToken.for_user(user)
        
        return Response({
            "access": str(refresh.access_token),
            "role": "admin"
        })

2. 登出逻辑

登出接口非常极简,核心就是调原生的 logout 方法,它会帮你把服务端的 Session 记录和 request.user 状态抹除。

python 复制代码
from django.contrib.auth import logout as django_logout
from rest_framework.permissions import IsAuthenticated

class LogoutView(APIView):
    # 只有登录用户才能调登出
    permission_classes = [IsAuthenticated]

    def post(self, request):
        # 核心:清理 Session
        django_logout(request)
        return Response({"ok": True, "msg": "已安全退出"})

三、 验证接口

这套接口支持任何端直接调用。

1. 登录接口测试

  • 请求地址POST http://127.0.0.1:8000/api/auth/token/admin/

  • 请求头Content-Type: application/json

  • Body (JSON)

    json 复制代码
    {
        "username": "admin",
        "password": "admin"
    }
  • 预期响应 (HTTP 200 OK)

    json 复制代码
    {
        "access": "省略",
        "role": "admin"
    }
相关推荐
Moment13 分钟前
面试官:如果产品经理给你多个需求,怎么让AI去完成❓❓❓
前端·后端·面试
每天进步一点_JL1 小时前
JVM 内存模型与 OOM 排查:从入门到实战
后端
Flittly1 小时前
【LangGraph新手村系列】(5)时间旅行:浏览历史、分叉时间线与修改过去
python·langchain
REDcker1 小时前
个人博客网站建设指南 Markdown资产化与静态站选型部署
前端·后端·博客·markdown·网站·资产·建站
Supersist2 小时前
【设计模式03】使用模版模式+责任链模式优化实战
后端·设计模式·代码规范
2301_782040452 小时前
CSS Flex布局中如何实现导航栏与Logo的左右分布_利用justify-content- space-between
jvm·数据库·python
yaoxin5211232 小时前
400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件
java·开发语言·python
Fox爱分享2 小时前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
java·后端·面试
折哥的程序人生 · 物流技术专研2 小时前
《Java面试85题图解版(二)》进阶深化上篇:并发编程 + JVM
java·开发语言·后端·面试
Mahir082 小时前
MySQL 数据一致性的基石:三大日志( redo log/undo log/binlog)与两阶段提交(Prepare 阶段和Commit 阶段)深度解密
数据库·后端·mysql·面试