1、问题引出
- 在使用Django开发应用时,可能会碰到这样的需求,需要实现:服务向客户端推送数据,不难想出ajax轮询的解决方案,但这样的效率显然不高,于是我们可能会想到借助WebSocket协议来实现这一需求,那么问题来了,如果想要在Django项目中整合WebSocket协议,我们要摆平哪些事呢?
- 如何分别路由HTTP请求和WebSocket请求
- 如何兼容Django的认证系统
- 如何接收和推送WebSocket消息
- 如何通过ORM保存和获取数据
- 面对这四个难题,我们最先想到的一定是自己写一个框架来解决这个问题,但显然难度、工作量都十分大,就没有现成的写好的框架吗?
- 还真有,channels就是这样一个框架,它由Django官方推出,版本也与Django同步。
2、Django Channels是什么?
- Django Channels是一个为Django提供异步扩展的库,通常主要用来提供WebSocket支持和后台任务
- 背景:
- Django是一个同步框架,如下图。要想实现异步效果,通常的做法是:使用celery,将费时的任务传给celery进而实现异步处理。但这样做有缺点:
- {{{width=“auto” height=“auto”}}}
- 执行成功后的结果是不能再通过django应用主动发送给前端的。
- 针对这种缺点,django-channels闪亮登场
- Django是一个同步框架,如下图。要想实现异步效果,通常的做法是:使用celery,将费时的任务传给celery进而实现异步处理。但这样做有缺点:
3、Django Channels原理解析:
- 在Django部署的时候,通常使用的都是WSGl (Web Server Gateway Interface),即:通用服务网关接口,该协议仅用来处理Http请求。
- 当网址需要加入WebSocket 功能时,WSGI将不再满足我们的需求,此时我们需要使用ASGl即异步服务网关接口,该协议能够用来处理多种通用协议类型,包括HTTP、HTTP2和WebSocket
- 使用channels后,服务器的架构:
- {{{width=“auto” height=“auto”}}}
- 说明:
- 对于客户端发来的请求,首先通过Protocol type Router(协议类型解析器),对不同类型的协议进行解析,将不同协议的请求传递给不同的Router,然后再传给之后的逻辑处理模块(Http是Django中的视图view,websocket是Consumer)【当然,这个逻辑处理模块也可以统称为Consumer】
- 其中,Django-channels的原理:
- {{{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的痛点】
- 在 ASGI 中,将一个网络请求划分成三个处理层面,对应着django-channels三层结构:
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上安装的软件
- 说明:
- 常用的部署方法:Nginx/Apache + ASGl(Daphne) + Django/Flask/Python
- 总结,WSGI和ASGl的区别:
- WSGI是基于HTTP协议模式的,不支持WebSocket等协议
- 而ASGI就是为了支持Python常用的WSGI所不支持的新的协议标准(如:WebSocket、IoT协议、chat协议),即ASGI是WSGl的扩展。而且能通过asyncio异步运行
- 说明: