From 60a5d5c67c69248885849bc868f381ddc56da081 Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 4 Feb 2026 13:23:07 +0800 Subject: [PATCH] refactor: replace reqparse with Pydantic models in dsl and sandbox_providers --- api/controllers/console/workspace/dsl.py | 20 ++++++----- .../console/workspace/sandbox_providers.py | 33 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/api/controllers/console/workspace/dsl.py b/api/controllers/console/workspace/dsl.py index eaf640abb0..91873d026c 100644 --- a/api/controllers/console/workspace/dsl.py +++ b/api/controllers/console/workspace/dsl.py @@ -2,7 +2,9 @@ import json import httpx import yaml -from flask_restx import Resource, reqparse +from flask import request +from flask_restx import Resource +from pydantic import BaseModel from sqlalchemy.orm import Session from werkzeug.exceptions import Forbidden @@ -16,6 +18,11 @@ from models.workflow import Workflow from services.app_dsl_service import AppDslService +class DSLPredictRequest(BaseModel): + app_id: str + current_node_id: str + + @console_ns.route("/workspaces/current/dsl/predict") class DSLPredictApi(Resource): @setup_required @@ -26,15 +33,10 @@ class DSLPredictApi(Resource): if not user.is_admin_or_owner: raise Forbidden() - parser = ( - reqparse.RequestParser() - .add_argument("app_id", type=str, required=True, location="json") - .add_argument("current_node_id", type=str, required=True, location="json") - ) - args = parser.parse_args() + args = DSLPredictRequest.model_validate(request.get_json()) - app_id: str = args["app_id"] - current_node_id: str = args["current_node_id"] + app_id: str = args.app_id + current_node_id: str = args.current_node_id with Session(db.engine) as session: app = session.query(App).filter_by(id=app_id).first() diff --git a/api/controllers/console/workspace/sandbox_providers.py b/api/controllers/console/workspace/sandbox_providers.py index 8523ac7aab..95b8d77dbf 100644 --- a/api/controllers/console/workspace/sandbox_providers.py +++ b/api/controllers/console/workspace/sandbox_providers.py @@ -1,6 +1,8 @@ import logging -from flask_restx import Resource, fields, reqparse +from flask import request +from flask_restx import Resource, fields +from pydantic import BaseModel from controllers.console import console_ns from controllers.console.wraps import account_initialization_required, setup_required @@ -11,6 +13,15 @@ from services.sandbox.sandbox_provider_service import SandboxProviderService logger = logging.getLogger(__name__) +class SandboxProviderConfigRequest(BaseModel): + config: dict + activate: bool = False + + +class SandboxProviderActivateRequest(BaseModel): + type: str + + @console_ns.route("/workspaces/current/sandbox-providers") class SandboxProviderListApi(Resource): @console_ns.doc("list_sandbox_providers") @@ -25,30 +36,24 @@ class SandboxProviderListApi(Resource): return jsonable_encoder([p.model_dump() for p in providers]) -config_parser = reqparse.RequestParser() -config_parser.add_argument("config", type=dict, required=True, location="json") -config_parser.add_argument("activate", type=bool, required=False, default=False, location="json") - - @console_ns.route("/workspaces/current/sandbox-provider//config") class SandboxProviderConfigApi(Resource): @console_ns.doc("save_sandbox_provider_config") @console_ns.doc(description="Save or update configuration for a sandbox provider") - @console_ns.expect(config_parser) @console_ns.response(200, "Success") @setup_required @login_required @account_initialization_required def post(self, provider_type: str): _, current_tenant_id = current_account_with_tenant() - args = config_parser.parse_args() + args = SandboxProviderConfigRequest.model_validate(request.get_json()) try: result = SandboxProviderService.save_config( tenant_id=current_tenant_id, provider_type=provider_type, - config=args["config"], - activate=args["activate"], + config=args.config, + activate=args.activate, ) return result except ValueError as e: @@ -73,10 +78,6 @@ class SandboxProviderConfigApi(Resource): return {"message": str(e)}, 400 -activate_parser = reqparse.RequestParser() -activate_parser.add_argument("type", type=str, required=True, location="json") - - @console_ns.route("/workspaces/current/sandbox-provider//activate") class SandboxProviderActivateApi(Resource): """Activate a sandbox provider.""" @@ -92,11 +93,11 @@ class SandboxProviderActivateApi(Resource): _, current_tenant_id = current_account_with_tenant() try: - args = activate_parser.parse_args() + args = SandboxProviderActivateRequest.model_validate(request.get_json()) result = SandboxProviderService.activate_provider( tenant_id=current_tenant_id, provider_type=provider_type, - type=args["type"], + type=args.type, ) return result except ValueError as e: