如何在 Django框架下完成 websocket 连接

news2024/11/27 8:25:52

文章目录

  • websocket 和 socket 连接的区别
  • 与 Django 建立 websocket 连接
    • ASGI v.s. WSGI
      • Django > 3.0
      • Channels
      • Daphne
      • settings.py
      • consumers.py & routing.py
  • 测试 websocket 连接
    • postman

websocket 和 socket 连接的区别

  • Websocket 和 Socket 是两种不同的通信协议,都是用于建立网络连接的方式,但它们各有特点和适用场景。以下是它们之间的主要区别。

  • Websocket

    1. 双向通信: Websocket 协议可以实现客户端与服务器的双向通信,在任何时候,只要对方在线,客户端和服务器都可以主动发起通讯。

    2. 基于 HTTP 握手: 创建 Websocket 连接需要通过 HTTP 协议进行一次握手。一旦这个握手完成,后续数据传输就直接在 Websocket 连接上进行,不再依赖 HTTP 。

    3. 更少的数据传输开销: 在建立好连结后,数据帧头部介于2-14 bytes之间,相较于HTTP每次请求响应的头部至少为500-800 bytes来说,传输成本大大降低。

    4. 全双工模式: 在建立的连接上,客户端和服务器可以同时发送或接收数据。

    5. 实时通信: 由于其双向性,Websocket 更适合需要高频率、低延迟的实时交互场景,例如在线聊天、股票交易等。

  • Socket

    1. 底层协议: Socket 是更底层的通信协议,它基于 TCP/IP 或 UDP ,能够实现全双工通信。

    2. 高度灵活: Socket 提供了一种控制网络通信的方法,用户可以根据需要自定义协议来满足特定的通信需求。

    3. 多种连接类型: Socket 支持多种连接类型,包括 TCP、UDP、RAW SOCKET 等。

    4. 易于理解和使用: 相比于 Websocket,Socket 的原理和使用更为简单,是学习网络编程的基础。

    5. 广泛应用: Socket 被广泛用于各种网络服务中,如 FTP、POP3、TELNET 等。

总的来说,Websocket 和 Socket 都有各自的优点和缺点,选择哪种协议取决于具体的应用需求。

与 Django 建立 websocket 连接

ASGI v.s. WSGI

  • ASGI (Asynchronous Server Gateway Interface) 和 WSGI (Web Server Gateway Interface) 都是 Python 的 web 服务器规范。以下是它们的主要区别。

  • WSGI

    1. 同步处理: WSGI 是一个同步接口,它假设应用程序将一次处理一个请求,并且在处理下一个请求之前完成当前请求。

    2. 成熟稳定: WSGI 是 Python 中最常用的 web 服务器规范,支持大量库和中间件,如 Flask 和 Django 等。

    3. 对 HTTP/1.0 有良好的支持: 使用 WSGI,可以轻松地进行基于 HTTP/1.0 的通信。

    4. 对长连接和 WebSocket 支持不佳: 由于是同步的,WSGI 不适合处理长时间运行的连接或需要并发处理多个请求的场景(如 WebSockets 或长轮询)。

  • ASGI

    1. 异步处理: ASGI 是一个异步接口,能够处理 并发请求,提高了应用程序的性能。

    2. 更广泛的协议支持: ASGI 不仅支持 HTTP,还可以处理其他协议,包括 WebSocket 和 HTTP/2 等。

    3. 对长连接和 WebSocket 有良好的支持: ASGI 支持异步 IO,因此非常适合处理长连接、WebSocket 连接,以及其他需要并发处理的场景。

    4. 为新的框架提供基础: ASGI 在一些新的 Python web 框架中得到了应用,例如 Starlette 和 FastAPI 等。

  • 因此在当前场景中我们要构建基于 Websocket 的连接,自然就要使用基于 ASGI 的配置方式

  • 在 Django 中,默认是使用 WSGI 的应用,因此为了配置 ASGI 应用,我们需要进行以下文件的改变

Django > 3.0

  • 升级 Django 版本: 从 Django 3.0 开始,Django 开始支持 ASGI。请确保你的 Django 版本至少是 3.0。

Channels

  • 安装 Channels: Django 需要使用 Channels 库以支持 ASGI。你可以通过 pip 安装 Channels。
    pip install channels
    

Daphne

  • Daphne 是一个由 Django Channels 项目开发的 HTTP、HTTP2 和 WebSocket 协议的 ASGI (Asynchronous Server Gateway Interface) 服务器。它的主要作用是 将请求从客户端转发到 Django Channels 或其他 ASGI 应用,并将响应返回到客户端

  • 以下是 Daphne 的一些关键特性:

    • 支持多种协议: Daphne 支持 HTTP/1.1、HTTP/2 和 WebSocket 这三种协议,对于需要实时通信的 web 应用来说这是非常重要的。

    • 并发处理: 使用基于事件的服务器模型,Daphne 可以同时处理大量的连接和请求,而不会阻塞服务。

    • 兼容 Django Channels: Daphne 与 Django Channels 完全兼容,可以直接运行 Django Channels 应用。

    • 扩展性: 你可以通过在 Django Channels 中添加自定义的通道层,使 Daphne 能够支持更复杂的使用场景,如广播消息或跨进程通信等。

  • 总的来说,如果你正在构建一个 Django Channels 应用,或者你的 Python 应用需要使用 ASGI,那么 Daphne 就能派上用场。

    pip install daphne
    
  • daphne 也需要配置到 settings.pyINSTALLED_APPS 中:
    在这里插入图片描述

settings.py

  • 添加 Channels 到 INSTALLED_APPS: 在你的 settings.py 文件中,将 channels 添加到 INSTALLED_APPS 列表中:
    INSTALLED_APPS = [
        # ...
        'channels',
    ]
    
  • 设置 ASGI_APPLICATION: 在 settings.py 文件中设置 ASGI_APPLICATION 路径(原本 settings.py 中没有这个,需要自己手动添加一项)。
    ASGI_APPLICATION = 'YOUR_PROJECT_NAME.routing.application'
    

在这里插入图片描述

consumers.py & routing.py

  • 在你的项目根目录下(与 settings.py 同一个目录),创建一个 routing.py 文件,并定义你的 websocket 访问的功能的相关路由,这里要使用 ProtocolTypeRouterURLRouter 来构建。
    在这里插入图片描述

  • 接下来如同我们在 views.py 中定义视图函数来处理 socket 连接的请求,我们在 consumers.py(新创建一个)中处理 websocket 连接的相关逻辑,这个代码根据自己想实现的内容去写对应的功能即可:
    在这里插入图片描述

测试 websocket 连接

postman

  • 首先在 ① 的位置选择 websocket 连接方式
  • 在 ② 中输入自己 Django 中定义的路由
  • send 看是否能够连接成功
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python采集二手车数据信息,看看什么车最适合你

目录标题 前言环境使用:模块使用:代码展示尾语 💝 前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 环境使用: Python 3.8 Pycharm 模块使用: 第三方模块 需要安装的 requests >>> pip install requests parsel >>> pip install parsel c…

CTP WEB 100练(1/100)

考点:PHP代码审计 抓包发现source.php,访问下,出现了php代码 代码主体在这部分,满足三个条件:file不为空&file是字符串&checkFile通过 if (! empty($_REQUEST[file])&& is_string($_REQUEST[file])&am…

面试题:var、let、const的区别

var、let、const的区别 一、提出二、作用域不同2.1 作用域 三、变量提升四、重复声明五、可修改性六、初始值设置七、暂时性死区八、给全局添加属性总结若有错误,欢迎随时指正 一、提出 var是ES5提出的,let和const是ES6提出的。 二、作用域不同 2.1 作用…

大数据环境下保护个人隐私

近日,某高校毕业生在校期间窃取学校内网数据,收集全校学生个人隐私信息的新闻引发了人们对互联网生活中个人信息安全问题的再度关注。在大数据时代,算法分发带来了隐私侵犯,在享受消费生活等便捷权利的同时,似乎又有不…

webrtc源码阅读之h264 RTP打包

本文来分析webrtc打包h264 rtp包的代码,版本m98 一、RTP协议 1.1 RTP协议概述 实时传输协议(RTP)是一个网络协议,它允许在网络上进行实时的音频和视频数据传输。RTP协议主要用于解决多媒体数据的实时传输问题,特别是…

关于Java已死,看看国外开发者怎么说的

博主在浏览 medium 社区时,发现了一篇点赞量 1.5k 的文章,名称叫《Java is Dead — 5 Misconceptions of developers that still think Java is relevant today!》直译过来就是《Java 已死 — 开发人员对 Java 在现代编程语言中的5个误解》。这篇文章可以…

什么是倒排索引

什么是倒排索引 搜索的核心需求是全文检索,全文检索简单来说就是要在大量文档中找到包含某个单词出现的位置,在传统关系型数据库中,数据检索只能通过 like 来实现,例如需要在酒店数据中查询名称包含公寓的酒店,需要通…

k8s如何对外公布一个应用程序

一:Kubernetes Service(服务)概述 事实上,Pod(容器组)有自己的 生命周期 (opens new window)。当 worker node(节点)故障时,节点上运行的 Pod(容器组&#x…

全网最细,Fiddler抓包实战教程-辅助接口测试(二)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Fiddler的功能面板…

超低色散非球面ED镜片——减少空三分层的“秘密武器”

引言 倾斜相机作为精密光学电子仪器,光学部件相当于它的眼睛,直接关系到原始航片采集质量的高低,其重要性不言而喻。优质的原始航片能够降低空三分层概率,增加空三解算的鲁棒性,从而提高内业效率,节约项目…

Vue3中使用vee-validate进行表单验证

官网&#xff1a;Checkbox and Radio InputsValidating checkboxes and Radio inputshttps://vee-validate.logaretm.com/v4/examples/checkboxes-and-radio/ 安装vee-validate npm i -S vee-validate 示例1&#xff1a; <template><Formref"ref_form"c…

旅游卡景区小程序购票核销分销app系统

旅游业的蓬勃发展&#xff0c;景区旅游卡也逐渐成为游客出行的常见选择。为了提升景区旅游卡的购买和使用体验&#xff0c;许多景区开始采用小程序来提供购票和核销服务。同时&#xff0c;为了更好地推广景区旅游卡&#xff0c;许多景区也开发了分销App系统&#xff0c;以提供更…

linux代码提交记录 linus亲手改代码

kernel/git/torvalds/linux.git - Linux kernel source tree

【Megatron-DeepSpeed】张量并行工具代码mpu详解(一):并行环境初始化

相关博客 【Megatron-DeepSpeed】张量并行工具代码mpu详解(一)&#xff1a;并行环境初始化 【深度学习】【分布式训练】DeepSpeed&#xff1a;AllReduce与ZeRO-DP 【深度学习】混合精度训练与显存分析 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处…

DOM“文档对象模型”

目录 DOM 1.节点层级 1.2.节点 常用节点 文档节点&#xff08;document&#xff09; 元素节点&#xff08;Element&#xff09; 属性节点&#xff08;Attribute) 文本节点&#xff08;Text&#xff09; 其他节点 DocumentType Comment DocumentFragment 1.3.节点树…

力扣 501. 二叉搜索树中的众数

题目来源&#xff1a;https://leetcode.cn/problems/find-mode-in-binary-search-tree/description/ C题解1&#xff1a;使用中序遍历将二叉搜索树有小到大放进数组中&#xff0c;在寻找最大数组。 class Solution { public:void traversal(TreeNode* node, vector<int>…

操作系统7:进程死锁

目录 1、死锁概述 &#xff08;1&#xff09;计算机中的资源分类 1.1 - 可重用性资源和消耗性资源 1.2 - 可抢占性资源和不可抢占性资源 &#xff08;2&#xff09;计算机系统中的死锁 &#xff08;3&#xff09;死锁的定义、必要条件和处理方法 3.1 - 死锁的定义 3.2 …

运输层:TCP拥塞控制

1.运输层&#xff1a;TCP拥塞控制 笔记来源&#xff1a; 湖科大教书匠&#xff1a;TCP的拥塞控制 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 网络资源&#xff1a;在计算机网络中的链路容量&#xff08;即带宽&#xff09;、交换结点中的缓存和…

windows 10 安装Python 3.10版

一、查找官网 1.python官网需要VPN(建立一个临时的、安全的连接&#xff0c;是一条穿过混乱的公用网络的安全、稳定的隧道。)&#xff0c;打开VPN进行代理之后&#xff0c;打开网址&#xff1a;https://www.python.org/ 二、查找所需下载的系统及版本 1.本机是winodws操作系统&…