Ninja框架PUT方法使用UploadedFile时提示profile_in字段缺失
解决Ninja框架PUT方法中multipart/form-data请求的422错误
你遇到的问题是Ninja框架在处理PUT类型的multipart/form-data请求时,无法自动解析profile_in这个JSON格式字段,导致返回422错误提示字段缺失。以下是两种可行的解决方案:
方案一:修正请求中的字段类型声明
在curl请求里,给profile_in字段显式指定Content-Type: application/json,告诉服务器该字段是JSON格式。修改后的curl命令如下:
curl -X 'PUT' \ 'http://127.0.0.1:8000/api/profile/edit_profile' \ -H 'accept: application/json' \ -H 'Authorization: Bearer <My Token>' \ -H 'Content-Type: multipart/form-data' \ -F 'img=@IMG_20220425_094322_906.JPG;type=image/jpeg' \ -F 'profile_in={ "name": "Hassan", "title": "Web", "bio": "string", "skills": [ { "name": "Django" }, { "name": "HTML/CSS" } ] };type=application/json'
方案二:调整PUT路由的参数定义
在Ninja的PUT路由中,给profile_in参数添加Body装饰器,显式指定其解析规则,确保框架能正确识别multipart中的JSON字段。修改后的PUT方法代码如下:
from ninja import Body @profile_controller.put("edit_profile", response={200: ProfileSchemaOut, 404: MessageOut, 400: MessageOut, }, auth=CustomAuth(), ) def edit_profile(request, profile_in: ProfileSchemaIn = Body(...), img:Optional[UploadedFile]=File(None)): # 你的业务逻辑代码
问题原因说明
Ninja底层基于Starlette/FastAPI,默认情况下对POST请求的multipart/form-data会自动尝试解析JSON格式的字段,但PUT请求的处理逻辑存在差异,需要显式声明字段类型或调整参数解析规则,才能正确将profile_in映射到对应的Schema类。
内容的提问来源于stack exchange,提问作者Hassan Ammar
相关产品推荐
相关产品推荐

