fastapi中修改默认200状态码需在路由函数返回时显式指定status_code参数,如return {"msg": "ok"} → 200,return {"msg": "created"},status_code=201 → 201;httpexception用于规范错误响应,必须传status_code;response_model不影响状态码,response子类自带状态码会覆盖显式声明。

FastAPI里怎么改默认200状态码
直接在路由函数返回时加status_code参数就行,不是靠装饰器或全局配置。FastAPI会自动把返回值序列化成JSON,并用你指定的状态码响应。
- 最常用写法:
return {"msg": "ok"}→ 默认200;加status_code=201就变成创建成功 - 别写
return Response(..., status_code=404)来手动构造——除非你要返回非JSON内容,否则多余且绕路 - 如果用了
Response类,FastAPI不会自动加Content-Type: application/json,得自己设media_type="application/json"
用HTTPException主动抛错时状态码怎么定
HTTPException是控制错误响应的正路,比手动return带status更清晰,还能附带detail和headers。
- 必须传
status_code,比如raise HTTPException(status_code=404, detail="not found") -
detail可以是字符串、字典或列表,FastAPI会原样塞进JSON响应体;但别传None,会报TypeError - 注意:
HTTPException不触发异常中间件(如@app.exception_handler),除非你显式注册了对应类型处理函数
自定义响应模型时status_code会被覆盖吗
不会被覆盖,但容易误以为被覆盖——因为Pydantic模型只管字段校验和序列化,不管状态码。状态码必须显式声明。
- 写了
response_model=User,返回User(name="a"),状态码仍是默认200,除非你额外加status_code=201 - 如果返回的是
Response实例(比如FileResponse),FastAPI会忽略response_model,也忽略你写的status_code参数——它只认Response自带的状态码 - 想统一给某类接口设状态码?别依赖模型,用路径操作函数参数或依赖注入更可控
测试时发现状态码总是200,哪里漏了
大概率是忘了在测试客户端调用时检查response.status_code,或者路由函数里根本没写status_code参数,还误以为模型或返回结构能影响它。
- 用
TestClient测试时,response.status_code才是真实状态码,response.json()只是响应体 - 异步函数里用
await调用其他协程但没return?可能函数实际返回None,FastAPI会当成空响应+200 - 用了
BackgroundTasks?状态码由主函数决定,后台任务出错不会改变已发出的响应状态码
状态码不是模型或返回值推导出来的,是每个请求路径上明确写出的“契约”。漏写、错写、或被Response子类静默覆盖,都容易让API行为和文档对不上。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











