저는 Openshift 클라우드에 Django 프로젝트를 배포하고 있습니다. 이 프로젝트는 channels과 웹 소켓을 사용하여 비동기 적으로 작동합니다. 문제는 브라우저에서 웹 소켓을 서버 측에서 실행중인 Daphne 서버에 연결할 수 없다는 것입니다.Daphne 서버가 HTTPS의 웹 소켓에 연결할 수 없습니다.
나는 django (python2.7) 및 redis 카트리지를 사용하여 실행합니다. 이 같은
post_deploy 스크립트 내가 사용 외모 :
...
python manage.py runworker -v2 && daphne myapp.asgi:channel_layer -p 8443 -b $OPENSHIFT_REDIS_HOST -v2
...
여기 내 장고 구성입니다.
...
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 에서 : settings.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에서; 내가 다프네 설정 때문에 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 수밖에 없다 출력은 다음과 같습니다
모든 것이 클라이언트 측에서 괜찮아 보이지만 기억한다면 consumers.py 이 : "수신 : :에서"내 터미널 그래서
def ws_receive(message):
print "Receiving: '%s' from %s" % (message.content['text'], message.content['reply_channel'])
는, 서버가 같은를 인쇄해야
하지만 그렇지 않다. 여기서 내가 놓친 게 뭐야?tl; dr : 클라이언트 측 웹 소켓은 올바르게 연결되어 있지만 서버가이를 확인하기위한 메시지를 인쇄하지 않습니다.