Docker部署的Flask应用提交POST请求时出现404错误求助
Docker部署的Flask应用提交POST请求时出现404错误求助
嘿,我来帮你排查这个404的问题!先梳理下整个请求链路:你的前端表单提交到/api/data,Nginx负责代理/api/开头的请求到后端Flask服务,但路径映射的配置错误是导致404的核心原因。
问题根源拆解
先看你的Nginx配置片段:
location /api/ { proxy_pass http://backend:5000/; proxy_http_version 1.1; proxy_set_header Host $host; }
当用户点击提交按钮时,浏览器发送的请求路径是/api/data。按照Nginx的匹配规则,location /api/会把请求路径中的/api/替换成proxy_pass末尾的斜杠/,所以实际转发到后端的请求路径变成了http://backend:5000/data。
但你的后端Flask定义的路由是:
@app.route('/api/data', methods=['POST'])
后端根本没有/data这个路由,自然就返回404了!
两种可行的修复方案
方案1:调整Nginx代理配置(推荐)
修改Nginx的proxy_pass,去掉末尾的斜杠,这样Nginx会完整保留原请求的路径前缀:
location /api/ { proxy_pass http://backend:5000; # 移除最后的/ proxy_http_version 1.1; proxy_set_header Host $host; }
调整后,/api/data的请求会被转发到http://backend:5000/api/data,正好匹配后端的路由规则。
方案2:修改后端Flask路由
如果不想改动Nginx配置,可以把后端的路由前缀去掉,让它匹配Nginx转发后的路径:
@app.route('/data', methods=['POST']) # 将/api/data改为/data def receive_data(): input_text = request.form.get('inputText') if not input_text: return "Fehlender 'inputText' im Formular.", 400 # 后续逻辑保持不变...
这样Nginx转发过来的/data请求就能正确匹配后端路由了。
额外的小检查点
- 确认你的后端Flask应用确实运行在5000端口(和Nginx配置里的
backend:5000对应),并且所有Docker容器都处于同一个Docker网络中,保证容器间能正常通信。 - 你的表单使用默认的
application/x-www-form-urlencoded编码,后端用request.form.get('inputText')获取数据是正确的,这部分没有问题。
按照上面的方法调整后,应该就能解决404的问题啦!
备注:内容来源于stack exchange,提问作者julixw
相关产品推荐
相关产品推荐

