当前位置:   article > 正文

Channels ,一个强大的 Python 库_channels python

channels python

介绍

Channels 是一个Django项目的扩展,可以使开发者轻松地处理WebSocket、长轮询、HTTP2和其他非同步协议。Channels的设计目的是为了扩展Django的功能,允许它支持类似即时消息这样的特性,同时仍能保留其同步、便捷的特性。它提供了一种异步处理的方式,同时也支持完全的异步编程。

安装方式

要开始使用Django Channels,你需要安装channels库以及channels_redis,后者是作为Channels的后端来使用的。你可以使用pip来安装:

pip install channels  
pip install channels_redis  

  • 1
  • 2
  • 3

在安装了channels之后,你还需要将其添加到Django项目的INSTALLED_APPS设置中:

# settings.py  
  
INSTALLED_APPS = [  
    # ...  
    'channels',  
    # ...  
]  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

还需要指定CHANNEL_LAYERS来配置Channels层。如果你使用Redis作为后端,配置可能如下所示:

# settings.py  
  
CHANNEL_LAYERS = {  
    'default': {  
        'BACKEND': 'channels_redis.core.RedisChannelLayer',  
        'CONFIG': {  
            "hosts": [('127.0.0.1', 6379)],  
        },  
    },  
}  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

使用方式

要使用Channels, 你需创建一个routing.py文件在你的Django app目录下,此文件包含了WebSocket路由的配置。你需要创建一个消费者类(Consumer class),该类定义了WebSocket连接的处理逻辑:

# myapp/consumers.py  
  
from channels.generic.websocket import AsyncWebsocketConsumer  
  
class EchoConsumer(AsyncWebsocketConsumer):  
    async def connect(self):  
        await self.accept()  
  
    async def disconnect(self, close_code):  
        pass  
  
    async def receive(self, text_data):  
        await self.send(text_data=text_data)  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

然后在routing.py中引入这个消费者并设置路由:

# myapp/routing.py  
  
from django.urls import path  
from .consumers import EchoConsumer  
  
websocket_urlpatterns = [  
    path('ws/echo/', EchoConsumer.as_asgi()),  
]  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

最后,你需要将这些WebSocket路由添加到项目的主路由配置中:

# mysite/routing.py  
  
from channels.routing import ProtocolTypeRouter, URLRouter  
import myapp.routing  
  
application = ProtocolTypeRouter({  
    "websocket": URLRouter(  
        myapp.routing.websocket_urlpatterns  
    ),  
})  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

确保你的ASGI应用指向了这个mysite.routing.application

代码示例

下面是一个更完整的示例,包含了一个简单的echo服务器,它回显客户端发送的所有消息。

# myapp/consumers.py  
import json  
from channels.generic.websocket import AsyncWebsocketConsumer  
  
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  
        }))  
  
# myapp/routing.py  
from django.urls import path  
from .consumers import ChatConsumer  
  
websocket_urlpatterns = [  
    path('ws/chat/<str:room_name>/', ChatConsumer.as_asgi()),  
]  
  
# mysite/routing.py  
from channels.routing import ProtocolTypeRouter, URLRouter  
import myapp.routing  
  
application = ProtocolTypeRouter({  
    "websocket": URLRouter(  
        myapp.routing.websocket_urlpatterns  
    ),  
})  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

这个示例中,我们创建了一个ChatConsumer用于处理WebSocket连接,并且通过.as_asgi()方法在路由中作为ASGI应用使用。客户端可以连接到ws/chat/<room_name>/并发送和接收消息。

以上就是“Channels ,一个强大的 Python 库”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/317140
推荐阅读
相关标签
  

闽ICP备14008679号