Flask应用本地POST请求正常,生产服务器返回默认页面故障排查
问题分析与解决方案
返回的HTML内容是主机服务商的默认跳转页面,说明你的AJAX请求根本没到达Flask应用,而是被服务器的默认Web配置拦截了。以下是排查和解决方向:
1. 端口占用与权限问题
你用Waitress监听80端口,但生产服务器上80端口通常被Apache、Nginx这类默认Web服务占用,或者普通用户没有权限绑定1-1024范围内的特权端口。
- 临时测试:把端口改成非特权端口(比如5000),重启Waitress后直接访问
http://你的服务器IP:5000测试接口,如果能正常返回数据,说明是端口问题。 - 长期解决:
- 尽量避免直接用root权限启动Waitress暴露端口;
- 配置Nginx反向代理,让Nginx监听80端口,把请求转发到Waitress的监听端口(比如5000);
- 改用uWSGI配合Nginx的标准生产部署方式。
2. 服务器站点配置错误
如果你的服务器用了cPanel、Plesk这类面板,默认会把域名指向主机的默认网页目录(比如public_html),而不是你的Flask应用。
- 解决:在面板中配置反向代理规则,将域名的所有请求转发到Waitress监听的端口;或者将Flask应用部署为WSGI应用,绑定到站点的WSGI入口。
3. 请求路径不匹配
如果你的Flask应用部署在域名的子路径下(比如http://yourdomain.com/app),但AJAX请求的url: '/'会指向域名根目录,也就是主机的默认页面。
- 解决:修改AJAX的请求路径为应用的实际路径,比如
url: '/app/',或者配置服务器将根路径的请求转发到你的Flask应用。
额外提醒:SQL注入风险
你的代码中直接用字符串拼接SQL语句:
channels = sql_maria.query(f"CALL `search_channels`('" + query + "')")
这存在严重的SQL注入漏洞,必须改成参数化查询,比如:
channels = sql_maria.query("CALL `search_channels`(%s)", (query,))
具体语法根据你使用的数据库库调整,避免用户输入恶意SQL破坏数据库。
内容的提问来源于stack exchange,提问作者okkko
相关产品推荐
相关产品推荐

