打通 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"
    }
相关推荐
hboot1 天前
AI工程师第五课 - 大语言模型基础
python·llm·fastapi
AOwhisky1 天前
Python 学习笔记(第一期与第二期)——基础语法——核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发
STLearner1 天前
ICML 2026 | LLM×Graph论文总结[1]【图基础模型,文本属性图,多模态属性图,图对齐,图提示学习,关系深度学习
论文阅读·人工智能·python·深度学习·学习·机器学习·数据挖掘
习明然1 天前
我的本地化AI项目(三)
人工智能·python·electron·c#·avalonia
喜欢的名字被抢了1 天前
Python实战:SQLAlchemy ORM与FastAPI项目集成
开发语言·python·sql·教程·fastapi
夏季疯1 天前
读论文:STARS 是什么结构?一个统一的歌声自动标注框架
python
遨游DATA1 天前
Spring Boot 启动失败排查:如何区分多 Bean 冲突与清理阶段异常
java·spring boot·后端
IT_陈寒1 天前
Java线程池这个坑我算是踩明白了
前端·人工智能·后端
掉头发的王富贵1 天前
我来入职新公司两个月了,为什么只写了100行代码?
后端·ai编程
从零开始的代码生活_1 天前
C++ 内存管理:从内存分区到 new/delete 底层原理
开发语言·c++·后端