FastAPI中GET/POST正常但PUT/DELETE请求无法运行问题求解
FastAPI PUT/DELETE请求失效修复方案
你的PUT、DELETE接口无法正常运行,是代码存在语法错误、参数声明缺失、逻辑错误三类问题,逐个修复即可。
核心错误点
- 路由路径语法错误:两个版本的DELETE路由路径
/{full_name、/{student_full_name均缺少路径参数的闭合右花括号},FastAPI无法正确识别路由规则 - 路径参数未声明接收:PUT路由路径中定义了
{student_name}路径参数,但函数参数列表未声明该参数,FastAPI启动/请求时会直接抛出参数缺失错误;DELETE路由存在同样问题 - 表单参数未正确声明:直接在函数参数列表写参数名时,FastAPI默认将其识别为URL查询参数,无法接收表单提交的字段值,需要显式用
Form()标记表单参数 - 业务逻辑错误:第二版PUT路由写死路径为
/full_name,没有预留动态路径参数位置;遍历学生字典时直接访问键的citizenship属性(字典遍历默认返回的是字符串键,如student_1,不存在该属性);更新、删除逻辑完全缺失或写反 - 类型不匹配:存储的
citizenship字段为整数类型,PUT接口中错误声明为字符串类型,会导致值匹配失败
修正后完整可运行代码
from fastapi import FastAPI, Form app = FastAPI() Student = { 'student_1': {'full_name': 'Sarita Banjara', 'address': 'panauti', 'dob': 'dec 13 2001', 'citizenship': 12456}, 'student_2': {'full_name': 'Sajana Gurung', 'address': 'pokhara', 'dob': 'jun 07 2001', 'citizenship': 13457}, 'student_3': {'full_name': 'Mahendra Wagle', 'address': 'banepa', 'dob': 'aug 25 2001', 'citizenship': 14258}, 'student_4': {'full_name': 'Bishal Jung', 'address': 'santinagar', 'dob': 'nov 20 2001', 'citizenship': 15987}, 'student_5': {'full_name': 'Aayush Maskey', 'address': 'gaushala', 'dob': 'dec 23 1990', 'citizenship': 24356}, } # 查询所有学生 @app.get("/") async def read_all_student(): return Student # 新增学生 @app.post("/") async def create_new_entry( student_full_name: str = Form(), student_address: str = Form(), student_dob: str = Form(), student_citizenship: int = Form() ): current_student_name = 0 if len(Student) > 0: for student in Student: x = int(student.split('_')[-1]) if x > current_student_name: current_student_name = x new_student_key = f'student_{current_student_name + 1}' Student[new_student_key] = { 'full_name': student_full_name, 'address': student_address, 'dob': student_dob, 'citizenship': student_citizenship } return Student[new_student_key] # 更新指定学生信息 @app.put("/{student_key}") async def update_student( student_key: str, student_full_name: str = Form(), student_address: str = Form(), student_dob: str = Form(), student_citizenship: int = Form() ): if student_key not in Student: return {"error": f"学生{student_key}不存在"} Student[student_key] = { 'full_name': student_full_name, 'address': student_address, 'dob': student_dob, 'citizenship': student_citizenship } return Student[student_key] # 删除指定学生 @app.delete("/{student_key}") async def delete_student(student_key: str): if student_key not in Student: return {"error": f"学生{student_key}不存在"} deleted_student = Student.pop(student_key) return {"message": "删除成功", "deleted_student": deleted_student, "remaining": Student}
PyCharm中curl调试示例
启动服务后(默认地址为http://127.0.0.1:8000),可以直接在PyCharm的终端执行以下命令测试四类请求:
- GET查询所有学生:
curl http://127.0.0.1:8000/ - POST新增学生:
curl -X POST http://127.0.0.1:8000/ -d "student_full_name=测试用户&student_address=测试地址&student_dob=jan 01 2000&student_citizenship=99999" - PUT更新student_1的信息:
curl -X PUT http://127.0.0.1:8000/student_1 -d "student_full_name=更新后名字&student_address=更新后地址&student_dob=jan 01 2024&student_citizenship=11111" - DELETE删除student_5:
curl -X DELETE http://127.0.0.1:8000/student_5
测试时也可以直接访问FastAPI自带的Swagger文档
http://127.0.0.1:8000/docs,页面会自动生成所有接口的调试表单,不需要手动拼接curl命令。
内容的提问来源于stack exchange,提问作者Mahendra Wagle
相关产品推荐
相关产品推荐

