You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:45:05