私はOpenshiftクラウドにDjangoプロジェクトを展開しています。このプロジェクトでは、channelsとWebsocketを使用して非同期で動作させています。問題は、サーバーサイドで稼働しているDaphneサーバーにブラウザからWebソケットを正常に接続できないことです。DaphneサーバーがHTTPS上のWebソケットに接続できません
私はdjango(python2.7)とredisカートリッジを使って動作させています。このような
post_deployスクリプト私が使用しているルックス:
...
python manage.py runworker -v2 && daphne myapp.asgi:channel_layer -p 8443 -b $OPENSHIFT_REDIS_HOST -v2
...
は、ここに私のDjangoの設定です。 routing.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",
},
}
...
:settings.pyでconsumers.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"),
]
...
。私はダフネの設定と理由thisドキュメントのWebSocketを設定でポート8443を使用してい
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!');
}
注意:クライアント側で
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'])
は、私はこのコードを実行していますよ。また、ダフネはOpenshift(権限の問題)で0.0.0.0にバインドすることはできませんので、アドレスをOPENSHIFT_HOSTにバインドされて
出力は次のようになります。
すべてがクライアント側では問題なく表示されますが、覚えていれば個のconsumer.pyこれは:
私の端末では、サーバは「Receiving from」のようなものを印刷する必要がありますが、そうではありません。ここで私は何が欠けているのですか?
tl; dr:クライアント側Webソケットは正しく接続されているように見えますが、サーバーはメッセージを確認して印刷していません。