Apache下WSGI路由失效求助:Flask接口无法响应请求
在Raspbian Linux系统的Apache 2环境中,使用Flask结合WSGI部署可接收POST请求的接口。独立运行cfg.wsgi(执行python cfg.wsgi)时,curl能正常处理GET和POST请求,但部署到Apache后,访问/watchdog.cfg返回“404 Not Found”。已确认Apache已加载该.wsgi文件(错误日志及调试输出可证),但路由函数未被调用。
Apache配置
<VirtualHost *:80> DocumentRoot /home/http/ WSGIScriptAlias /watchdog.cfg /home/http/cfg.wsgi <Directory /home/http> AllowOverride none Require all granted </Directory> </VirtualHost>
cfg.wsgi代码
from flask import Flask, request, send_file from os import path FILE_NAME = 'watchdog.cfg' application = Flask(__name__) @application.route('/' + FILE_NAME, methods=['GET', 'POST']) def cfg(): file_path = '/home/http/' + FILE_NAME; if request.method == 'POST': jsonString = request.json with open(file_path, 'w') as f: f.write(jsonString) return "File updated successfully.", 200 elif request.method == 'GET': if path.exists(file_path): return send_file(file_path, mimetype='application/json') else: return "File not found.", 404 if __name__ == '__main__': application.run(host='0.0.0.0', port=80)
问题原因及修复方法
核心原因
WSGIScriptAlias已经将/watchdog.cfg路径映射到cfg.wsgi应用,但Flask路由里又定义了/' + FILE_NAME(即/watchdog.cfg),导致实际传递给Flask的请求路径为空(Apache已经截取了/watchdog.cfg部分),而Flask中没有匹配空路径的路由,因此返回404。本质是路由层级重复。
修复方案(二选一)
修改Flask路由为根路径(推荐)
将Flask的路由改为/,因为WSGI已经完成了/watchdog.cfg到应用的映射,此时Flask的根路径就对应外部访问的/watchdog.cfg:@application.route('/', methods=['GET', 'POST']) def cfg(): # 原函数逻辑保持不变修改后重启Apache,访问
/watchdog.cfg即可正常触发路由函数。调整Apache的WSGIScriptAlias映射
若想保留Flask原路由,可将WSGIScriptAlias的映射路径改为根目录,让所有根路径下的请求转发给cfg.wsgi:WSGIScriptAlias / /home/http/cfg.wsgi此时访问
/watchdog.cfg会匹配Flask中的路由,但该虚拟主机下的所有请求都会指向这个Flask应用,需根据实际需求判断是否适用。
额外检查
- 确保
/home/http/watchdog.cfg文件存在,且Apache进程(通常为www-data用户)对该文件及所在目录有读写权限,避免后续出现权限相关错误。 - 修改配置后重启Apache服务:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者Rob

