Django 中的 channels

摘要:
/usr/bin/envpython2#-*-coding:utf-8-*-3fromchannels.routingimportProtocolTypeRouter,URLRouter4fromdjango.conf.urlsimporturl5fromchatimportconsumers678application=ProtocolTypeRouter应用和路由2.3编写处理websocket逻辑业务1#!
Django Channels

django channels 是django支持websocket的一个模块。

1. 安装

1
pip3 install channels

2. 快速上手

2.1 在settings中添加配置

注册channels的app
ASGI_APPLICATION = "django_channels_demo.routing.application"
添加ASGI_APPLICATION支持websocket

2.2 创建websocket应用和路由

1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 from channels.routing importProtocolTypeRouter, URLRouter
4 from django.conf.urls importurl
5 from chat importconsumers
6 
7 
8 application =ProtocolTypeRouter({
9     'websocket': URLRouter([
10         url(r'^chat/$', consumers.ChatConsumer),
11 ])
12 })
应用和路由

2.3 编写处理websocket逻辑业务

1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 from channels.generic.websocket importWebsocketConsumer
4 from channels.exceptions importStopConsumer
5 
6 classChatConsumer(WebsocketConsumer):
7 
8     defwebsocket_connect(self, message):
9 self.accept()
10 
11     defwebsocket_receive(self, message):
12         print('接收到消息', message)
13         self.send(text_data='收到了')
14 
15     defwebsocket_disconnect(self, message):
16         print('客户端断开连接了')
17         raise StopConsumer()
示例一
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 from channels.generic.websocket importWebsocketConsumer
4 from channels.exceptions importStopConsumer
5 
6 
7 classSimpleChatConsumer(WebsocketConsumer):
8     defconnect(self):
9 self.accept()
10 
11     def receive(self, text_data=None, bytes_data=None):
12 self.send(text_data)
13 
14         #主动断开连接
15         #self.close()
16 
17     defdisconnect(self, code):
18         print('客户端要断开了')
19 
20 示例二
示例二
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 from channels.generic.websocket importWebsocketConsumer
4 from channels.exceptions importStopConsumer
5 
6 
7 CLIENTS =[]
8 
9 classChatConsumer(WebsocketConsumer):
10 
11     defconnect(self):
12 self.accept()
13 CLIENTS.append(self)
14 
15     def receive(self, text_data=None, bytes_data=None):
16         for item inCLIENTS:
17 item.send(text_data)
18 
19         #主动断开连接
20         #self.close()
21 
22     defdisconnect(self, code):
23 CLIENTS.remove(self)
24 
25 示例三
示例三

3. channel layer

基于内存的channel layer

1 CHANNEL_LAYERS ={
2     "default": {
3         "BACKEND": "channels.layers.InMemoryChannelLayer",
4 }
5 }
配置
1 from channels.generic.websocket importWebsocketConsumer
2 from asgiref.sync importasync_to_sync
3 
4 
5 classChatConsumer(WebsocketConsumer):
6 
7     defconnect(self):
8         async_to_sync(self.channel_layer.group_add)('x1', self.channel_name)
9 self.accept()
10 
11     def receive(self, text_data=None, bytes_data=None):
12         async_to_sync(self.channel_layer.group_send)('x1', {
13             'type': 'xxx.ooo',
14             'message': text_data
15 })
16 
17     defxxx_ooo(self, event):
18         message = event['message']
19 self.send(message)
20 
21     defdisconnect(self, code):
22         async_to_sync(self.channel_layer.group_discard)('x1', self.channel_name)
23 
24 业务处理
业务处理

基于 redis的channel layer

pip3 install channels-redis

1 CHANNEL_LAYERS ={
2     "default": {
3         "BACKEND": "channels_redis.core.RedisChannelLayer",
4         "CONFIG": {
5             "hosts": [('10.211.55.25', 6379)]
6 },
7 },
8 }
9 
10 
11 CHANNEL_LAYERS ={
12     'default': {
13     'BACKEND': 'channels_redis.core.RedisChannelLayer',
14     'CONFIG': {"hosts": ["redis://10.211.55.25:6379/1"],},
15 },
16 }
17  
18 
19 CHANNEL_LAYERS ={
20     'default': {
21     'BACKEND': 'channels_redis.core.RedisChannelLayer',
22     'CONFIG': {"hosts": [('10.211.55.25', 6379)],},},
23 }
24  
25 
26 CHANNEL_LAYERS ={
27     "default": {
28         "BACKEND": "channels_redis.core.RedisChannelLayer",
29         "CONFIG": {
30             "hosts": ["redis://:password@10.211.55.25:6379/0"],
31             "symmetric_encryption_keys": [SECRET_KEY],
32 },
33 },
34 }
35 
36 配置
配置
1 from channels.generic.websocket importWebsocketConsumer
2 from asgiref.sync importasync_to_sync
3 
4 
5 classChatConsumer(WebsocketConsumer):
6 
7     defconnect(self):
8         async_to_sync(self.channel_layer.group_add)('x1', self.channel_name)
9 self.accept()
10 
11     def receive(self, text_data=None, bytes_data=None):
12         async_to_sync(self.channel_layer.group_send)('x1', {
13             'type': 'xxx.ooo',
14             'message': text_data
15 })
16 
17     defxxx_ooo(self, event):
18         message = event['message']
19 self.send(message)
20 
21     defdisconnect(self, code):
22         async_to_sync(self.channel_layer.group_discard)('x1', self.channel_name)
23 
24 业务逻辑
业务处理

免责声明:文章转载自《Django 中的 channels》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Google官方关于Android架构中MVP模式的示例续-DataBindingwindows CMD大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django实现支付宝付款和微信支付

支付宝支付和微信支付是当今互联网产品常用的功能,我使用Django Rest Framework实现了网页上支付宝支付和微信支付的一个通用服务,提供rpc接口给其他服务,包括获取支付宝支付页面url的rpc接口、支付宝支付成功异步回调http接口、获取微信支付二维码rpc接口、主动查询微信订单是否支付的rpc接口等。 支付宝网站支付需要蚂蚁金服开放平台账号...

DateTimeField *** received a naive datetime (***) while time zone support is active

django报错: /usr/local/lib/python2.7/dist-packages/Django-1.8.2-py2.7.egg/django/db/models/fields/init.py:1474: RuntimeWarning: DateTimeField Org.updatedAt received a naive datetime...

docker部署django项目、mysql主从搭建、django实现读写分离

目录 docker部署django项目 1.1 基于python基础镜像 将本地django项目打包并发到远程服务器上 将服务器上的.zip django项目解压 部署的具体流程 1.2 基于dockerfile 2 mysql主从搭建 一 主从配置原理 二 操作步骤 2.1我们准备三台装好mysql的服务器(我在此用docker模拟...

django shell 操作

插件:django-extensions django-extensions==1.9.8 pip3 installdjango-extensions 1.数据库shell 命令(项目目录下) python3 manage.py dbshell 执行sql语句 2.查看django orm对应的sql语句 https://www.jianshu.com/p...

django之设置缓存

缓存 一句话总结:缓存可以对view、模板、数据进行缓存可以设置缓存在不同的地方(本地内存、redis、系统文档)可以为服务器节省性能、减少用户等待时间。 对于中等流量的网站来说,尽可能地减少开销是必要的。缓存数据就是为了保存那些需要很多计算资源的结果,这样的话就不必在下次重复消耗计算资源 Django自带了一个健壮的缓存系统来保存动态页面,避免对于每...

异步任务分发模块Celery

Celery简介 Celery是一个功能完备即插即用的任务队列。它使得我们不需要考虑复杂的问题,使用非常简单。 celery适用异步处理问题,当遇到发送邮件、或者文件上传, 图像处理等等一些比较耗时的操作,我们可将其异步执行,这样用户不需要等待很久,提高用户体验。 celery的特点是: 简单,易于使用和维护,有丰富的文档。 高效,单个celery进程每...