Django rest 框架,Django 通道,Ionic2 - websocket 握手错误

Posted

技术标签:

【中文标题】Django rest 框架,Django 通道,Ionic2 - websocket 握手错误【英文标题】:Django restframework, Django channels, Ionic 2 - websocket handshake error 【发布时间】:2017-01-25 16:56:15 【问题描述】:

我目前正在使用线程标题中提到的技术进行一个项目。

我是从浏览器中运行的(应用程序托管在 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? 所以我的猜测是,服务器可能会拒绝客户端发送的原始标头。我会看看我是否可以得到正在发送的标题

【问题讨论】:

更多关于 websockets 的技术细节和源头的使用 security.stackexchange.com/questions/115716/… 【参考方案1】:

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

不幸的是,我没有找到一种方法来配置 heroku 上的网络服务器以忽略这一点或在传入数据包上设置另一个源头。

我在 Heroku 上的 Procfile:

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

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

就是这样。我希望这可以帮助一些人。

【讨论】:

【参考方案2】:

谢谢你 platzhersch,

它适用于以下 nginx 规则:

proxy_set_header Origin http://$host;

【讨论】:

【参考方案3】:

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

您还需要更新频道和 asgi-redis(如果使用)。

【讨论】:

没试过这个,但看起来这可能是迄今为止最好的答案。感谢分享!

以上是关于Django rest 框架,Django 通道,Ionic2 - websocket 握手错误的主要内容,如果未能解决你的问题,请参考以下文章

Django 通道 JWT 身份验证

如何使用 Django 通道为 Django Rest Api 打开 Websocket?

Django + AngularJS:没有使用普通 URL 和视图的 Django REST 框架的类 REST 端点?

带有 Django 2.0 的 Django REST 框架 URL

使用 django-allauth 和 django-rest 框架

django.test.client 上的 Django rest 框架导入错误