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 アドレスにバインドされます (権限の問題)。
出力は次のようになります。
クライアント側ではすべて問題ないように見えますが、覚えていれば、consumers.pyには次のようなものがありました。
def ws_receive(message):
print "Receiving: '%s' from %s" % (message.content['text'], message.content['reply_channel'])
したがって、私の端末では、サーバーは次のようなものを出力する必要があります: "受信: から" しかし、そうではありません。ここで何が欠けていますか?
tl;dr: クライアント側の websocket は正しく接続されているように見えますが、サーバーはそれを確認するメッセージを出力していません。