Python语言技术文档

微信小程序技术文档

php语言技术文档

jsp语言技术文档

asp语言技术文档

C#/.NET语言技术文档

html5/css技术文档

javascript

点击排行

您现在的位置:首页 > 技术文档 > Python网站web

详解Django-channels 实现WebSocket实例

来源:中文源码网    浏览:644 次    日期:2024-04-27 21:21:03
【下载文档:  详解Django-channels 实现WebSocket实例.txt 】


详解Django-channels 实现WebSocket实例
引入
先安装三个模块
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/ ,开始实时聊天吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中文源码网。

相关内容