Flask-SocketIO和400错误请求

时间:2019-03-03 10:09:41

标签: python flask socket.io cors flask-socketio

我正在运行带有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;
}

怎么了? 谢谢!

2 个答案:

答案 0 :(得分:9)

我在React Flask-SocketIO上遇到了类似的400问题,该问题是由于CORS错误引起的。 flask中的以下代码解决了我的问题,

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

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

答案 1 :(得分:0)

问题是我将原始主机添加为http而不是https。 一切正常。