当前位置: 首页 > article >正文

Django 学习日记(补充1)| 彻底吃透:自定义 JWT 认证 + 全局登录中间件

大家好这是我 Django 学习日记的第三篇。上一篇我们把路由、反向解析、DRF 自动路由、媒体文件、跨域全部讲明白了。今天我们进入整个项目最核心、最安全、最关键的部分用户登录认证体系在进入视图前的一篇补充文章。本文将从JWT 是什么→手写 JWT 生成→自定义 DRF 认证类→自定义全局登录中间件→白名单、匿名用户、异常处理全部逐行拆解。你开发中遇到的登录、token、中间件问题这一篇全部解决。一、本篇你能学到什么JWT 登录令牌如何生成自定义 DRF JWT 认证类逐行讲解自定义 Django 全局登录中间件企业级实战整个登录认证完整流程二、什么是 JWT为什么要用它一句话总结JWTJSON Web Token就是前端的 “登录身份证”。前后端分离项目中服务器不保存 session所以必须给前端发一个令牌登录成功 → 发放 JWT后续请求 → 携带 JWT服务器验证 JWT → 确认身份JWT 长这样plaintextaaaaa.bbbbb.ccccc分为三部分头部(声明加密算法)、载荷(存放自定义信息)、签名(对前两部分加密防止篡改)。三、第一步手写 JWT 生成函数我们先手写一个工具函数登录成功后生成 token。代码位置apps/oaauth/authentications.pypython运行import jwt import time from django.conf import settings # 生成 JWT Token def generate_jwt(user): # 过期时间7天 expire_time time.time() 60 * 60 * 24 * 7 # 传入用户ID 过期时间 项目密钥(传入自定义内容即载荷) return jwt.encode( {userid: user.pk, exp: expire_time}, keysettings.SECRET_KEY )关键讲解返回格式是标准 JWT不是自定义userid 是我们自己存在 token 里的exp 是 JWT 标准过期字段必须使用 SECRET_KEY 密钥签名四、第二步自定义 DRF JWT 认证类这是 DRF 官方规范的认证类专门验证 JWT 是否合法。全代码import jwt import time from django.conf import settings from rest_framework.authentication import BaseAuthentication, get_authorization_header, TokenAuthentication from rest_framework import exceptions from jwt.exceptions import ExpiredSignatureError from .models import OAUser#这里根据自己的项目来定义我的用户模型定义为OAUser def generate_jwt(user): expire_time time.time() 60 * 60 * 24 * 7 return jwt.encode({userid: user.pk, exp: expire_time}, keysettings.SECRET_KEY) class UserTokenAuthentication(BaseAuthentication): def authenticate(self, request): # 这里的request是rest_framework.request.Request对象 # 这里最后返回的是Django的原生request请求而不是DRF封装过的request请求 return request._request.user, request._request.auth class JWTAuthentication(BaseAuthentication): #定义关键字 keyword JWT def authenticate(self, request): #JWT令牌内容为JWT空格生成的token auth get_authorization_header(request).split() #如果令牌格式不合法或者不存在JWT令牌不做JWT验证直接放行由后续流程统一处理 if not auth or auth[0].lower() ! self.keyword.lower().encode(): return None if len(auth) 1: msg 不可用的JWT请求头 raise exceptions.AuthenticationFailed(msg) elif len(auth) 2: msg 不可用的JWT请求头JWT Token中间不应该有空格 raise exceptions.AuthenticationFailed(msg) try: jwt_token auth[1] jwt_info jwt.decode(jwt_token, settings.SECRET_KEY, algorithmsHS256) userid jwt_info.get(userid) try: # 绑定当前user到request对象上 user OAUser.objects.get(pkuserid) setattr(request,user, user) return user, jwt_token except: msg 用户不存在 raise exceptions.AuthenticationFailed(msg) except ExpiredSignatureError: msg JWT Token已过期 raise exceptions.AuthenticationFailed(msg)可能的疑问1. auth get_authorization_header(request).split()获取请求头并分割成[JWT, token字符串]2. if not auth or ... return None不是报错是跳过交给下一个认证类处理3. 为什么 len (auth) 必须等于 2因为格式必须是JWT xxxxxxx4. jwt.decode 三个参数干什么jwt_token要解码的 tokenSECRET_KEY必须用项目密钥验证防篡改HS256加密算法5. return user, jwt_tokenPython 支持返回多个值 → 本质返回元组DRF 认证类必须这样返回五、第三步桥接中间件与 DRF 的认证类class UserTokenAuthentication(BaseAuthentication): def authenticate(self, request): # 直接拿中间件已经验证好的用户 return request._request.user, request._request.auth UserTokenAuthentication 这个类的作用 将 DRF 包装的 request 对象 降级获取到 Django 原生 request 对象 从中取出中间件已经验证好的 user 和 auth 返回给 DRF 框架使用。 核心讲解在 DRF 框架中视图收到的 request 并不是 Django 原生 request而是 DRF 经过包装、增强后的rest_framework.request.Request对象。但我们的登录中间件是 Django 层面的中间件它把登录用户绑定到了原生 Django request 对象上。因此我们需要一个 “桥接” 的认证类这个类不做任何验证只负责 “桥接”从原生 request 中取出用户 → 交给 DRF 认证体系。六、最核心自定义 Django 全局登录中间件这是本篇最重点、最实战、企业级必用的部分。代码位置apps/oaauth/middlewares.py完整代码from django.utils.deprecation import MiddlewareMixin from rest_framework.authentication import get_authorization_header from rest_framework import exceptions import jwt from django.conf import settings from django.contrib.auth import get_user_model from django.http.response import JsonResponse from rest_framework.status import HTTP_403_FORBIDDEN from jwt.exceptions import ExpiredSignatureError from django.contrib.auth.models import AnonymousUser OAUser get_user_model() class LoginCheckMiddleware(MiddlewareMixin): keyword JWT def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 白名单不需要登录就能访问 self.white_list [/auth/login, /staff/active] #先判断是否有令牌有则进行令牌校验否则直接抛出异常(因为没令牌说明没登录) def process_view(self, request, view_func, view_args, view_kwargs): # 白名单判断 if request.path in self.white_list: request.user AnonymousUser() request.auth None return None # 开始校验 JWTtry 里面全部是登录校验 try: auth get_authorization_header(request).split() if not auth or auth[0].lower() ! self.keyword.lower().encode(): raise exceptions.ValidationError(请传入JWT) # 格式判断 if len(auth) 1: raise exceptions.AuthenticationFailed(无效的JWT请求头) elif len(auth) 2: raise exceptions.AuthenticationFailed(JWT不能包含空格) # 解码 jwt_token auth[1] jwt_info jwt.decode(jwt_token, settings.SECRET_KEY, algorithms[HS256]) userid jwt_info.get(userid) user OAUser.objects.get(pkuserid) # 绑定用户 request.user user request.auth jwt_token # 验证失败 → 未登录 except Exception as e: return JsonResponse({detail: 请先登录}, statusHTTP_403_FORBIDDEN)七、中间件逐行拆解1. 为什么中间件要放在 oaauth 用户模块因为登录认证属于用户模块职责中间件强依赖用户模型企业级规范谁管理登录中间件就放谁那2. 为什么必须用 get_user_model ()因为中间件加载时模型还未初始化直接导入会报错3.init方法干什么初始化白名单登录页面、激活页面必须放行否则永远无法登录。白名单在 __init__ 中只初始化一次提高效率。4. super().init干什么调用父类构造方法必须写不写中间件报错5. 白名单代码到底干什么if request.path in self.white_list: request.user AnonymousUser() request.auth None return None讲解白名单接口不验证登录必须设置匿名用户保证视图 request.user 一定存在return None →放行继续执行视图6. 为什么要匿名用户Django 所有视图默认request.user一定存在不设置会直接崩溃。7. try 里面的代码干什么对非白名单接口进行 JWT 登录校验8. try 失败为什么代表未登录因为没有 Token / Token 错误 / Token 过期 未登录9. 为什么返回 JsonResponse给前端返回标准 JSON 错误提示八、整个登录认证执行流程前端请求 → 中间件白名单→ 放行非白名单→ JWT 校验校验成功→ 绑定用户校验失败→ 返回请先登录中间件通过 → DRF 认证类直接拿中间件的用户DRF 认可登录状态九、中间件注册必须配置settings.pyMIDDLEWARE [ ... apps.oaauth.middlewares.LoginCheckMiddleware,#放在所有中间件最后 ]十、DRF 认证配置python运行REST_FRAMEWORK { DEFAULT_AUTHENTICATION_CLASSES: [ apps.oaauth.authentications.UserTokenAuthentication, ] }十一、本篇总结JWT 就是登录身份证generate_jwt 生成令牌JWTAuthentication 验证令牌中间件做全局登录拦截白名单放行登录接口匿名用户保证视图不崩溃return None 代表放行我的分享到这里就结束了如有错误欢迎指正

相关文章:

Django 学习日记(补充1)| 彻底吃透:自定义 JWT 认证 + 全局登录中间件

大家好,这是我 Django 学习日记的第三篇。上一篇我们把路由、反向解析、DRF 自动路由、媒体文件、跨域全部讲明白了。今天我们进入整个项目最核心、最安全、最关键的部分:用户登录认证体系(在进入视图前的一篇补充文章)。本文将从…...

OpenCV实战:用Python+SIFT+八点算法搞定双目视觉匹配(附完整代码)

OpenCV实战:PythonSIFT八点算法实现双目视觉精准匹配 在计算机视觉领域,立体匹配是一个经典而富有挑战性的问题。想象一下,当你用双眼观察世界时,大脑能自动计算出物体的距离——这正是双目视觉系统要模拟的过程。本文将带你用Pyt…...

HunyuanVideo-Foley部署案例:混合精度(FP16/AMP)推理性能实测报告

HunyuanVideo-Foley部署案例:混合精度(FP16/AMP)推理性能实测报告 1. 测试环境与配置 1.1 硬件配置 显卡:RTX 4090D 24GB显存(驱动550.90.07)CPU:10核心处理器内存:120GB DDR4存储…...

手指划过屏幕放大模型界面,环氧树脂层和纤维基体在激光路径下呈现出清晰的物理场分布。突然发现这个双层材料烧蚀模型跑得格外顺畅——看来前几天通宵调参没白费

comsol激光清洗、烧蚀双层材料 表面一层50μm厚度的环氧树脂(可更换成其他材料),基体材料为纤维材料。 添加功率为13W的激光进行清洗或烧蚀 模型非常成功、角度选择很奈斯在COMSOL里建模时有个小细节特别关键:把环氧树脂层的厚度参数设为全局变量。别小看…...

精益生产方式的核心功能拆解:精益生产方式如何解决多品种小批量场景下的库存积压难题

在当前制造业从“少品种大批量”向“多品种小批量”急剧转型的背景下,精益生产方式已成为企业打破库存僵局的唯一出路,它通过准时化拉动和消除浪费的核心逻辑,精准解决了传统模式下因预测失效导致的严重库存积压问题;面对多变的订…...

从sipML5到现代框架:FreeSWITCH WebRTC客户端升级指南与选型建议

从sipML5到现代框架:FreeSWITCH WebRTC客户端升级指南与选型建议 如果你正在维护一个基于sipML5的FreeSWITCH WebRTC前端项目,可能已经感受到了技术债的压力——浏览器兼容性问题频发、功能扩展困难、社区支持几乎为零。这不是你的错,sipML5作…...

3个高级技巧:用ScintillaNET构建专业级文本编辑器的实战指南

3个高级技巧:用ScintillaNET构建专业级文本编辑器的实战指南 【免费下载链接】ScintillaNET A Windows Forms control, wrapper, and bindings for the Scintilla text editor. 项目地址: https://gitcode.com/gh_mirrors/sc/ScintillaNET 在当今的软件开发领…...

RTX 4090显卡福利:Qwen2.5-VL-7B-Instruct轻量化部署,支持对话历史管理

RTX 4090显卡福利:Qwen2.5-VL-7B-Instruct轻量化部署,支持对话历史管理 1. 项目概述 Qwen2.5-VL-7B-Instruct是阿里通义千问推出的多模态大模型,专为视觉交互任务优化。本教程将展示如何在RTX 4090显卡上实现该模型的轻量化部署&#xff0c…...

大多数加密API都不够用:量化团队真正需要的数据到底是什么?

如果你做过加密相关开发,无论是: 量化交易数据平台研究分析风控系统 你大概率都会经历一个阶段: 👉 API 接了一堆,但始终“不够用”。 常见的一个误区 很多人在刚开始做数据接入时,会觉得: …...

Xinference-v1.17.1智能家居控制系统开发

Xinference-v1.17.1智能家居控制系统开发 1. 智能家居控制新体验 想象一下,早上醒来窗帘自动拉开,阳光洒进房间,咖啡机开始工作,音响播放你喜欢的音乐。这不是科幻电影,而是用Xinference-v1.17.1构建的智能家居控制系…...

LyricsX:macOS平台的多源歌词同步与显示技术方案

LyricsX:macOS平台的多源歌词同步与显示技术方案 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是一款专为macOS设计的开源歌词应用,通过集成多个歌词源和…...

重磅:中科院分区退出历史!| 附2026年《新锐期刊分区表》完整版EXCEL.

3月24日,2026版《新锐期刊分区表》正式发布,随后引起了广泛的关注和争议。议论最多的,竟然是《新锐期刊分区表》到底是不是“中科院分区表”?3 月 25 日,公众号“新锐学术”发布《“走进新锐分区”专题:即将…...

Pixel Fashion Atelier部署教程:Stable Diffusion像素时装生成工作站保姆级安装指南

Pixel Fashion Atelier部署教程:Stable Diffusion像素时装生成工作站保姆级安装指南 1. 项目介绍 Pixel Fashion Atelier(像素时装锻造坊)是一款基于Stable Diffusion与Anything-v5模型的图像生成工作站。与传统AI工具不同,它采…...

别再乱改文件夹权限了!深入理解IIS应用程序池标识与ASP.NET临时目录的权限管理

深入解析IIS应用程序池权限管理:从临时目录到生产环境的最佳实践 当你在IIS中部署ASP.NET应用时,是否遇到过这样的错误:"当前标识(IIS APPPOOL\DefaultAppPool)没有对Temporary ASP.NET Files的写访问权限"?这个看似简单…...

FINCH聚类算法实战:5分钟搞定无参数聚类(附Python代码)

FINCH聚类算法实战:5分钟搞定无参数聚类(附Python代码) 在数据科学和机器学习领域,聚类分析一直是探索性数据分析的重要工具。传统聚类方法如K-means、DBSCAN等虽然广泛应用,但都面临一个共同挑战:需要人工…...

NaViL-9B图文问答入门:Web界面支持拖拽上传+历史记录回溯功能

NaViL-9B图文问答入门:Web界面支持拖拽上传历史记录回溯功能 1. 平台介绍 NaViL-9B是一款原生多模态大语言模型,由专业研究机构开发。它不仅能像传统语言模型一样处理纯文本问答,还具备强大的图片理解能力。这意味着你可以上传一张图片&…...

Python实战:5分钟搞定Paillier同态加密的安装与基础使用(附避坑指南)

Python实战:5分钟搞定Paillier同态加密的安装与基础使用(附避坑指南) 隐私计算领域近年来发展迅猛,而同态加密作为其核心技术之一,正在金融、医疗等行业的数据协作场景中发挥越来越重要的作用。Paillier算法作为支持加…...

SDMatte高可用集群部署:基于Kubernetes的弹性伸缩方案

SDMatte高可用集群部署:基于Kubernetes的弹性伸缩方案 1. 为什么需要高可用部署方案 电商大促期间,某美妆品牌突然发现他们的AI抠图服务崩溃了——每秒上千张的商品图等待处理,但单机部署的服务早已不堪重负。这种场景在企业级AI应用部署中…...

Qwen2-VL-2B-Instruct性能优化:Web服务并发请求处理与队列管理

Qwen2-VL-2B-Instruct性能优化:Web服务并发请求处理与队列管理 当你的AI图片分析服务突然火了,用户蜂拥而至,同时上传几十张图片要求分析,会发生什么?最直接的结果可能就是服务器卡死,用户看到“服务超时”…...

JavaScript动态交互:在网页中实时调整参数并预览LiuJuan生成效果

JavaScript动态交互:在网页中实时调整参数并预览LiuJuan生成效果 你是不是也遇到过这种情况?想用AI模型生成图片,但每次调整参数都要在代码里改来改去,然后重新运行脚本,等半天才能看到效果。整个过程就像在开盲盒&am…...

Pixelorama:免费开源的2D精灵编辑器终极指南

Pixelorama:免费开源的2D精灵编辑器终极指南 【免费下载链接】Pixelorama A free & open-source 2D sprite editor, made with the Godot Engine! Available on Windows, Linux, macOS and the Web! 项目地址: https://gitcode.com/gh_mirrors/pi/Pixelorama …...

2026年多模态AI前瞻:Qwen3-VL-2B开源生态发展潜力分析

2026年多模态AI前瞻:Qwen3-VL-2B开源生态发展潜力分析 1. 项目概述与核心价值 Qwen3-VL-2B-Instruct作为新一代开源视觉语言模型,代表了多模态AI技术的重要发展方向。这个模型不仅能够理解文本,更重要的是具备了"看"的能力——它…...

每日一题 力扣 3548. 等和矩阵分割 II 前缀和 哈希表 C++ 题解

文章目录题目描述思路简述代码实现复杂度分析踩坑记录题目描述 力扣 3548. 等和矩阵分割 II 示例 1: 输入: grid [[1,4],[2,3]] 输出: true 解释: 在第 0 行和第 1 行之间进行水平分割,结果两部分的元素和为 1 4 5…...

Cogito-v1-preview-llama-3B效果展示:中英日法等30+语言生成质量对比

Cogito-v1-preview-llama-3B效果展示:中英日法等30语言生成质量对比 1. 模型核心能力概览 Cogito v1预览版是Deep Cogito推出的混合推理模型系列,在大多数标准基准测试中均超越了同等规模下最优的开源模型。这个3B参数的模型在编码、STEM、指令执行和通…...

PasteMD真实案例分享:从零散笔记到结构化学习计划的全过程

PasteMD真实案例分享:从零散笔记到结构化学习计划的全过程 1. 引言:当杂乱笔记遇上智能格式化 你是否经历过这样的困境?电脑桌面上散落着十几个临时创建的记事本文件,手机备忘录里堆满了未经整理的零散想法,会议录音…...

[260326] x-cmd v0.8.10:跨 Shell 统一配置命令短名;自动装好依赖运行 WhisperLiveKit 实时语音转写

[260326] x-cmd v0.8.10:跨 Shell 统一配置命令短名;自动装好依赖运行 WhisperLiveKit 实时语音转写 开放 shortcut 内部模块,配置命令短名,支持跨 Shell 统一使用whisper 模块新增 livekit 命令,自动装好依赖&#x…...

Qwen2.5-VL-7B-Instruct镜像免配置教程:开箱即用的视觉语言推理平台

Qwen2.5-VL-7B-Instruct镜像免配置教程:开箱即用的视觉语言推理平台 1. 开篇介绍 你是否遇到过这样的场景:需要快速搭建一个能同时理解图片和文字的AI系统,却被复杂的配置步骤劝退?今天我要介绍的Qwen2.5-VL-7B-Instruct镜像&am…...

SOONet与Transformer架构深度解析:提升长视频理解精度的核心技术

SOONet与Transformer架构深度解析:提升长视频理解精度的核心技术 最近在折腾长视频内容理解的项目时,遇到了一个挺头疼的问题:用户给一段长达几分钟甚至几十分钟的视频,再提一个复杂的自然语言问题,比如“请找出视频中…...

NaViL-9B图文理解入门:支持中英文混合提问的实测案例

NaViL-9B图文理解入门:支持中英文混合提问的实测案例 1. 认识NaViL-9B NaViL-9B是一款原生多模态大语言模型,由专业研究机构开发。它最大的特点是能够同时处理文字和图片信息,就像一个能"看图说话"的智能助手。无论是纯文字问题&…...

NaViL-9B实战手册:健康检查API与服务异常定位全流程

NaViL-9B实战手册:健康检查API与服务异常定位全流程 1. 平台概览 NaViL-9B是由专业AI研究机构开发的原生多模态大语言模型,能够同时处理纯文本问答和图片理解任务。该模型特别针对中文场景优化,支持中英文混合输入,为开发者提供…...