Django restframework,Django频道,Ionic 2 - websocket握手错误

时间:2016-09-17 15:56:54

标签: django ionic-framework django-rest-framework django-cors-headers django-channels

我目前正在使用主题标题中提到的技术开展项目。

我从浏览器运行它(应用程序托管在heroku上),但是当我尝试从Ionic 2应用程序连接到websockets时,我总是在建立握手时出错。

2016-09-17T15:02:03.200133+00:00 app[web.1]: 2016-09-17 15:02:03,199 DEBUG    Connection http.response!uvRVDyvolYEG did not get successful WS handshake.

2016-09-17T15:02:03.200498+00:00 app[web.1]: 2016-09-17 15:02:03,200 DEBUG    WebSocket closed before handshake established

2016-09-17T15:02:03.169206+00:00 heroku[router]: at=info method=GET path="/1/" host=musicmashup-jukebox.herokuapp.com request_id=c46960d7-bb8f-45bf-b8be-5a934c771d96 fwd="212.243.230.222" dyno=web.1 connect=0ms service=7ms status=400 bytes=74

现在有一个想法是,它可能是一个CORS问题。所以我安装了django-cors-middleware希望这可以解决问题 - 但事实并非如此。 但我认为应用程序根本不会向Daphne服务器添加任何标头。

目前我不知道,如果问题发生在客户端或服务器端。

有没有人遇到过类似的问题?

编辑: 发现websockets和CORS彼此之间没有任何关系Why is there no same-origin policy for WebSockets? Why can I connect to ws://localhost? 所以我的猜测是,服务器可能会拒绝客户端发送的原始标头。我会看看我是否可以抓住发送的标题

3 个答案:

答案 0 :(得分:1)

此问题已在Daphne v.1.0.3中修复 https://github.com/django/daphne/commit/07dd777ef11f5091931fbb22bdacb9e4aefea7da

如果使用了频道和asgi-redis,你还需要更新它们。

答案 1 :(得分:0)

好吧,问题与原始标题有某种关系。 Ionic似乎正在发送包含“file:// ..”的原始标题,该标题被websocket服务器拒绝/阻止。

不幸的是我找不到在heroku上配置web服务器的方法,要么忽略它,要么在传入的数据包上设置另一个源头。

myoku上的我的Procfile:

web: daphne app.asgi:channel_layer --port $PORT--bind 0.0.0.0 -v2
worker: python manage.py runworker -v2

我当时所做的是将整个应用程序移动到自托管的Ubuntu服务器并将一个nginx放在Daphne前面,在那里我创建了一个规则来覆盖传入数据包的原始标头。

这是怎么做的..我希望这可以帮助一些人。

答案 2 :(得分:0)

谢谢platzhersch,

它适用于我的以下nginx规则:

proxy_set_header Origin http://$host;