Javascript is required
Django Channels

Django Channels 3.x

官方文档

https://channels.readthedocs.io/en/stable/


Channels是一个采用Django并将其功能扩展到HTTP之外的项目,用于处理WebSocket、聊天协议、物联网协议等。它是基于一个名为ASGI的Python规范构建的。

Channels建立在Django自v3.0以来提供的本机ASGI支持之上,并为Django v2.2本身提供了一个实现。Django仍然可以处理传统的HTTP,而通道可以让您选择以同步或异步方式处理其他连接。

频道由几个包组成:

  • channels
  • daphne
  • asgifef
  • channels_redis

安装

pip install channels

Consumers

虽然Channels是围绕一个称为ASGI的基本底层规范构建的,但它更多地是为互操作性而设计的,而不是为在中编写复杂的应用程序而设计的。因此,Channels为您提供了消费者,一个丰富的抽象,允许您轻松地创建ASGI应用程序。

分类

image-20210226011041702

  • WebsocketConsumer
  • AsyncWebsocketConsumer
  • JsonWebsocketConsumer
  • AsyncJsonWebsocketConsumer
  • AsyncHttpConsumer channels.generic.http.AsyncHttpConsumer

Generic Consumers - 通用

WebsocketConsumer (常用)

方法
- __init__
- websocket_connect
- connect
- accept
- websocket_receive
- receive
- send
- close
- websocket_disconnect
- disconnect
from channels.generic.websocket import WebsocketConsumer

class MyConsumer(WebsocketConsumer):
        def connect(self):
        # 连接时调用 
        print('连接...Socket')
        self.accept()
        
      def receive(self, text_data=None, bytes_data=None):
        print(text_data)
        text_data_json = json.loads(text_data)
        message = 'Server: '+ text_data_json['message']
        self.send(text_data = json.dumps({
            'message': message
        }))
        
      def disconnect(self, code):
        print("失去连接...Socket")
        self.close()

如何传递参数

比如位置参数

添加

image-20210226011437765

获取

image-20210226011500257

AsyncWebsocketConsumer

channels.generic.websocket.AsyncWebsocketConsumer

与WebsocketConsumer相同。但是方法是异步的。

路由

routing.py

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter, ChannelNameRouter

from apps.live import  routing #.自己的routing

application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter([
        # url(r"^chat/admin/$", AdminChatConsumer.as_asgi()),
        # url(r"^chat/$", PublicChatConsumer.as_asgi()),
      ])
    )
})

ProtocolTypeRouter channels.routing.ProtocolTypeRouter.

这应该是ASGI应用程序堆栈的顶层,也是路由文件中的主要条目。

它使您可以根据中type存在的值将其分派到许多其他ASGI应用程序 之一scope。协议将定义其作用域包含的固定类型值,因此您可以使用它来区分传入的连接类型。

URLRouter channels.routing.URLRouter.

通过其HTTP路径路由httpwebsocket键入连接。接受一个参数,即Django URL对象列表(path()re_path()