为什么使用django-channels: 在项目实际开发过程中需要实现客户端(浏览器)与服务器之间的实时通信。
websockets: websockets是一种新的全双工通信协议,一个持久的,可以在任何时间发送数据的客户端与服务器之间的链接。
项目中的几个重要配置:
一、服务器端
1.使用asgi替代wsgi:
asgi.py
# coding: utf-8
'''
Created on 2017年3月2日
@author: win7
'''
import os
from channels.asgi import get_channel_layer
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ChannelsDemo.settings")
channel_layer = get_channel_layer()
注册应用:
使用redis作为消息传输通道层:
3.channels路由层配置:
#coding: utf-8
'''
Created on 2017年5月17日
@author: win7
'''
'''
路由层,可以理解为django中的urls.py
'''
from channels.routing import route, include
from channels.staticfiles import StaticFilesConsumer
import consumers
channel_routing = [
route('http.request', StaticFilesConsumer),
route('websocket.connect', consumers.ws_connect),
route('websocket.receive', consumers.ws_receive),
route('websocket.disconnect', consumers.ws_disconnect),
]
routing = [
include(channel_routing, path=r"^/test"),
]
4.channels消费者层:
# coding: utf-8
'''
Created on 2017年5月17日
@author: win7
'''
from channels.sessions import channel_session
from channels import Group
@channel_session
def ws_connect(message):
Group('chat-'+'test', channel_layer=message.channel_layer).add(message.reply_channel)
message.channel_session['room'] = 'test'
@channel_session
def ws_receive(message):
label = message.channel_session['room']
Group('chat-'+label, channel_layer=message.channel_layer).send({'text': 'hello world!'})
@channel_session
def ws_disconnect(message):
label = message.channel_session['room']
Group('chat-'+label, channel_layer=message.channel_layer).discard(message.reply_channel)
如何通过javascript定义一个websocket并进行消息的发送及响应:
{% load static %}
三、效果展示