Channels 2

作者: 不爱去冒险的少年y | 来源:发表于2018-11-08 10:46 被阅读3次
1.数据库连接:database_sync_to_async

要使用它,请在单独的函数或方法中编写ORM查询,然后database_sync_to_async像这样调用它:

from channels.db import database_sync_to_async

async def connect(self):
    self.username = await database_sync_to_async(self.get_name)()

def get_name(self):
    return User.objects.all()[0].name

也可以将它用作装饰者:

from channels.db import database_sync_to_async

async def connect(self):
    self.username = await self.get_name()

@database_sync_to_async
def get_name(self):
    return User.objects.all()[0].name
2.WebsocketConsumer函数说明:
# chat/consumers.py
from asgiref.sync import async_to_sync
from channels.generic.websocket import WebsocketConsumer
import json

class ChatConsumer(WebsocketConsumer):
    def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'chat_%s' % self.room_name

        # Join room group
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

        self.accept()

    def disconnect(self, close_code):
        # Leave room group
        async_to_sync(self.channel_layer.group_discard)(
            self.room_group_name,
            self.channel_name
        )

    # Receive message from WebSocket
    def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        # Send message to room group
        async_to_sync(self.channel_layer.group_send)(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message
            }
        )

    # Receive message from room group
    def chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        self.send(text_data=json.dumps({
            'message': message
        }))
  • def connect(self): 连接时触发
  • def disconnect(self, close_code): 断开时触发
  • def receive(self, text_data): 接收消息时触发
  • self.channel_layer.group_add( self.room_group_name, self.channel_name ) 将新的连接加入到群组
  • self.channel_layer.group_discard( self.room_group_name, self.channel_name ) 将关闭的连接从群组中移除
  • self.channel_layer.group_send)( self.room_group_name, { 'type': 'chat_message', 'message': message } 信息群发
  • self.send(text_data=json.dumps({ 'message': message })) 单发消息
  • self.scope [ 'url_route'] [ 'kwargs'] [ 'ROOM_NAME'] 每个用户都有一个范围,其中包含有关其连接的信息,特别是包括URL路由中的任何位置或关键字参数以及当前经过身份验证的用户(如果有)
  • self.room_group_name ='chat_%s'%self.room_name 直接从用户指定的房间名称构造Channels组名称,不进行任何引用或转义。
    组名只能包含字母,数字,连字符和句点。因此,此示例代码将在具有其他字符的房间名称上失败。
  • async_to_sync(.....) 包装器是必需的,因为ChatConsumer是同步WebsocketConsumer,但它调用异步通道层方法。(所有通道层方法都是异步的。)
  • self.accept() 接受WebSocket连接。
    如果不在connect()方法中调用accept(),则拒绝并关闭连接。例如,您可能希望拒绝连接,因为请求的用户无权执行请求的操作。
    如果您选择接受连接,建议将accept()作为connect()中的最后一个操作。
3.异步
# chat/consumers.py
from channels.generic.websocket import AsyncWebsocketConsumer
import json

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'chat_%s' % self.room_name

        # Join room group
        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )

        await self.accept()

    async def disconnect(self, close_code):
        # Leave room group
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )

    # Receive message from WebSocket
    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        # Send message to room group
        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message
            }
        )

    # Receive message from room group
    async def chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'message': message
        }))

Channels 2官网

相关文章

网友评论

    本文标题:Channels 2

    本文链接:https://www.haomeiwen.com/subject/sumixqtx.html