【发布时间】: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