详解Django-channels 实现WebSocket实例
引入
先安装三个模块
pipinstallchannels pipinstallchannels_redis pipinstallpywin32
创建一个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内容如下:
ChatRooms Whatchatroomwouldyouliketoenter?
在 chat/views.py中添加视图函数:
fromdjango.shortcutsimportrender
defindex(request):
returnrender(request,'chat/index.html',{})
添加 chat/urls.py文件并设置路由信息:
fromdjango.urlsimportre_path from.importviews urlpatterns=[ re_path(r'^$',views.index,name='index'), ]
在项目路由 django_websocket_demo/urls.py中配置路由信息:
fromdjango.conf.urlsimportinclude,url
fromdjango.contribimportadmin
urlpatterns=[
url(r'^chat/',include('chat.urls')),
url(r'^admin/',admin.site.urls),
]
在 settings.py文件同级目录下新建 routing.py文件,内容如下:
fromchannels.routingimportProtocolTypeRouter
application=ProtocolTypeRouter({
#(http->djangoviewsisaddedbydefault)
})
把 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文件,添加如下内容:
ChatRoom
在 chat/views.py中添加一个处理room的视图函数:
fromdjango.shortcutsimportrender
fromdjango.utils.safestringimportmark_safe
importjson
defindex(request):
returnrender(request,'chat/index.html',{})
defroom(request,room_name):
returnrender(request,'chat/room.html',{
'room_name_json':mark_safe(json.dumps(room_name))
})
在 chat/urls.py中注册路由
fromdjango.urlsimportre_path from.importviews urlpatterns=[ re_path(r'^$',views.index,name='index'), re_path(r'^(?P[^/]+)/$',views.room,name='room'), ]
新建 chat/consumers.py文件,添加如下内容:
fromchannels.generic.websocketimportAsyncWebsocketConsumer
importjson
classChatConsumer(AsyncWebsocketConsumer):
asyncdefconnect(self):
self.room_name=self.scope['url_route']['kwargs']['room_name']
self.room_group_name='chat_%s'%self.room_name
#Joinroomgroup
awaitself.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
awaitself.accept()
asyncdefdisconnect(self,close_code):
#Leaveroomgroup
awaitself.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
#ReceivemessagefromWebSocket
asyncdefreceive(self,text_data):
text_data_json=json.loads(text_data)
message=text_data_json['message']
#Sendmessagetoroomgroup
awaitself.channel_layer.group_send(
self.room_group_name,
{
'type':'chat_message',
'message':message
}
)
#Receivemessagefromroomgroup
asyncdefchat_message(self,event):
message=event['message']
#SendmessagetoWebSocket
awaitself.send(text_data=json.dumps({
'message':message
}))
新建一个 chat/routing.py文件,添加以下内容:
fromdjango.urlsimportre_path from.importconsumers websocket_urlpatterns=[ re_path(r'^ws/chat/(?P[^/]+)/$',consumers.ChatConsumer), ]
将 django_websocket_demo/routing.py文件中修改为以下内容:
fromchannels.authimportAuthMiddlewareStack
fromchannels.routingimportProtocolTypeRouter,URLRouter
importchat.routing
application=ProtocolTypeRouter({
#(http->djangoviewsisaddedbydefault)
'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/,开始实时聊天吧。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。