`

Django channels介绍

阅读更多

      

为什么注意channels

目前om系统采用django(version=1.5),大部分是通过同步方式对rpc、db等进行操作。 
channels具有以下优缺点:

优点

  • channels是django的插件,能很好的兼容目前om的技术选型
  • 具备异步执行、简单的任务队列管理(生产-消费模式)、websocket,满足目前om的需求
  • 将websocket和http进行高度整合,可进行分组,使用非常简便

缺点

  • 需要升级om的django版本 v1.5 -> v1.10

    • 风险点: 中版本跨越幅度大,settings.py配置文件已修改
  • 已有api若需使用channels需要修改api层的代码和前端代码

    • 只是在api层由view调用改为分发到channels内调用
  • 需新加软件(channels和所需其他包, redis)

  • 代码可读性变差,可忽略 
    ...


 

使用示例

 
  1. django目录内新建所需文件:
  2. django_dir
  3. |-- routing.py ==>相当于channelsurls.py
  4. |-- consumers.py ==>相当于channelsviews.py
  5. |-- asgi.py ==>相当于channelswsgi.py
  6. routing.py :定义通道之间的映射
  7. consumers.py :任务到来后的消费函数
 
  1. 新增settings.py的配置
  2. settings.py:
  3. INSTALLED_APPS =[
  4. ...,
  5. 'channels',
  6. ]
  7. CHANNEL_LAYERS ={
  8. "default":{
  9. "BACKEND":"asgi_redis.RedisChannelLayer",==>指定消息中间件,这里选择redis
  10. "CONFIG":{
  11. "hosts":[os.environ.get('REDIS_URL','redis://localhost:6379')],
  12. },
  13. "ROUTING":"xxx.routing.channel_routing",==>指定routing.pychannels列表
  14. },
  15. }
 
  1. routing.py:
  2. # -*- coding:utf-8 -*-
  3. from channels.routing import route
  4. from chan import consumer #导入处理函数
  5. channel_routing =[
  6. route("work-run", consumer.worker_calling),#任务通道
  7. route("websocket.connect", consumer.ws_connect),
  8. route("websocket.receive", consumer.ws_message),
  9. route("websocket.disconnect", consumer.ws_disconnect),
  10. ]
 
  1. consumer.py
  2. # -*- coding:utf-8 -*-
  3. import time
  4. from django.http importHttpResponse
  5. from channels.handler importAsgiHandler
  6. from channels.sessions import channel_session
  7. from channels importGroup
  8. @channel_session
  9. def ws_connect(message):
  10. message.channel_session['room']='default'
  11. Group('default').add(message.reply_channel)
  12. message.reply_channel.send({
  13. "text":"This is a message from server"
  14. })
  15. def worker_calling(message):
  16. arg = message.content.get('arg')#获取传递参数
  17. #这里进行rpc调用、db读写
  18. Group('default').send({'data':data})#调用websocket返回结果
 
  1. view.py
  2. def worker(request):
  3. arg = request.DATA.get('arg')
  4. Channel('work-run').send({'arg':arg})#将任务分发给channels的work-run,这里异步执行
  5. returnHttpResponse('worker running!')#任务分发后直接返回响应
 

过程

 
  1. 1web端打开的时候建立并维护websocket连接
  2. 2web端通过标准的http发起一个任务给后端
  3. 3、后端收到任务后将耗时任务分发给channels并立刻返回
  4. 4channels执行任务,执行完成后通过websocket通知web
分享到:
评论

相关推荐

    PyPI 官网下载 | django-channels-handlers-0.2.0.tar.gz

    标题"PyPI 官网下载 | django-channels-handlers-0.2.0.tar.gz"指的是这个资源是从Python的官方软件包仓库PyPI(Python Package Index)下载的,文件名为"django-channels-handlers-0.2.0.tar.gz"。这表明它是一个...

    django+channels 2.0实现websocket

    标题"django+channels 2.0实现websocket"表明我们要讨论的是如何在Django 2.0及以上版本中利用Channels库来构建WebSocket应用。WebSocket是一种在客户端和服务器之间建立长时间连接的协议,它允许双向通信,即服务器...

    Django Channels2.0的理解

    这个PDF文件是关于Django Channels 2.0的介绍和理解。以下是文件内容的概述: 1. **Channels概述**: - Channels是一个增强Django项目的框架,它允许同步的Django项目转变为异步项目。 - 支持HTTP请求以外的协议...

    Python django4.0实现简易聊天室(channels、channels-redis)

    channels-redis有redis环境依赖,需要提前安装redis环境且版本>=5.0(可百度安装教程) python环境3.8、以及虚拟环境安装自行安装(建议安装虚拟环境) 有虚拟环境进入虚拟环境执行如下命令: pip install -r ...

    django channels实战(websocket底层原理和案例)

    在本文中,我们将深入探讨Django Channels的实战应用,以及WebSocket的底层原理和实际案例。Django Channels是Django框架的一个扩展,它允许我们处理非HTTP协议的通信,如WebSocket,从而实现了实时双向通信。理解...

    基于python+Django,webchat在线聊天系统.zip

    4. Django Channels介绍 Django Channels扩展了Django,使其能够处理异步请求和WebSocket通信。在WebChat项目中,Channels扮演着关键角色,它允许Django应用接收和发送WebSocket消息,实现聊天功能。 5. 数据库设计...

    实时聊天应用实战代码-使用Django Channels和WebSocket

    本资源提供了一套完整的实时聊天应用实战代码,基于Django Channels和WebSocket技术构建。这是一份实用的开发资源,适合希望快速理解和应用WebSocket到实际项目中,特别是使用Django框架的开发者。 内容亮点: 提供...

    django-channels-webrtc-源码.rar

    《Django Channels与WebRTC深度解析》 Django Channels与WebRTC...本篇文章主要介绍了Django Channels与WebRTC的基本概念、工作原理以及它们的结合方式。希望对读者理解这两项技术及其在现代Web开发中的应用有所帮助。

    Python+django+channels实现websocket

    本教程将聚焦于如何利用Python的Django框架和Channels库来实现WebSocket功能,构建一个即时聊天系统。 首先,我们需要理解Django。Django是Python的一个高级Web框架,它鼓励快速开发并采用干净、实用的设计理念。...

    Django Channels 的 Redis 通道层后端.zip

    Redis channel layer backend for Django Channels channels_redis provides a Django Channels channel layer that uses Redis as the backend storage. There are two implementations available. ...

    Django Channels 实现点对点实时聊天和消息推送功能

    如果你使用的是Django 1.9或更高版本,可以通过`pip install channels`来安装Channels。另外,为了支持WebSocket和更多的功能,我们需要`channels_redis`作为通道后端。因此,还需要执行`pip install channels_redis...

    channels_rabbitmq:使用RabbitMQ作为后备存储的Django Channels通道层

    使用RabbitMQ作为后备存储的Django Channels通道层。 不支持辅助。 (请参阅基本并使用await get_channel_layer().current_connection发送到作业队列。) 适用于Python 3.8或3.9。 安装 pip install channels_...

    浅谈django channels 路由误导

    ### 浅谈Django Channels 路由误导 在探讨Django Channels路由误导的问题之前,我们首先需要了解Django Channels的基本概念以及它与传统Django HTTP请求处理的区别。Django Channels是一个扩展包,允许Django应用...

    基于 python + django + channels + celery 实现的运维 devops 管理系统.zip

    Python使用技巧,实战应用...详细介绍了一些Python框架的各种功能和模块,以及如何使用Python进行GUI开发、网络编程和跨平台应用开发等。 适用于初学者和有经验的开发者,能够帮助你快速上手JPython并掌握其高级特性。

    详解Django-channels 实现WebSocket实例

    Django-channels是Django的扩展,它为Django带来了实时通信能力。Django本身是一个强大的Web框架,通常用于处理HTTP请求,但当涉及到需要实时双向通信的场景,比如实时聊天、多人游戏或实时数据流时,WebSocket就是...

    Python-djangobot通过Channels桥接Slack和Django

    本文将详细介绍如何使用`djangobot`项目,通过Channels来桥接Slack和Django,以创建一个能接收并响应Slack消息的Django应用。 首先,了解Django Channels。Channels是Django的一个扩展,它允许我们处理异步请求,如...

    django_channels_websocket_example

    【django_channels_websocket_example】是基于Python的Django框架实现的一个WebSocket示例项目。WebSocket是一种在客户端和服务器之间建立持久连接的技术,允许双向通信,即服务器可以主动向客户端推送数据,而不...

    Practical Django 2 and Channels 2

    What You'll Learn Build and deploy a simple company site with Django Develop more complex, data-heavy sites using the Django ORM Integrate Django with Channels Unit-test your solutions Who This Book ...

    atenas-bank:Web应用程序在Atenas银行中引起了用户的注意。 使用Django,Django Rest Framework,Django Channels和Vue.js进行开发

    :bank: :admission_tickets: 阿特纳斯银行Web应用程序在Atenas... 使用Django,Django Rest Framework,Django Channels和Vue.js进行开发。跑步docker run -p 6379:6379 -d redis:2.8 # To use Channels参考。 。 。

Global site tag (gtag.js) - Google Analytics