Django实现支持websocket协议

websocket的简单介绍可参考博主之前的博文websocket,本片通过测试示例代码介绍一下Django实现支持websocket协议

django默认wsgi不支持websocket协议,只支持http协议。而asgi(daphne)既支持http也支持websocket协议。所以想让django支持则需安装第三方组件,如下:

pip install channels -i https://mirrors.aliyun.com/pypi/simple/

daphne介绍参考链接:

  • https://pypi.org/project/daphne/
  • http://masnun.rocks/2016/11/02/deploying-django-channels-using-daphne/
  • https://www.osgeo.cn/django/howto/deployment/asgi/daphne.html

channels介绍参考链接:

  • https://channels.readthedocs.io/en/latest/introduction.html

django示例项目配置

本次示例代码目录结构如下图:

  1. settings.py文件配置
# 注册channels
INSTALLED_APPS = ['channels','django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','corsheaders','apps.test01','apps.chat'
]
# 添加asgi application的配置
ASGI_APPLICATION = "my_web01.routing.application" # 方式二, 本人采用此方式
# ASGI_APPLICATION = "my_web01.asgi.application" # 方式一,默认# 以下配置为channel_layer内容,请参考channels参考链接其中有实现群聊的代码
# 因为实现群聊所以用到channel_layer,如果实现简单的功能以下配置可以暂时不用
#信道层是一种通信系统。它允许多个消费者实例彼此交谈,以及与Django的其他部分交谈。
#通道层提供以下抽象:
#通道是一个可以将邮件发送到的邮箱。每个频道都有一个名称。任何拥有频道名称的人都可以向频道发送消息。
#一组是一组相关的通道。一个组有一个名称。任何具有组名称的人都可以按名称向组添加/删除频道,并向组中的所有频道发送消息。无法枚举特定组中的通道。
#每个使用者实例都有一个自动生成的唯一通道名,因此可以通过通道层进行通信。
CCHANNEL_LAYERS = {'default': {'BACKEND': 'channels_redis.core.RedisChannelLayer','CONFIG': {#"hosts": [('127.0.0.1', 6379)],# "hosts": ["redis://127.0.0.1/14"],# 此处的IP为redis是因为使用容器编排创建redis容器时指定 links:- redis# 即redis与IP创建了对应关系"hosts": ["redis://:123456@redis:6379/14"],# "hosts": [("redis",6379)],},# "CONFIG": {#     "hosts": ["redis://:password@IP:6379/0"],#     "symmetric_encryption_keys": [SECRET_KEY],# },},
}
  • 解释说明:

    ​ 特别是对于大型站点,可以配置像 nginx 这样的生产级 HTTP 服务器,
    以根据路径将请求路由到(1)用于普通 HTTP 请求的生产级 WSGI 服务器(如 Gunicorn+Django)
    或(2)生产- 级 ASGI 服务器,例如用于 WebSocket 请求的 Daphne+Channels。

    ​ 请注意,对于较小的站点,可以使用更简单的部署策略(asgi包含http与websocket服务)
    其中 Daphne 服务所有请求 - HTTP 和 WebSocket - 而不是拥有单独的 WSGI 服务器。

  1. asgi.py文件配置(与wsgi同级目录,没有则新建asgi文件)
# 方式二(目的只实现websocket的长连接,所有的http请求还是走wsgi)
import os
import django
from channels.routing import get_default_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_web01.settings')
django.setup()
application = get_default_application()
# 方式一(既包含http又包含websocket)
# import os
# from channels.auth import AuthMiddlewareStack
# from channels.routing import ProtocolTypeRouter, URLRouter
# from channels.security.websocket import AllowedHostsOriginValidator
# from django.core.asgi import get_asgi_application
# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_web01.settings")
# django_asgi_app = get_asgi_application()
#
# from apps.chat import routing
#
# application = ProtocolTypeRouter({#   "http": django_asgi_app,
#   "websocket": AllowedHostsOriginValidator(
#         AuthMiddlewareStack(
#             URLRouter(
#                 routing.websocket_urlpatterns
#             )
#         )
#     ),
# })

3.routing.py文件配置(与asgi文件同级目录下新建即在settings文件中的配置的文件位置)

from channels.routing import ProtocolTypeRouter
from apps.chat import routing
application = ProtocolTypeRouter({'websocket': routing.websocket_urlpatterns
})

4.apps/chat/routing.py文件

# routing文件效果等同于urls.py文件
from django.urls import re_path
from channels.routing import URLRouter
from . import consumers# 我们调用as_asgi()classmethod 是为了获得一个 ASGI 应用程序,
# 该应用程序将为每个用户连接实例化我们的消费者实例。这类似于 Django 的as_view(),
# 它对每个请求的 Django 视图实例扮演相同的角色。
# 本示例未使用as_asgi()因为django版本为低版本websocket_urlpatterns = URLRouter([# 所有websocket以ws/开始是约定俗成的re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer),
])

5.apps/chat/consumers.py文件

# 简单示例代码
# consumers文件效果等同于views.py文件
import json
from channels.generic.websocket import WebsocketConsumerclass ChatConsumer(WebsocketConsumer):def __init__(self, *args, **kwargs):super(ChatConsumer, self).__init__(*args, **kwargs)self.room_name = ''self.room_group_name = ''def connect(self):# 获取传参参数或者header内容则通过self.scopeprint('websocket连接的参数内容:', self.scope)self.room_name = self.scope['url_route']['kwargs']['room_name']self.room_group_name = 'chat_%s' % self.room_nameself.accept()def disconnect(self, close_code):self.close()  # 断开连接def receive(self, text_data=None, bytes_data=None):data = text_data or bytes_dataif data:data = json.loads(data)print('接收到的参数:', data)msg = data.get('msg')if msg == 'ok':self.send(json.dumps({'content': '收到了ok'}))else:self.send(json.dumps({'content': f'收到了{msg}'}))

以上就是简单的demo;python manage.py runserver之后出现如下图“ASGI/Channels”则表明集成了channels支持http和

websocket(长连接)协议了。

使用postman测试长连接请求

1.打开postman点击左上角"New",按照下图所选

2.postman测试连接,并发送消息如下图:

文档最后,当然关于websocket的技术知识点还有很多,本文只是快速简单了解其过程。相信通过简单的测试,对django支持长连接有所了解,如果深入的了解请访问文章开始博主分享的官网地址。

分享他人github 简单示例

https://github.com/py3study/django3_websocket

django websocket相关推荐

  1. python websocket实现消息推送_python Django websocket 实时消息推送

    [实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...

  2. 叁拾伍- Django Websocket 绝望之旅(dwebsocket 以及 channels)

    1.Websocket 在思考着如何在 Django 呈现 sklearn 学习的进度给用户看是,提了这样一个问题: Django 怎么返回进度? 然后本来也觉得轮询更新进度是最好的(因为同一个服务器 ...

  3. 使用 Django WebSocket Redis 搭建在线即时通讯工具

    话不多说先上效果图演示 项目:http://112.74.164.107:9990/ 1.安装组建 redis: yum install redis/apt install redis 2.创建虚拟化 ...

  4. Django websocket 长连接使用

    下载  pip install dwebsocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客 ...

  5. 如何配置nginx+uwsgi+django?(知乎上面的看着不错)

    作者:知乎用户 链接:https://www.zhihu.com/question/27295854/answer/36365005 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  6. python 技术大杂烩

    20230204 python升级报错 pip3 install -U pip Could not fetch URL https://pypi.tuna.tsinghua.edu.cn/simple ...

  7. Python在线聊天室

    基于Django&Websocket实现在线聊天室 痛点 痛点解决方案 轮询 长轮询 Websocket Django配置Websocket 前端连接Websockt 痛点 服务端(后端)需要 ...

  8. 可爱的python测试开发库(python测试开发工具库汇总)

    2019独角兽企业重金招聘Python工程师标准>>> 欢迎转载,转载请注明来源: github地址 谢谢点赞 本文地址 Python测试开发库 参考资料 https://githu ...

  9. python 各种开源库

    测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. 链接 sel ...

最新文章

  1. 10亿美元续命!OpenAI获微软投资,意在通用人工智能?
  2. publishing failed with multiple errors resource is out of sync with the file system--转
  3. rabbitmq可靠性投递_解决RabbitMQ消息丢失问题和保证消息可靠性(一)
  4. 具有只读属性的ComboBox
  5. PHP 发送HTTP post请求发送和获取
  6. java安卓6.0闪退_Android开发activity跳转闪退
  7. 通达信服务器地址文件夹,通达信常用文件放置位置说明一览
  8. 九大背包问题专题--二维费用的背包问题
  9. elasticsearch监控平台cerebro-0.8.3 相关操作
  10. logisim基础(非常基础)----寄存器元件的使用
  11. then是java关键字吗_then是java关键字吗
  12. TinyPNG压缩图片的网站
  13. 迅雷精简版 4.0.0 Mac中文版
  14. 京东java面试流程_java京东社招面试经历
  15. 极路由3(HC5861)刷Padavan固件教程
  16. 数据库系统-实体-联系模型
  17. 鸢尾花lris数据集的SVM线性分类
  18. ClickHouse函数操作大全
  19. NR PRACH(三)时域位置
  20. DM数据库常用系统视图及数据字典查询部分汇总

热门文章

  1. 炫酷纯音乐小程序的设计与实现
  2. 华为手机显示android升级,华为手机总是提示“系统升级”,到底要不要升级?答案终于确认了...
  3. php 唯一随机数,生成范围内的唯一随机数 - PHP
  4. 企业微信自建应用开发防止踩坑
  5. Unity 启动时带参数,网页后端进行数据交互 UnityWebRequest ,Post,Get,Delete
  6. 人工智能到底有多火,年薪 25 万只是白菜价……
  7. 【数据结构入门实验C语言版】城市链表
  8. 在OpenWrt上安装DNSCrypt
  9. LWN:2022 基于映像文件Linux峰会!
  10. Python学习之绘制彩虹图