You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:53:09