Django Channels 部署

 2018年5月27日 22:17   Nick王   开发    2 评论   869 浏览 

Django 版本:1.11.13
Django-Channels 版本:2.1.1
Python 版本:3.6.5

Django Channels 部署

Channels 2 (ASGI) 应用程序和WSGI应用程序的部署类似。

配置ASGI应用程序

Channels需要配置ASGI_APPLICATION来运行。这个配置会告诉Channels哪个是你项目的根应用。这个配置可以看成是你的顶级路由器

这通常是你路由实例的路径,比如,你的路径是myproject/routing.py,那么你的配置应该是:

ASGI_APPLICATION = "myproject.routing.application"

设置channel backend

注意:这一步是可选的,如果未使用channel layer应该跳过这一部分。

通常,channel layer将会连接到一个或者多个中央服务器,用作通信层——比如Redis Backend会连接到Redis服务器。这些所有的配置都在CHANNEL_LAYERS中设置,下面是一个使用Redis backend 的例子:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("redis-server-name", 6379)],
        },
    },
}

要使用Redis backend,你还需要:

pip install -U channels_redis

运行Protocol 服务器

为了跟外界通信,你的Channels/ASGI应用程序需要加载到Protocol服务中。这可以像WSGI服务一样以HTTP的模式运行你的应用程序。但他们可以连接其他的协议,比如chat协议,iot协议,甚至无线电网络。

所有这些服务都有它们自己的配置选项,但是他们也有一个共同的特点。他们会希望你传递给他们一个ASGI应用程序来运行。

由于Django在运行的时候先配置django.setup(),比如在使用Models之前要配置一下;因此只有上面的ASGI_APPLICATION配置是远远不够的。要运行我们的Django Channels,还需要写一点代码。

在你的项目中已经有一个文件wsgi.py,这个文件用来处理Django的WSGI应用程序。现在,我们需要一个新的文件asgi.py,文件内容如下:

"""
ASGI 入口点. Configures Django and then runs the application
defined in the ASGI_APPLICATION setting.
"""

import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
django.setup()
application = get_default_application()

现在,你可以来使用daphne来运行你的应用程序:

daphne -p 8001 myproject.asgi:application

HTTP 和 WebSocket

虽然ASGI是一个通用的协议,但是我们不能在此涵盖所有的服务。很有可能,你选择使用Django Channels只是想要处理HTTP和潜在的WebSocket,所以这里我们只介绍HTTP 和 WebSocket。

Django Channels项目维护了一个官方的ASGI HTTP/WebSocket 服务器Daphne,这就是我们要讨论的内容。当然其他ASGI HTTP/WebSocket 也是可以的,只要符合规范即可,但是会有不同的配置。

你可以使用Daphne来处理所有的请求,包含HTTP和WebSocket。当然,你也可以继续使用WSGI来运行标准的HTTP请求,而仅仅将Daphne来运行WSGI处理不了的任务。比如HTTP长链接和WebSocket。

如果你做了拆分,你需要在你的Daphne和WSGI服务器前面放置一些东西来将请求发送给Daphne或者是WSGI。可以使用HTTP路径或者是域名来进行区分。比如使用Nginx,将所有ws://的请求发送给Daphne,将所有的http://发送给WSGI。

如果你使用Daphne来处理所有的流量,那么他会在HTTP和WebSocket之间自动协商。所以不需要将WebSocket放置在不同的路径或者域名下。

要运行Daphne和WSGI一样,你只需要给他一个应用就可以了。

你可以运行Daphne并且提供channel layer作为参数:

daphne myproject.asgi:application

你还可以给Daphne来绑定端口和IP地址:

daphne -b 0.0.0.0 -p 8001 myproject.asgi:application





如无特殊说明,文章均为本站原创,转载请注明出处
  • 转载请注明来源:Django Channels 部署
  • 本文永久连接地址: http://ibash.cc/frontend/article/99/