部署Flask应用至Heroku时遭遇奇怪的is_xhr属性错误
排查与解决思路
首先,这个错误的核心原因很明确:Werkzeug 2.0及以上版本移除了request.is_xhr属性,而你的Flask版本在调用jsonify时仍然尝试访问这个已被移除的属性。本地测试正常是因为你本地的Flask/Werkzeug版本较低,还保留了这个属性,但Heroku默认会安装最新兼容的依赖版本,导致了版本兼容问题。
下面是具体的排查方向和解决方法:
一、排查方向
- 检查依赖版本差异:对比本地和Heroku上的Flask、Werkzeug版本。你可以在本地运行
pip list查看版本,在Heroku上通过heroku run pip list命令查看远程环境的依赖版本,确认是不是因为Heroku安装了更高版本的Werkzeug导致的问题。 - 确认
requirements.txt的版本锁定情况:如果你的requirements.txt里没有指定Flask或Werkzeug的具体版本,Heroku会自动安装最新的稳定版,这很可能就是本地和线上环境不一致的原因。
二、解决方法
你有几个可行的修复方案,按推荐程度排序:
1. 升级Flask到2.0及以上版本
Flask 2.0+已经修复了这个问题,它的jsonify方法不再依赖request.is_xhr属性。你只需要在requirements.txt里指定:
Flask>=2.0.0
然后重新部署到Heroku即可。这是最推荐的方案,因为它能让你使用最新的功能和安全补丁。
2. 锁定Werkzeug到1.x版本
如果你暂时不想升级Flask,可以把Werkzeug的版本锁定在1.x系列(这个系列还保留request.is_xhr属性)。在requirements.txt里添加:
Werkzeug<2.0.0
这样Heroku就会安装兼容的旧版本Werkzeug,避免触发这个错误。
3. 替换jsonify的调用方式
作为临时 workaround,你可以手动构造JSON响应,绕过Flask原生的jsonify:
from flask import Response import json # 替换原来的jsonify调用 return Response( json.dumps({ 'keyword_data' : interest_mining_service.find_kws().to_json(orient='records'), 'query_results': query_result }), mimetype='application/json' )
不过这个方法只是临时解决,不如升级或锁定版本来得彻底。
最后补充一点:你提到问题似乎局限于query_results,但实际上这个错误和query_results本身无关——它是在jsonify函数内部检查请求属性时触发的,只是刚好在处理这个字段时暴露出来而已。
内容的提问来源于stack exchange,提问作者Tom Jackson
相关产品推荐
相关产品推荐

