Я развертываю проект Django в облаке Openshift. Этот проект использует channels и Websockets, чтобы заставить его работать асинхронно. Проблема в том, что я не могу успешно подключить веб-порты из браузера к серверу Daphne, который я запускал на стороне сервера.Сервер Daphne не может соединяться с websockets на HTTPS
Я использую картриджи 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"),
]
...
В consumers.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!');
}
Обратите внимание, что я использую порт 8443 в настройках Дафна и WebSockets настройки из-this документации. Кроме того, Дафна обязан OPENSHIFT_HOST адрес, поскольку не представляется возможным связать его с 0.0.0.0 в OpenShift (проблема разрешения)
Результат выглядит следующим образом:
Все выглядит нормально на стороне клиента, но если вы помните, в consumer.py У меня было это:
def ws_receive(message):
print "Receiving: '%s' from %s" % (message.content['text'], message.content['reply_channel'])
Так что в моем терминале сервер должен печатать что-то вроде: «Получение: от», но это не так. Что мне здесь не хватает?
tl; dr: Клиентский websocket выглядит правильно, но сервер не распечатывает сообщение, чтобы подтвердить его.