当前位置:   article > 正文

Django使用channels实现通信_django-channels和flutter通信

django-channels和flutter通信

Channels 是 Django 的一个扩展,用于支持实时、异步的 Web 应用程序。传统的 Django 主要是同步的,即每个请求都在一个线程中处理,但是对于实时性要求高的应用,例如聊天应用、通知系统、实时协作工具等,需要支持异步操作和长连接。

Channels 扩展引入了异步处理和 WebSockets 支持,使得 Django 应用程序能够处理更复杂的、实时性要求高的任务。Channels 提供以下主要功能:

  1. 异步处理:Channels 允许视图函数以异步方式运行,这意味着您可以在一个请求中执行多个异步操作,而不会阻塞其他请求。

  2. WebSockets 支持:Channels 提供了对 WebSockets 协议的原生支持,使得 Django 应用程序可以实时处理双向通信,例如实时聊天或推送通知。

  3. 后台任务:您可以将长时间运行的任务(例如发送大量电子邮件)移到后台进行处理,以提高应用程序的性能和响应时间。

  4. 分布式架构:Channels 可以与消息队列(如 Redis、RabbitMQ)集成,以支持分布式应用程序,多个实例之间可以协同工作。

  5. 通道层:Channels 引入了通道层的概念,用于处理多个服务器之间的消息传递,这在分布式环境中特别有用。

  6. 事件处理:Channels 允许您订阅和处理应用程序内部的事件,以便触发特定操作,例如当某个模型对象被保存时触发通知。

  7. 自定义协议支持:除了 WebSockets,Channels 还允许您自定义协议,以适应各种实时通信需求。

1.首先安装依赖包 pip install channels channels-redis

2.settings.py 修改加上支持.

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'MyWeb.apps.MywebConfig',
  9. "channels",
  10. ]

首先需要建立一个django项目。其中在你自己的app下面 生成consumers.py和routing.py配置文件。

  • consumers.py:相当于django的视图,也就是说所有的websocket路由过来的执行的函数都在consumers.py类似于django的视图views.py
  • routing.py:是websocket中的url和执行函数的对应关系。相当于django的urls.py,根据映射关系,当websocket的请求进来的时候,根据用户的请求来触发我们的consumers.py里的方法。

2.安装redis

  1. redis 安装配置默认密码
  2. yum install -y redis
  3. [root@localhost ~]# vim /etc/redis.conf 开启远程
  4. bind 0.0.0.0
  5. protected-mode no
  6. redis-cli -h 192.168.1.20 -p 6379

3.接着配置settings.py 最底部加上这条。

  1. CHANNEL_LAYERS = {
  2. 'default': {
  3. 'BACKEND': 'channels_redis.core.RedisChannelLayer',
  4. 'CONFIG': {
  5. "hosts": [('192.168.1.20', 6379)],
  6. },
  7. },
  8. }
  9. ASGI_APPLICATION = "MyWeb.routing.application"

接着简单的写一下,routing.py 里面

  1. from channels.routing import ProtocolTypeRouter
  2. application = ProtocolTypeRouter({
  3. # Empty for now (http->django views is added by default)
  4. })

进入django shell 测试是否能连接到数据库

  1. (venv) C:\Users\LyShark\PycharmProjects\MyProject>manage.py shell
  2. Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. (InteractiveConsole)
  5. >>> import channels.layers
  6. >>> channel_layer = channels.layers.get_channel_layer()
  7. >>> from asgiref.sync import async_to_sync
  8. >>> async_to_sync(channel_layer.send)('test_channel', {'type': 'hello'})
  9. >>> async_to_sync(channel_layer.receive)('test_channel')
  10. {'type': 'hello'}
  11. >>>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/766765
推荐阅读
相关标签
  

闽ICP备14008679号