Django channels介绍

Django Channels作为Django的扩展,允许异步操作和简单的任务队列管理,支持WebSocket,方便地与HTTP整合。尽管升级Django版本和代码调整带来一定风险,但其优势在于与现有技术选型的兼容性,适用于需要实时通信的场景。
摘要由CSDN通过智能技术生成

      

为什么注意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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值