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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:12:36