django-channels小结

为什么使用django-channels: 在项目实际开发过程中需要实现客户端(浏览器)与服务器之间的实时通信。

websockets: websockets是一种新的全双工通信协议,一个持久的,可以在任何时间发送数据的客户端与服务器之间的链接。

项目中的几个重要配置:

一、服务器端

1.使用asgi替代wsgi:

django-channels小结_第1张图片

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()

2.settings配置:

注册应用:

django-channels小结_第2张图片

使用redis作为消息传输通道层:

django-channels小结_第3张图片

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)

二、客户端(页面html)

如何通过javascript定义一个websocket并进行消息的发送及响应:

{% load static %}





三、效果展示



django-channels小结_第4张图片

你可能感兴趣的:(python,Django)