【Django Channels】概述篇

1、问题引出

  • 在使用Django开发应用时,可能会碰到这样的需求,需要实现:服务向客户端推送数据,不难想出ajax轮询的解决方案,但这样的效率显然不高,于是我们可能会想到借助WebSocket协议来实现这一需求,那么问题来了,如果想要在Django项目中整合WebSocket协议,我们要摆平哪些事呢?
    1. 如何分别路由HTTP请求和WebSocket请求
    2. 如何兼容Django的认证系统
    3. 如何接收和推送WebSocket消息
    4. 如何通过ORM保存和获取数据
  • 面对这四个难题,我们最先想到的一定是自己写一个框架来解决这个问题,但显然难度、工作量都十分大,就没有现成的写好的框架吗?
    • 还真有,channels就是这样一个框架,它由Django官方推出,版本也与Django同步。

2、Django Channels是什么?

  • Django Channels是一个为Django提供异步扩展的库,通常主要用来提供WebSocket支持和后台任务
  • 背景:
    • Django是一个同步框架,如下图。要想实现异步效果,通常的做法是:使用celery,将费时的任务传给celery进而实现异步处理。但这样做有缺点:
      • Image.png{{{width=“auto” height=“auto”}}}
      • 执行成功后的结果是不能再通过django应用主动发送给前端的。
    • 针对这种缺点,django-channels闪亮登场

3、Django Channels原理解析:

  • 在Django部署的时候,通常使用的都是WSGl (Web Server Gateway Interface),即:通用服务网关接口,该协议仅用来处理Http请求。
  • 当网址需要加入WebSocket 功能时,WSGI将不再满足我们的需求,此时我们需要使用ASGl即异步服务网关接口,该协议能够用来处理多种通用协议类型,包括HTTP、HTTP2和WebSocket
  • 使用channels后,服务器的架构:
    • Image.png{{{width=“auto” height=“auto”}}}
    • 说明:
      • 对于客户端发来的请求,首先通过Protocol type Router(协议类型解析器),对不同类型的协议进行解析,将不同协议的请求传递给不同的Router,然后再传给之后的逻辑处理模块(Http是Django中的视图view,websocket是Consumer)【当然,这个逻辑处理模块也可以统称为Consumer】
    • 其中,Django-channels的原理:
      • Image.png{{{width=“auto” height=“auto”}}}
      • 说明:
        • 在 ASGI 中,将一个网络请求划分成三个处理层面,对应着django-channels三层结构:
          • lnterface Server:负责对协议进行解析,将不同协议分发到不同的Channel
          • Channel Layer:频道层,可以是一个或多个FIFO队列,通常使用Redis
          • Consumer:消费者,接收和处理消息
            • django中Http协议对应的消费者(可以看做是views.py)
            • django中Websocket协议对应的消费者
        • 注意:channels还能实现一个效果——将BackgroundProcesses(如:celery)产生的消息主动推送给前端【解决了单纯使用celery的痛点】

4、WSGI VS ASGI?

  • WSGI(Python Web Server Gateway Interface):为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口,是一个标准。
  • 常用的部署方法:Nginx/Apache + WSGl(uWSGl) + Django/Flask/Python
    • 说明:
      • WSGl是一套规范,一个标准
      • uWSGl是一个服务器应用,是可以在linux上安装的软件
      • 缺点:要部署的Django应用只适用于Http或Http2协议
    • ASGI(Asynchronous Server Gateway Interface):异步服务网关接口,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP ,HTTP2和WebSocket
      • 常用的部署方法:Nginx/Apache + ASGl(Daphne) + Django/Flask/Python
        • 说明:
          • ASGl是一套规范,一个标准
          • Daphne是一个服务器应用,是可以在linux上安装的软件
    • 总结,WSGI和ASGl的区别:
      • WSGI是基于HTTP协议模式的,不支持WebSocket等协议
      • 而ASGI就是为了支持Python常用的WSGI所不支持的新的协议标准(如:WebSocket、IoT协议、chat协议),即ASGI是WSGl的扩展。而且能通过asyncio异步运行

相关文章

  1. 【Django Channels】概述篇
  2. 【Django Channels】快速上手篇
  3. 【Django Channels】WebSocket协议实战篇
  4. 【Django Channels】附录篇
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值