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

使用flask_apispec的use_kwargs装饰器后Flask应用POST请求崩溃如何解决

错误原因

@use_kwargs装饰器会自动完成请求参数解析、Schema校验逻辑,最终把校验后的数据注入到被装饰的视图方法中。你在AwesomeRequestSchema中定义了@post_load钩子,会返回一个MyAPI类实例,装饰器会默认将该实例作为第二个位置参数传入post方法,但你的post方法仅定义了self一个入参,因此触发参数不匹配的报错。

同时你当前代码中手动执行schema.load(request.json)的逻辑是冗余的,@use_kwargs已经完成了相同的校验转换工作,不需要重复实现。另外参数校验失败的ValidationError也不需要手动捕获,装饰器会自动返回400状态码的错误响应。

修复方案

直接修改post方法的入参定义,接收装饰器注入的MyAPI实例即可,示例修改后的代码如下:

class AwesomeAPI(MethodResource, Resource):
    @use_kwargs(AwesomeRequestSchema)
    @marshal_with(AwesomeRequestSchema, code=200, description='Something created')
    def post(self, my_api):
        """
        POST
        """
        # 直接使用注入的MyAPI实例即可,无需手动解析请求
        print(my_api.api_type)
        # marshal_with会自动将MyAPI实例按Schema序列化返回
        return my_api

如果你不需要@post_load返回自定义类实例,只需要原始的校验后字典,删除AwesomeRequestSchema中的@post_load装饰的create方法即可,此时@use_kwargs会将字段作为关键字参数注入:

class AwesomeRequestSchema(Schema):
    api_type = fields.String(required=True)

# 此时post方法写法
class AwesomeAPI(MethodResource, Resource):
    @use_kwargs(AwesomeRequestSchema)
    @marshal_with(AwesomeRequestSchema, code=200, description='Something created')
    def post(self, api_type):
        """
        POST
        """
        print(api_type)
        return {"api_type": api_type}

内容的提问来源于stack exchange,提问作者Vasyl Herman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:15:04