如何让Flask应用不再抛出404错误?已配置处理器仍报错
Flask 404错误处理器正常工作但仍输出NotFound堆栈,如何阻止?
问题描述
我在Flask应用中配置了如下404错误处理器:
@app.errorhandler(404) def handle_not_found_error(exc): err_code = util.generate_uuid()[:6] app.logger.error(f"Error code: {err_code}") app.logger.exception(exc) response = { "message": "PATH_NOT_FOUND", "status": 404, "errors": { "type": "PATH_NOT_FOUND", "reason": ( "{} is not a valid path. " "Please check the URL and try again. " "Error code: {}" ).format( request.path, err_code ), } } # 创建自定义JSON响应 return make_response(response, 404)
该处理器可正常捕获NotFound错误并返回预期的JSON响应,但每次出现404错误时仍会输出如下堆栈跟踪信息:
Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 1820, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 1785, in dispatch_request self.raise_routing_exception(req) File "/usr/local/lib/python3.11/site-packages/flask/app.py", line 1767, in raise_routing_exception raise request.routing_exception # type: ignore ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/flask/ctx.py", line 351, in match_request result = self.url_adapter.match(return_rule=True) # type: ignore ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/werkzeug/routing/map.py", line 655, in match raise NotFound() from None werkzeug.exceptions.NotFound: 404 Not Found: The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again. 192.168.65.1 - - [21/Apr/2025:03:19:30 +0000] "GET /trading/iday-ita/ HTTP/1.1" 404 183 "-" "PostmanRuntime/7.43.0" "-"
想知道是否可以阻止该堆栈信息的输出?
解决方案
1. 替换logger.exception为logger.error
你看到的堆栈跟踪是由代码中的app.logger.exception(exc)触发的——这个方法的设计就是自动记录ERROR级别的日志并附带完整的异常堆栈,哪怕错误已经被处理器捕获。
如果不需要输出堆栈,只需要记录错误代码和异常信息,把这行替换为:
app.logger.error(f"Error code: {err_code}, 404错误路径: {request.path}")
2. (可选)调整Flask日志级别
如果应用日志级别设置为DEBUG,Flask可能会输出额外的路由调试信息。可以在应用初始化时把日志级别调整为INFO或ERROR,减少冗余输出:
import logging app.logger.setLevel(logging.INFO)
3. 确认错误处理器的注册方式
确保你的错误处理器针对werkzeug.exceptions.NotFound正确注册(Flask的@app.errorhandler(404)已默认关联该异常,但显式指定可避免潜在问题):
from werkzeug.exceptions import NotFound @app.errorhandler(NotFound) def handle_not_found_error(exc): # 你的处理逻辑
完成以上修改后,404错误会被正常处理并返回JSON响应,同时不会再输出多余的堆栈跟踪信息。
内容的提问来源于stack exchange,提问作者Sultan Fahrezy
相关产品推荐
相关产品推荐

