Python, FastAPI, 3.
Полезные ресурсы (на русском)
- Курсы по Python на Stepik: первый и второй. Сам я не проходил, но слышал, что там хорошо даётся база.
Домашнее задание
Изменить FastAPI код с прошлого занятия так, чтобы в нём использовались Pydantic модели.
Код с занятия
from uvicorn import run
from pydantic import BaseModel, Field
from fastapi import FastAPI, HTTPException
app = FastAPI()
CHATS: dict[int, list[dict]] = dict()
# Пример данных:
# CHATS = {0: [{"text": "Hello", "sender_name": "Mihail"}]}
@app.post("/chats")
async def create_chat():
new_chat_id = len(CHATS)
CHATS[new_chat_id] = []
return {"id": new_chat_id, "messages": []}
class Message(BaseModel):
text: str = Field(min_length=1, max_length=2048)
sender_name: str
@app.post("/chats/{chat_id}/messages")
async def send_message_into_chat(
chat_id: int,
message: Message,
# обратите внимание, что это fastapi достаёт Message из тела запроса (request body),
# не из query параметров, как это было раньше. это изменение поведения FastAPI связано
# именно с тем, что мы указываем Pydantic модель, а не простой тип
):
if chat_id not in CHATS:
raise HTTPException(
status_code=404,
detail="Chat not found. Please create chat before using it.",
)
# преобразуем экземпляр класса Message в обычный словарь
CHATS[chat_id].append({"text": message.text, "sender_name": message.sender_name})
return message
@app.get("/chats/{chat_id}/messages")
async def get_chat_messages(
chat_id: int,
):
if chat_id not in CHATS:
raise HTTPException(
status_code=404,
detail="Chat not found",
)
result = []
for i in CHATS[chat_id]:
# преобразуем словари в экземпляры класса Message через валидацию
message = Message.model_validate(i)
result.append(message)
return result
run(app)Можно было бы хранить в глобальной переменной CHATS сразу экземпляры класса Message. Тогда не надо было бы приводить Message к словарю, а потом обратно. Однако нам понадобится делать подобные конвертации когда мы начнём использовать базы данных: там нельзя будет сохранить целый экземпляр класса Pydantic модели.