【问题标题】:Flask HTTPException being swallowedFlask HTTPException 被吞下
【发布时间】:2023-03-07 21:16:01
【问题描述】:

当使用before_request Flask 声明一个函数时,会吞噬 HTTPExceptions 而不是传播它们:

from flask import Flask
from werkzeug.exceptions import HTTPException

app = Flask(__name__)

@app.before_request
def f():
    raise HTTPException("This is not propagated")

@app.route('/')
def test():
    return 'This is a view'


if __name__ == '__main__':
    app.run()

控制台没有显示异常:

$ python flask_test1.py
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [02/Jun/2016 15:01:31] "GET / HTTP/1.1" 200 -

浏览器显示:

Unknown Error

This is not propagated

有办法强制吗?我需要指定的设置,还是应该与 Werkzeug HTTPExceptions 交互并引发自定义异常?

【问题讨论】:

  • 所以当您浏览到该端点时,您会看到 "This is a view" 吗?或者您是否收到 HTTP 错误代码/某些错误页面(这是预期的行为)?
  • @jonrsharpe 已编辑
  • 为什么不是你所期待的结果?这就是应该发生的事情!见werkzeug.pocoo.org/docs/0.11/exceptions

标签: python exception flask werkzeug


【解决方案1】:

可能的原因不是你不应该提高HTTPException 本身。 HTTPException 本身应该是其他异常的基类,例如BadRequestNotFound

由于HTTPException没有要返回的 HTTP 代码,因此没有此类代码被记录或发送给用户。如果您提出 NotFoundBadRequest 或 HTTPException 的任何子类,它们都可以正常工作,至少在 Flask 0.11 中:

from werkzeug.exceptions import BadRequest
@app.before_request
def f():
    raise BadRequest("This is definitely propagated")

【讨论】:

  • 但这将以完全相同的方式传播,在浏览器中显示为非 2xx 返回,而不是使程序崩溃并显示回溯。这里的问题不是 HTTPException 的使用,而是 OP 不了解这些错误应该如何工作。
猜你喜欢
  • 1970-01-01
  • 2015-06-27
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多