FastAPI , ошибка запроса PUT
Всем здравствуйте. Появляется ошибка 500 при изменении данных, запроc PUT. причем код работает. при получении списка видно что изменения есть. все остальное работает. спасибо заранее.
import logging
import uvicorn
from fastapi import FastAPI, HTTPException
from typing import Optional
from pydantic import BaseModel
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = FastAPI()
class User(BaseModel):
id: int
name: str
email: str
password: str
class UserInput(BaseModel):
name: str
email: str
password: str
users = []
@app.get("/users/")
async def get_users(): # Маршрут для получения списка задач (метод GET).
logger.info('Отработан GET запрос на получение списка пользователей.')
return users
@app.get("/users/{id}")
async def read_user(id: int):
if len(users)<id:
raise HTTPException(status_code=404, detail="User not found")
logger.info('Отработан GET запрос на получение одного пользователя.')
return users[id-1]
@app.post("/users/", response_model=list[User]) # Маршрут для добавления нового пользователя (метод POST)
async def new_user(user: UserInput):
user = User(
id=len(users) + 1,
name=user.name,
email=user.email,
password=user.password
)
users.append(user)
logger.info('Отработан POST запрос. Пользователь успешно добавлен.')
return users
@app.put("/users/{id}", response_model=UserInput)
async def update_user(id: int, new_user: UserInput):
#a = len(users)
#print(len(users) , id)
#logger.info('Длина списка пользователей {a}. id ={id}.')
if len(users)<id:
raise HTTPException(status_code=404, detail="User not found")
for user in users:
if user.id == id:
user.name = new_user.name
user.email = new_user.email
user.password = new_user.password
return f'Пользователь {id} изменен'
logger.info('Отработан PUT запрос на изменение пользователя {id}.')
@app.delete("/users/{id}", response_model=str)
async def delete_task(id: int): # , new_user: UserInput
if len(users)<id:
raise HTTPException(status_code=404, detail="User not found")
for user in users:
if user.id == id:
users.remove(user)
return f'Пользователь {id} удален'
logger.info('Отработан DELETE запрос на удаление пользователя {id}.')
"""основа"""
if __name__ == '__main__':
uvicorn.run("task_sem5:app", host="127.0.0.1", port=8000, reload=True)
пишу в VSCode. В терминале такое:
fastapi.exceptions.ResponseValidationError: 1 validation errors:
{'type': 'model_attributes_type', 'loc': ('response',), 'msg': 'Input should be a valid dictionary or object to extract fields from', 'input': 'Пользователь 3 изменен', 'url': 'https://errors.pydantic.dev/2.5/v/model_attributes_type'}
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
В качестве возвращаемого значения
@app.put("/users/{id}", response_model=UserInput)
явно указан UserInput
class UserInput(BaseModel):
name: str
email: str
password: str
Однако возвращается просто строка f'Пользователь {id} изменен'
В связи с этим происходит ошибка:
'Input should be a valid dictionary or object to extract fields from'
'input': 'Пользователь 3 изменен'