【问题标题】:Flask-SocketIO and 400 Bad RequestFlask-SocketIO 和 400 错误请求
【发布时间】:2019-07-24 20:21:59
【问题描述】:

我正在运行一个带有 socketio 的 Flask 应用程序来处理通知。 Flask 应用正在监听 5000 端口,而客户端在 8080。

js客户端总是报这个错误:

VM15520:1 GET http://localhost:5000/socket.io/?EIO=3&transport=polling&t=Mb2_LpO 400 (Bad Request)
Access to XMLHttpRequest at 'http://localhost:5000/socket.io/?EIO=3&transport=polling&t=Mb2_LpO' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我实际上是用 gunicorn 启动我的应用程序,如下所示:

gunicorn --workers=1 --worker-class eventlet --certfile=keys/key.crt --keyfile=keys/key.key --bind 0.0.0.0:5000 myapp.run:app

这是我的 run.py:

import eventlet
from myapp import create_app
eventlet.monkey_patch()
app, celery = create_app('config_prod.py')

我还在我的应用工厂中使用 CORS(app)。

我还尝试将其添加到我的一个蓝图中:

@api.after_request
def after_request(response):
    response.headers.add('Access-Control-Allow-Origin', 'http://localhost:8080')
    response.headers.add('Access-Control-Allow-Headers',
                         'Origin, X-Requested-With, Content-Type, Accept, Authorization')
    response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS')
    response.headers.add('Access-Control-Allow-Credentials', 'false')
    return response

我使用 nginx 作为反向代理,所以我尝试添加我在 flask-socketio 的文档中看到的相应配置:

location /socket.io {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_pass https://my_backend_host/socket.io;
}

怎么了? 谢谢!

【问题讨论】:

  • 服务器响应 400 Bad Request 错误,因为您的前端 JavaScript 代码发送的请求不是服务器期望的格式。检查服务器日志以查看服务器记录的最终导致它响应 400 错误的消息。
  • 服务器响应 GET 请求时出现 400 错误很奇怪;对于以某种意外格式发送数据的 POST 请求,400 更为常见。因此,对 GET 请求的 400 响应很可能表明您的服务器中存在一些错误配置。无论如何,它与您的 CORS 配置无关。您收到提及“CORS 策略”的附加错误消息的唯一原因是服务器没有将 Access-Control-Allow-Origin 添加到 400 条错误响应中,而是仅将该标头添加到 200 条 OK 成功消息中。
  • 我明白了,无论如何服务器都没有显示任何错误,只有在 nginx 日志中我看到了与 ui "GET /socket.io/?EIO=3&transport=polling&t=Mb3FVjC HTTP/1.1" 400 657 中显示的相同的错误
  • 我猜你可能想考虑在搜索结果中寻找类似“socket io 400 bad request”之类的东西; google.co.jp/search?q=socket+io+400+bad+request

标签: python flask socket.io flask-socketio


【解决方案1】:

我通过将此行添加到 nginx.conf 来修复它:

proxy_set_header Origin  "";  

【讨论】:

    【解决方案2】:

    我在使用 React Flask-SocketIO 时遇到了类似的 400 问题,该问题是由于 CORS 错误造成的。 烧瓶中的以下代码解决了我的问题,

    socketio = SocketIO(app)
    socketio.init_app(app, cors_allowed_origins="*")
    

    当您选择 [websocket] only 传输时,还要确保您在服务器中使用 eventletgevent-websocketGevent 没有 websocket 支持,因此仅适用于 HTTP 轮询后备。

    【讨论】:

      【解决方案3】:

      问题是我使用http 而不是https 添加源主机。 一切正常。

      【讨论】:

      • 谢谢,我刚收到这个错误,将此行添加到 nginx 配置以删除 Origin 标头:proxy_set_header Origin "";
      • 对(以前)被否决的帖子发表评论实际上非常有用的那一刻。
      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多