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应用程序。
分类
- 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()
如何传递参数
比如位置参数
添加
获取
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路径路由http
或websocket
键入连接。接受一个参数,即Django URL对象列表(path()
或 re_path()
)