使用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
相关产品推荐
相关产品推荐

