在Flask中能否在单个错误处理函数绑定多个状态码以减少重复代码?
Flask多状态码复用错误处理函数实现方案
方案1:堆叠装饰器(最直观)
直接为同一个处理函数叠加多个app_errorhandler装饰器,每个装饰器对应一个目标状态码:
@error.app_errorhandler(400) @error.app_errorhandler(401) @error.app_errorhandler(402) @error.app_errorhandler(403) @error.app_errorhandler(429) def error_4xx(error): message = error.description logger.info('post request fail : {}'.format(message)) return make_response(jsonify({}), error.status_code)
该方案逻辑清晰无额外封装,适合状态码数量不多的场景。
方案2:批量注册(适合多状态码场景)
如果需要处理的状态码数量较多,可以将状态码存为列表,循环注册同一个处理函数:
# 定义通用4xx错误处理逻辑 def error_4xx(error): message = error.description logger.info('post request fail : {}'.format(message)) return make_response(jsonify({}), error.status_code) # 批量注册所有需要复用该逻辑的状态码 target_codes = [400, 401, 402, 403, 429] for code in target_codes: error.app_errorhandler(code)(error_4xx)
后续新增状态码只需往target_codes列表中添加对应值即可,无需修改核心处理逻辑。
方案3:全4xx错误自动适配(无需枚举状态码)
如果需要覆盖所有4xx类错误,可直接注册HTTP异常基类的处理函数,自动匹配所有4xx状态码:
from werkzeug.exceptions import HTTPException @error.app_errorhandler(HTTPException) def handle_all_http_error(error): # 仅处理4xx类错误 if 400 <= error.code < 500: message = error.description logger.info('post request fail : {}'.format(message)) return make_response(jsonify({}), error.status_code) # 非4xx错误抛出,走原有处理逻辑 raise error
内容的提问来源于stack exchange,提问作者lejun
相关产品推荐
相关产品推荐

