小编给大家分享一下Django-channels如何实现WebSocket,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
创新互联主要从事网页设计、PC网站建设(电脑版网站建设)、wap网站建设(手机版网站建设)、成都响应式网站建设公司、程序开发、网站优化、微网站、微信小程序开发等,凭借多年来在互联网的打拼,我们在互联网网站建设行业积累了丰富的成都做网站、网站建设、网站设计、网络营销经验,集策划、开发、设计、营销、管理等多方位专业化运作于一体。引入
先安装三个模块
pip install channels pip install channels_redis pip install pywin32
创建一个Django项目和一个app
项目名随意,app名随意。这里项目名为 django_websocket_demo ,app名 chat
把app文件夹下除了 views.py 和 __init__.py 的文件都删了,最终项目目录结构如下:
django_websocket_demo/ manage.py django_websocket_demo/ __init__.py settings.py urls.py wsgi.py chat/ __init__.py views.py
在app下新建一个templates文件夹用来存放HTML页面:
chat/ __init__.py templates/ chat/ index.html views.py
index.html 内容如下:
Chat Rooms What chat room would you like to enter?
在 chat/views.py 中添加视图函数:
from django.shortcuts import render def index(request): return render(request, 'chat/index.html', {})
添加 chat/urls.py 文件并设置路由信息:
from django.urls import re_path from . import views urlpatterns = [ re_path(r'^$', views.index, name='index'), ]
在项目路由 django_websocket_demo/urls.py 中配置路由信息:
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^chat/', include('chat.urls')), url(r'^admin/', admin.site.urls), ]
在 settings.py 文件同级目录下新建 routing.py 文件,内容如下:
from channels.routing import ProtocolTypeRouter application = ProtocolTypeRouter({ # (http->django views is added by default) })
把 channels 注册在 settings.py 里:
INSTALLED_APPS = [ 'channels', 'chat', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
在 settings.py 文件中,添加如下配置项:
# django_websocket_demo/settings.py # Channels # Channels ASGI_APPLICATION = 'django_websocket_demo.routing.application'
创建聊天页面
创建一个 chat/templates/chat/room.html 文件,添加如下内容:
Chat Room
在 chat/views.py 中添加一个处理 room的视图函数:
from django.shortcuts import render from django.utils.safestring import mark_safe import json def index(request): return render(request, 'chat/index.html', {}) def room(request, room_name): return render(request, 'chat/room.html', { 'room_name_json': mark_safe(json.dumps(room_name)) })
在 chat/urls.py 中注册路由
from django.urls import re_path from . import views urlpatterns = [ re_path(r'^$', views.index, name='index'), re_path(r'^(?P[^/]+)/$', views.room, name='room'), ]
新建 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 }))
新建一个 chat/routing.py 文件,添加以下内容:
from django.urls import re_path from . import consumers websocket_urlpatterns = [ re_path(r'^ws/chat/(?P[^/]+)/$', consumers.ChatConsumer), ]
将 django_websocket_demo/routing.py 文件中修改为以下内容:
from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter import chat.routing application = ProtocolTypeRouter({ # (http->django views is added by default) 'websocket': AuthMiddlewareStack( URLRouter( chat.routing.websocket_urlpatterns ) ), })
配置redis
在本地6379端口启动redis : redis-server
在 settings.py 中添加如下配置:
CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels_redis.core.RedisChannelLayer', 'CONFIG': { "hosts": [('127.0.0.1', 6379)], }, }, }
最后启动Django项目
使用多个浏览器打开http://127.0.0.1:8000/chat/lobby/ ,开始实时聊天吧。
以上是“Django-channels如何实现WebSocket”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联成都网站设计公司行业资讯频道!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。