channels 使用 djangorestframework-simplejwt 的token 验证用户有效性

【Django Channels】快速上手篇 routing.py作用类似于django的urls.py,只是在urls基础上又增加了协议这一维度。 阅读详情


前言

channels 使用 djangorestframework-simplejwt 的token 验证用户有效性


一、安装好channels库后,在asgi设置好websocket路由

官方推荐的写法

# mysite/asgi.py
import os

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import chat.routing

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

application = ProtocolTypeRouter({
  "http": get_asgi_application(),
  "websocket": AuthMiddlewareStack(
        URLRouter(
            chat.routing.websocket_urlpatterns
        )
    ),
})

但是 AuthMiddlewareStack 并不能帮我们解析到用户实例,包括我们要自定义的方法,很不方便,而且我用的 djangorestframework-simplejwt 库来校验用户,于是我重新了一个方法

二、使用步骤

1.新建 channelsmiddleware.py 文件

修改asgi:

# mysite/asgi.py
import os

from mysite.channelsmiddleware import JwtAuthMiddleware
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import chat.routing

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

application = ProtocolTypeRouter({
  "http": get_asgi_application(),
  "websocket": JwtAuthMiddleware(
        URLRouter(
            chat.routing.websocket_urlpatterns
        )
    ),
})

1.往 channelsmiddleware.py 添加

# mysite/channelsmiddleware.py


from channels.auth import AuthMiddlewareStack
from channels.db import database_sync_to_async
from channels.middleware import BaseMiddleware
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AnonymousUser, User
from django.db import close_old_connections
from jwt import decode as jwt_decode
from rest_framework_simplejwt.authentication import AUTH_HEADER_TYPE_BYTES
from rest_framework_simplejwt.exceptions import InvalidToken, TokenError
from rest_framework_simplejwt.tokens import UntypedToken


@database_sync_to_async
def get_user(validated_token):
    try:
        user = get_user_model().objects.get(id=validated_token["user_id"])
        # return get_user_model().objects.get(id=toke_id)
        return user

    except User.DoesNotExist:
        return AnonymousUser()


class JwtAuthMiddleware(BaseMiddleware):
    def __init__(self, inner):
        self.inner = inner

    async def __call__(self, scope, receive, send):
        # Close old database connections to prevent usage of timed out connections
        close_old_connections()
        parts = dict(scope['headers']).get(b'authorization', b'').split()
        if len(parts) == 0:
            # Empty AUTHORIZATION header sent
            return None

        if parts[0] not in AUTH_HEADER_TYPE_BYTES:
            # Assume the header does not contain a JSON web token
            return None

        if len(parts) != 2:
            raise None

        token = parts[1]
        # Get the token
        # Try to authenticate the user
        try:
            # This will automatically validate the token and raise an error if token is invalid
            UntypedToken(token)
        except (InvalidToken, TokenError) as e:
            # Token is invalid
            print(e)
            return None
        else:
            #  Then token is valid, decode it
            decoded_data = jwt_decode(token, settings.SECRET_KEY, algorithms=["HS256"])
            print(decoded_data)
            # Will return a dictionary like -
            # {
            #     "token_type": "access",
            #     "exp": 1568770772,
            #     "jti": "5c15e80d65b04c20ad34d77b6703251b",
            #     "user_id": 6
            # }

            # Get the user using ID
            scope["user"] = await get_user(validated_token=decoded_data)
        return await super().__call__(scope, receive, send)


def JwtAuthMiddlewareStack(inner):
    return JwtAuthMiddleware(AuthMiddlewareStack(inner))

现在就可以在channels里通过 self.scope[“user”] 获取到一个用户实例了。

总结

以上就是我的方法,多看看源代码,找找资料,其实也不是很难。

Django全栈开发:从模板到Vite+DRF的前端工程化实践 Web开发中,前后端分离与工程化是提升应用可维护性和开发体验的核心趋势。其原理在于通过模块化、组件化将界面逻辑与业务逻辑解耦,利用构建工具优化工作流。这一模式的技术价值在于实现了关注点分离,让开发者能采用各自技术栈的最佳实践,同时通过自动化构建、热更新等提升开发效率。在应用场景上,无论是需要快速迭代的管理后台,还是追求用户体验的复杂单页应用,都能找到合适的架构方案。本文聚焦于Django生态,探讨如何整合Vite等现代前端工具链与Django REST Framework,为后端开发者提供一套平滑过渡到高效 阅读详情

相关推荐

华为CNA VRM搭建(使用vmware worfstartion搭建)

华为CNA和VRM在 vmware workstation安装使用

weixin_70595351的博客 1813

django-channels自定义中间件验证token的方法

测试版本: python 3.8 djnago 3.2 channels 3.0 原始需求 在使用channels 建立websocket连接的时候,需要验证客户端的token,并保存一些关键信息 实现原理 使用自定义的中间件进行对token的验证,当然,前端需要把 token放在 headers里 实现步骤 1.创建一个中间件,用来验证token 项目目录下,新建一个 middleware 目录,内部创建一个 my_middleware.py 文件 # middleware/my_middlewa

小玉的小本本 2934

ADS1293心电图模块实战:从电极贴片到信号采集的全流程指南

本文提供了一份基于TI ADS1293芯片的心电图采集系统全流程实战指南。文章深入探讨了从电极贴片选择与皮肤预处理、ADS1293前端配置(包括PGA、RLD和威尔逊网络),到PCB布局、电源去耦以及固件滤波与运动伪影处理等关键环节,旨在帮助硬件工程师和嵌入式开发者构建稳定可靠的可穿戴心电监测设备。

weixin_29201313的博客 386

Django使用Channels实现WebSocket

WebSocket区别于HTTP协议的一个最为显著的特点是,WebSocket协议可以由服务端主动发起消息,对于浏览器需要及时接收数据变化的场景非常适合,例如在Django中遇到一些耗时较长的任务我们通常会使用Celery来异步执行,那么浏览器如果想要获取这个任务的执行状态,在HTTP协议中只能通过轮训的方式由浏览器不断的发送请求给服务器来获取最新状态,这样发送很多无用的请求不仅浪费资源,还不够优雅,如果使用WebSokcet来实现就很完美了。WebSocket允许服务端主动向客户端推送数据。

bigcarp的专栏 2505

python指纹识别算法(亲测代码可用)

python指纹识别算法

2301_76482796的博客 3079

触摸开关原理图_反激式开关电源PCB设计要点

由于最近工作中经常用到反激开关电源,就顺便做个有关反激电源PCB Layout方面的简单总结。关于变压器和补偿环路的设计原理和方法,可以参考之前的文章,链接如下:电子小白菜:反激电源变压器设计篇之详细设计步骤​zhuanlan.zhihu.com电子小白菜:反激电源变压器设计篇之基础原理​zhuanlan.zhihu.com电子小白菜:【干货分享】开关电源环路补偿设计步骤讲解​zhuanlan.z...

weixin_39574868的博客 1165

django-channels(websocket)

官文: https://channels.readthedocs.io/en/latest/tutorial/part_3.html 安装: pip install channel, channel-redis 配置 # settings.py中添加 INSTALLED_APPS = [ ..., 'channels', ] ASGI_APPLICATION = '项目名.asgi.application' 注:推荐使用版本大于django3.0(配置) asgi.py中添加

weixin_44634704的博客 5410

【第13话:感知算法】库位与可行驶区域检测:自主泊车场景中的检测及语义分割方法

本文提出了一种自动泊车系统中的泊车库位线检测方法,通过逆透视映射(IPM)将车辆摄像头图像转换为鸟瞰视图,消除透视变形。该方法结合目标检测和语义分割模型,先定位库位线候选区域,再生成像素级精确掩码。后处理步骤将掩码转换为结构化输出,包括停车位边界多边形和可行驶区域掩码。整个流程采用深度学习模型和计算机视觉技术,可实现高精度的泊车环境感知,为自动泊车系统提供可靠支持。

一碗白开水一 1161

【Django Channels】附录篇

【代码】【Django Channels】附录篇。

weixin_46114766的博客 553

一个服务如何被找到、被调用、被看见:注册中心、发布注册、发现调用与服务监控的治理闭环

服务数量一多,“对方在哪儿”就成了时刻变化的变量。本文沿发布、注册、发现、调用、监控的治理闭环展开:注册中心的数据模型、健康检查与AP/CP取舍,自我保护、推空保护与本地快照三道自保机制;服务发布的启动器、动态代理、发布管理器、协议服务器与登记顺序;消费端的服务目录、请求ID配对、六种集群容错与三种发现模式;日志、指标、链路三支柱与熔断舱壁。配套五个Java演示程序实测:默认参数下宕机实例平均240秒才被摘除,优雅下线可降至45秒,统计窗口长于租约会让自我保护失效,尾部采样可捕获全部慢请求。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 169万+

【WRFDA教程第一期】运行观测预处理程序(OBSPROC)

运行观测预处理程序(OBSPROC)

WW、forever的博客 1898

Django Rest Framework 和 JWT 身份验证

本文介绍了在Django项目中集成DRF和JWT身份验证的完整流程。首先安装并配置Django Rest Framework,使用APIView创建基于类的视图。然后集成JWT验证,包括安装simplejwt、配置token参数、添加获取/刷新token的路由,以及手动获取token的方法。特别说明了JWT在Django Channels中的实现方案,创建了处理WebSocket连接的JWT中间件。最后介绍了Nginx配置,添加了对跨域请求方法的支持。这些措施共同解决了跨域身份验证问题,为前后端分离应用提供

m0_59519985的博客 443

双Orin PCIe RC&EP模式互通

orin pcie 互通

乐于分享 3879

(一)集成django、swagger、docker desktop之创建项目

​初始模板的相关文件都在的一个项目模板里,可以拿来用。下面我们来详细看看是怎么构建的。

2301_81016982的博客 169

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

DRF面试核心:RESTful API设计与Django实战解析

RESTful API是现代Web开发的核心技术,基于HTTP协议实现资源操作标准化。其核心原理遵循无状态通信、统一接口和资源标识等约束条件,通过JSON数据格式实现前后端分离。在Python技术栈中,Django REST Framework(DRF)作为最成熟的REST框架,提供了序列化、认证授权、版本控制等完整解决方案。特别是在JWT认证、查询优化和API安全等工程实践场景中,DRF通过中间件链式处理机制和ViewSet抽象,显著提升了开发效率。对于准备面试的开发者而言,深入理解DRF的请求生命周期和

weixin_34211761的博客 380

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

DRF核心知识点与面试题解析:RESTful API开发实战

RESTful API是现代Web开发的核心技术,遵循资源导向、无状态通信等设计原则。Django REST framework(DRF)作为Python生态中最成熟的REST API开发框架,通过序列化器、视图类和认证系统等核心组件,实现了高效的后端服务开发。其模块化设计支持快速构建符合REST规范的接口,特别适合前后端分离架构下的用户认证(JWT)、权限控制和数据校验等场景。掌握DRF的认证流程、节流算法和性能优化技巧,能显著提升微服务架构下的API开发效率,是中级Python开发者向架构师进阶的关键技

weixin_33748818的博客 421

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Django多模态AI Bot实战:语音转写、智能摘要与图像生成一体化开发

多模态AI是指系统能同时处理文本、语音、图像等多种数据类型的技术范式,其核心在于跨模态理解与协同推理。在工程落地中,关键挑战在于模型调度、状态编排与低延迟响应,而非单一API调用。Django凭借成熟的ORM事务管理、Admin运维能力与可扩展架构,成为构建可审计、可维护多模态业务系统的优选框架。结合Whisper语音识别、GPT系列大模型与Stable Diffusion图像生成,开发者可快速搭建支持会议纪要自动整理、需求草图转UI、客服对话结构化等真实场景的AI Bot。本文聚焦本地化部署、异步任务拆解

weixin_30480075的博客 330

Token验证与用户名加密码验证的区别

1、什么是Token验证? Token是一种用户身份的验证方式,通常叫做令牌验证。当用户第一次登录成功后,服务器会生成一个Token并将此Token返回给用户,以后用户只需要带上这个Token前来请求数据即可,无需再用用户名和密码。 2、Token验证过程 ①首次登录时,客户端通过用户名与密码请求登录 ②服务端收到请求并验证用户名与密码 ③若验证通过,服务端会签发一个Token,该Tok...

ly_twt的博客 6380

基于django-channel构建websocket的web应用、支持token校验

0 前期准备 本文参考官方文档:https://channels.readthedocs.io/做了一定的修改,并加上个人的经验及理解 搭建一个django项目,假定项目名称为mysite,应用名称为chat 安装channels:pip install channels 1 配置asgi文件 asgi文件用于指向接收不同协议的请求要执行的代码。 # mysite/asgi.py import os from channels.auth import AuthMiddlewareStack from

李谦的博客 1496

Django使用DRF + Simple JWT 完成小程序使用自定义用户的注册、登录和认证

Django使用DRF + simpleJWT 完成小程序自定义用户的注册、登录和认证

li-xun的博客 3091

djangorestframework-simplejwt高级定制(有效荷载与响应数据结构)教程

djangorestframework-simplejwt高级定制教程 文章目录djangorestframework-simplejwt高级定制教程定制响应数据格式与内容1.编写自定义的序列化类2. 在视图中使用自定义的序列化类后台获取payload中的数据Web端解析Token获取数据1. js代码直接解析2. npm安装`jsonwebtoken`模块解析演示下载 本文为djangorestframework-simplejwt入门教程的高级篇,上一篇里面讲述了simplejwt的基本使用,包括安装

南来北往技术小栈 2813

djangorestframework-jwt使用,生成token,token认证

使用django的jwt模块: 安装:pip install djangorestframework-jwt 配置: 将djangorestframework-jwt注册到apps中 settings.py下配置 import datetime JWT_AUTH = { 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), ​ 'JWT_AUTH_HEADER_PREFIX': 'JWT', #前缀需要家jwt } ....

weixin_46371752的博客 2627

rest_framework_simplejwt自定义使用——登录功能

系统默认的JWT认证使用的默认用户进行验证了,有时候需要我们自定义设置用户表并验证。使用自定义创建的用户表模型

qq_42410176的博客 4445

用 Django 实现用户自定义模块,自定义认证,openid登陆换取jwt。

本人也是新学,也参考了很多网上文章,最终实现我的理想结构初步模型,但发现网上并没有类似文章,所以来和大家探讨一下,让新人少走一些弯路。 声明:本文首发于csdn,作者mist2015,目前并没有在其他平台发表,转载请注明。 平台:微信小程序,实现openid作为密码登陆,换取jwt token,并实现用户认证。 所用版本:python3.9+django3.14+rest_framework3.12.2+rest_framework_simplejwt4.6.0 实现: 1、django实现自定义

mist2015的专栏 917

接口使用jwt返回token_django rest framework 自定义login接口 使用jwt返回token令牌

介绍drf前后端分离后,login接口数据想返回其他用户字段给前端使用,就需要用到自己重新定义一个login接口,下面直接贴上代码fromrest_framework_jwt.serializersimportjwt_payload_handler,jwt_encode_handlerfromdjango.views.decorators.csrfimportcsrf_exempt...

weixin_28972529的博客 465

Django jwt 自定义用户表实现

jwt 自定义用户表

叱咤少帅的博客 1446
上一篇: centos7安装mysql8.0
下一篇: ChatGPT + Stable Diffusion + 百度AI + MoviePy 实现文字生成视频,小说转视频,自媒体神器!(一)
Python_anning
博客等级 码龄9年 1409粉丝 27原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值