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