Flask 应用程序无一例外地引发 500 错误

Posted

技术标签:

【中文标题】Flask 应用程序无一例外地引发 500 错误【英文标题】:Flask app raises a 500 error with no exception 【发布时间】:2013-08-06 06:21:27 【问题描述】:

一段时间以来,我一直在 Flask 中反对这种方法,虽然我现在似乎正在取得进展,但我刚刚发生了一些让我困惑不已的事情。这是我正在调用的方法:

@app.route('/facedata/<slug>', methods=["POST"])
def facedata(slug):
    if request.method == "POST":
        try:
            post = Post.objects.get_or_404(slug=slug)
            data = [float(item) for item in request.form.getlist('emotions[]')]
            post.face_data.append(data)
            post.save()
        except:
            traceback.print_exc(file=sys.stdout)

很长一段时间以来,我都在这里遇到错误,然后会在 heroku 日志中捕获这些错误。目前没有错误,说明它没有到达except循环,但更糟糕的是,仍然有500个错误。具体来说,我得到的 500 个错误是:

heroku[router]: at=info method=POST path=/facedata/StripedVuitton host=cryptic-mountain-6390.herokuapp.com fwd="18.111.90.180" dyno=web.2 connect=4ms service=39ms status=500 bytes=291

我通过 AJAX 以这种方式发送这些 POST 请求:

var slug = document.getElementById("hidden-slug").getAttribute("value");
data = emotions: lRes;
$.ajax(
    type: "POST",
    data: data,
    url: document.location.origin + "/facedata/" + slug,
    success: function()
        console.log("Success!");
    
);

老实说,我只是不知道如何继续调试这个问题。毫无例外地获得回溯对我来说没有多大意义,但也许我只是天真。

如果相关的话,我在 Heroku 上的 MongoHQ 上使用 mongoengine。

【问题讨论】:

尝试在方法中添加“GET”。 我加了,没有变化。不知道为什么会有... 也许将@app.route('/facedata/&lt;slug&gt;' 更改为@app.route('/facedata/&lt;slug&gt;/ 或将url: document.location.origin + "/facedata/" + slug, 更改为url: document.location.origin + "/facedata/" + slug + "/", 会有所帮助。 @solusipse 感谢您的建议,但同样没有变化。除了将错误更改为版本不匹配的 404 你知道你甚至 GET 到了try 的开头吗? 【参考方案1】:

我遇到了同样的问题,但根本原因与 Slater 的回答中的不同:

我正在使堆栈跟踪转到的记录器静音。请确保您没有过滤掉 flask.app 记录器,这是异常堆栈跟踪所在的位置(请注意,这与烧瓶服务器的信息日志不同,名为 app.api)。

【讨论】:

【参考方案2】:

多亏了 pocoo google 小组中很棒的人,我终于明白了这一点(后来我了解到烧瓶有一个单独的列表)。首先,我需要在我的应用配置(http://flask.pocoo.org/docs/config/#builtin-configuration-values)中打开PROPAGATE_EXCEPTIONS 选项。

完成之后,我意识到没有从视图函数返回响应存在问题,Flask 将此方法解释为。既然如此,只需添加以下内容即可解决此问题:

return jsonify(result="status": 200)

try 块的末尾。我希望这对将来遇到类似情况的人有所帮助。

【讨论】:

谢谢,这很难找到。设置 app.debug = True 会处理 PROPAGATE_EXCEPTIONS 和许多有助于调试烧瓶应用程序的其他细节。 会不会和return ""一样? @JeromeJ 我不确定flask 包含的默认元数据,但我认为这里最好是明确的。 我遇到了同样的问题,但在我的情况下,PROPAGATE_EXCEPTIONS 已打开,并且异常被吞没了。我刚刚收到 500 个错误,没有相关日志。问题最终是由werkzeug.debug.DebuggedApplication 引起的。我在 init.py:app = DebuggedApplication(app, evalex=True) 中以通常的方式使用它。不知道为什么它会导致问题,但删除它的使用允许 AJAX POST 请求抛出的异常再次传播。

以上是关于Flask 应用程序无一例外地引发 500 错误的主要内容,如果未能解决你的问题,请参考以下文章

Flask 视图引发 TypeError:'bool' 对象不可调用

当我期望 500 时,Flask 返回 200 代码

在 Flask 500 错误中获取 CORS 标头

Django Admin 在生产 Heroku 中引发 500 错误

通过 Ajax 将数据发布到 Flask 时出现 500 内部服务器错误 [重复]

写入大查询时,用于云监控指标的 App Engine 引发 500 错误