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

Django + websocket 连不上

看了网上的几个简单例子,一步一步做,但无一成功。都连不上websocket。

后来按一个视频教程的操作步骤来做,成功了。差别在于视频教程中加了

 pip install daphne  

和setting.py中

连不上的表现:

前端报错:

WebSocket connection to 'ws://127.0.0.1:8000/ws/some_path/' failed: 
WebSocket is closed now.

后端报错:

Not Found: /ws/some_path/
"GET /ws/some_path/ HTTP/1.1" 404 2445

 --------------------------------

原因:简单教程中默认你在开发环境中使用python manage.py runserver。理论上来说。如果你的Django项目仅使用InMemoryChannelLayer(不用Redis),且在本地开发环境中只用Django自带的runserver命令进行测试,那么通常情况下不需要额外安装Daphne或uvicorn。

InMemoryChannelLayer:

  • 这是一种内存中的通道层,主要用于开发和测试。
  • 它简单、易用,不需要外部的ASGI服务器来支持。
  • Django的runserver命令已经内置了对InMemoryChannelLayer的支持。

那为什么我在本地上runserver却还要安装Daphne呢?先不追究,暂时先按照这个方法操作。

这个问题在开发环境没有遇到,估计部署到服务器上也是会遇到的。

-------------------------

ASGI 服务器能够处理 WebSocket 等协议,而 Django 自带的 WSGI 服务器(runserver)只能处理 HTTP 协议。

------------------------

pip install channels 跟 pip install channels[daphne] 的区别:后者除了安装 channels 之外,还会额外安装 Daphne作为 ASGI 服务器如果你计划将项目部署到生产环境中,使用 pip install channels[daphne] 会更加方便,因为它直接提供了一个可用于生产的 ASGI 服务器。

注意:pip install channels daphne 并不等效于 pip install "channels[daphne]" ,前者是将channelsdaphne 是作为两个独立的包进行安装的,没有考虑 channels 在与 daphne 一起使用时可能需要的额外关联配置项、依赖项。后者同时考虑并安装可能需要的额外依赖项,确保 channelsdaphne 的集成工作良好。

在大多数情况下,如果你计划使用 channels 并且希望它与 daphne 良好地协作,建议使用 pip install "channels[daphne]"

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深度学习(一)-感知机+神经网络+激活函数
  • 解锁京东商品详情宝库:开发者必备API利器与实战应用指南
  • C#自定义控件的放置与拖动
  • 使用Unity的准备
  • CSP-S 2022 提高级 第一轮 阅读程序(3)
  • webCppCluster
  • Matlab实现MPC算法
  • Elasticsearch:使用 inference API 进行语义搜索
  • 智能对决:提示词攻防中的AI安全博弈
  • [数据集][目标检测]玉米病害检测数据集VOC+YOLO格式6000张4类别
  • 搭建线上虚拟展厅,需要哪些技术?
  • 如何使用useMemo来优化React组件的性能?
  • SpringBoot整合第三方技术
  • PowerBi 柱形图,数据标签无法显示在端外
  • 基于STM32设计的防盗书包(华为云IOT)(216)
  • [译] React v16.8: 含有Hooks的版本
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 07.Android之多媒体问题
  • 10个确保微服务与容器安全的最佳实践
  • GraphQL学习过程应该是这样的
  • java2019面试题北京
  • js学习笔记
  • Linux后台研发超实用命令总结
  • MQ框架的比较
  • python_bomb----数据类型总结
  • Spark RDD学习: aggregate函数
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • TypeScript迭代器
  • vue.js框架原理浅析
  • 前端代码风格自动化系列(二)之Commitlint
  • 使用common-codec进行md5加密
  • 找一份好的前端工作,起点很重要
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #AngularJS#$sce.trustAsResourceUrl
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (145)光线追踪距离场柔和阴影
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (k8s)Kubernetes本地存储接入
  • (附源码)springboot教学评价 毕业设计 641310
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转)fock函数详解
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)Linux网络编程入门
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 通过系统影子账户实现权限维持
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET企业级应用架构设计系列之技术选型
  • 。。。。。
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • []Telit UC864E 拨号上网
  • [Android] Binder 里的 Service 和 Interface 分别是什么