关注各种黑科技
B站UP主,编程教学,游戏玩家,挂B,金牛座

Django Channels初探 part1

本篇我来简单的向大家介绍一下Django里新的Channels库。Channels是官方提供的一套django兼容websocket,http2等最新协议的方法。有了Channels的帮助,你可以很方便的构建django realtime web app(实时应用)。 其主要包含下列四个组件: 1 channel  一个FIFO队列数据接口,我们可以创建多个channel满足我们的业务需要 2 message 发送给channel的消息,供消费者消费 3 consumer 消费者 某个方法用来对message做出处理 4 interface server 接口服务器 用于连接django与外界的桥梁,可适配多种网络协议   他们之间是如何工作的? 首先一个http请求到达,通过interface server判断请求的类型。我们下面的例子中使用Daphne这个interface server,他能处理http或websocket请求。请求经过Daphne,被分发到不同的channel里,http转成一个message发送到http.request channel,websocket也转成一个message发送到websocket.receive channel。注意这里的http.request和websocket.receive频道都是channels包已经定义好的channel,可以直接使用,以后我们会学习如何新建channel。 现在我们的channels里有了一些消息,需要做一下处理。编写一些consumer方法,并注册到不同的channel中去,当消息到达时,就自动执行这些方法。 这些方法从channel读取一个message,执行我们想要的步骤或触发动作,完成后这个message也就从channel中移除了,我们说这个message被消费掉了。 到这里,我们还会遇到一种需求,给发消息的一方返回一个消息。interface server会自动的为请求创建一个reply channel,并且把不同的请求方注册到这个channel中去。请求消费者完成动作后,会发送一个reply消息到reply channel中,这个消息里也有请求发送方的信息,随后,interface server监听着reply channel,一但有消息会把这些消息转换成http响应反向的传输回去。   下面我们通过代码来进一步熟悉Channels库 我们将要实现一个echo server,它会把我们发送过去数据再发送回去。 安装channels
pip3 install channels -i https://pypi.douban.com/simple
由于channels依赖django>=1.8( https://github.com/django/channels/blob/master/setup.py),所以会自动安装。   创建django project与app
django-admin.py startproject djchan
cd djchan
python manage.py startapp realtime
  配置INSTALLED_APPS添加新app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #new app
    "channels",
    "realtime"
]
  编写消费者方法
# consumers.py
def websocket_receive(message):
    text = message.content.get('text')
    if text:
        message.reply_channel.send({"text": "You said: {}".format(text)})
取到message,再发送到reply channel   添加Channels路由
# routing.py
from channels.routing import route
from .consumers import websocket_receive
channel_routing = [
    route("websocket.receive", websocket_receive, path=r"^/chat/"),
]
这里的route不是在urls.py里,需要单独文件定义 route('channel名称', '消费方法','路径') 其中路径若为空,则消费者获得所以发送给websocket.receive频道的消息。path必须以/开头   配置channel 我们使用redis作为channel的后端,redis作为消息的读写管道。
pip3 install asgi_redis -i https://pypi.douban.com/simple
settings.py
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgi_redis.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("localhost", 6379)],
        },
        "ROUTING": "realtime.routing.channel_routing",
    },
}
  启动服务 python manage.py runserver 这里会同时启动django的web server与channel interface server以及channel的消费者工作进程。生成环境中,我们分开运行,后面介绍。   测试 访问It workers!页面 在chrome console中输入js代码
socket = new WebSocket("ws://" + window.location.host + "/chat/");
socket.onmessage = function(e) {
    alert(e.data);
}
socket.onopen = function() {
    socket.send("hello world");
}
  参考 http://masnun.rocks/2016/09/25/introduction-to-django-channels/    
转载请注明出处
分享到: 更多 (0)

评论 0