3

Openshift クラウドに Django プロジェクトをデプロイしています。このプロジェクトは、チャネルと Websockets を使用して、非同期で動作するようにします。問題は、ブラウザからサーバー側で実行している Daphne サーバーに Websocket を正常に接続できないことです。

私はdjango(python2.7)とredisカートリッジを使用して実行しています。

私が使用している post_deploy スクリプトは次のようになります。

...
python manage.py runworker -v2 && daphne myapp.asgi:channel_layer -p 8443 -b $OPENSHIFT_REDIS_HOST -v2
...

これが私のDjango構成です。settings.pyで:

...
ALLOWED_HOSTS = [
    socket.gethostname(), 
    os.environ.get('OPENSHIFT_APP_DNS'),
]

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgi_redis.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("redis://:{}@{}:{}/0").format(
                OPENSHIFT_REDIS_PASSWORD,
                OPENSHIFT_REDIS_HOST,
                OPENSHIFT_REDIS_PORT
                )],
        },
        "ROUTING": "myapp.routing.channel_routing",
    },
}
...

routing.py:

...
ws_routing = [
    routing.route("websocket.connect", ws_connect),
    routing.route("websocket.receive", ws_receive),
    routing.route("websocket.disconnect", ws_disconnect),
]

channel_routing = [
    include(ws_routing, path=r"^/sync"),
]
...

consumer.pyで。

def ws_connect(message):
    Group("notifications").add(message.reply_channel)

def ws_disconnect(message):
    Group("notifications").discard(message.reply_channel)

def ws_receive(message):
    print "Receiving: '%s' from %s" % (message.content['text'], message.content['reply_channel'])

クライアント側では、次のコードを実行しています。

var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws";
var path = ws_scheme+'://'+window.location.host + ':8443/sync';
var ws = new WebSocket(path);
ws.onmessage = function(message) {
    console.log(message.data);
}
ws.onopen = function() {
    this.send('WS Connecting to receive updates!');
}

このドキュメントのために、Daphne 設定と WebSockets 設定でポート 8443 を使用していることに注意してください。また、Openshift では 0.0.0.0 にバインドできないため、Daphne は OPENSHIFT_HOST アドレスにバインドされます (権限の問題)。

出力は次のようになります。

最初

2番目

三番

クライアント側ではすべて問題ないように見えますが、覚えていれば、consumers.pyには次のようなものがありました。

def ws_receive(message):
    print "Receiving: '%s' from %s" % (message.content['text'], message.content['reply_channel'])

したがって、私の端末では、サーバーは次のようなものを出力する必要があります: "受信: から" しかし、そうではありません。ここで何が欠けていますか?

tl;dr: クライアント側の websocket は正しく接続されているように見えますが、サーバーはそれを確認するメッセージを出力していません。

4

1 に答える 1