Flask路由方法内部调用自定义函数的最佳实践咨询
Flask 路由重构最佳实践方案
首先先调整你现有valid_schema函数的返回逻辑,直接返回Response对象会导致路由层还要额外解析响应内容,使用效率偏低,修改后如下:
def valid_schema(_schema, _jsondata): schema = _schema() try: data = schema.load(_jsondata) # 成功返回 数据+None的元组 return data, None except ValidationError as validation_err: # 失败返回 None+错误响应 return None, (validation_err.messages, 422)
方案1:标准分层调用(最推荐,可读性和可维护性最高)
把路由层、校验工具层、业务服务层拆分,路由层仅负责处理HTTP请求接入和响应返回,不处理具体业务逻辑:
第一步:抽离业务逻辑到service层
把数据库校验、新增报告的逻辑单独封装为服务函数,方便单元测试和其他路由复用:
def create_report_service(report_data): reportSchema = ReportSchema() # 校验报告是否已存在 exist_report = Report.query.filter_by(report_name=report_data["report_name"]).first() if not exist_report: # 新增报告 new_report = Report( report_name=report_data["report_name"], hostname=report_data["hostname"], status=report_data["status"], date=report_data["date"], nb_analysis_erreur=report_data["nb_analysis_erreur"] ) db.session.add(new_report) db.session.commit() result = reportSchema.dump(Report.query.get(new_report.reportID)) return {"message" : "Created new report" , "report" : result}, 201 else: result = reportSchema.dump(Report.query.get(exist_report.reportID)) return {"message" : "This report is already in the DB", "report" : result}, 208
第二步:重构路由代码
@qman.route('/add_report/', methods=['POST']) def create_report(): """ 新增报告接口 :return: 新建成功201,已存在208,参数校验失败422 """ json_data = request.get_json() # 调用校验工具 valid_data, err_resp = valid_schema(ReportSchema, json_data) if err_resp: return err_resp # 调用业务服务 return create_report_service(valid_data)
方案2:装饰器实现通用参数校验(适合多路由复用校验逻辑的场景)
如果有多个路由都需要做schema校验,可以把校验逻辑封装为装饰器,自动注入校验后的数据:
第一步:实现校验装饰器
def validate_schema(schema_cls): def decorator(func): def wrapper(*args, **kwargs): json_data = request.get_json() schema = schema_cls() try: valid_data = schema.load(json_data) except ValidationError as e: return e.messages, 422 # 把校验后的数据传给路由函数 kwargs['valid_data'] = valid_data return func(*args, **kwargs) return wrapper return decorator
第二步:重构路由代码
@qman.route('/add_report/', methods=['POST']) @validate_schema(ReportSchema) def create_report(valid_data): """ 新增报告接口 :param valid_data: 装饰器校验后返回的合法数据 :return: 新建成功201,已存在208,参数校验失败422 """ return create_report_service(valid_data)
核心规范建议
- 路由层保持轻量化,仅处理HTTP协议相关逻辑,不要写入业务校验、数据库操作代码
- 通用的横切逻辑(参数校验、身份鉴权、日志打点)优先用装饰器实现,减少重复代码
- 业务逻辑统一抽离到服务层,方便后续复用、单元测试,调整业务逻辑时不需要修改路由层代码
内容的提问来源于stack exchange,提问作者Tward
相关产品推荐
相关产品推荐

