Создайте RESTful API с помощью Python 3 и FastAPI
В этой статье мы создадим простой RESTful API, используя Python 3 и FastAPI.
Но что такое FastAPI?
FastAPI — это современная, быстрая (высокопроизводительная) веб-инфраструктура для создания API с помощью Python 3.6+ на основе стандартных подсказок типов Python.
Для начала давайте импортируем необходимые модули и классы:
pip3 install fastapi uvicorn
Теперь импорт:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
from uuid import UUID, uuid4
- FastAPI из пакета
fastapi
для создания нашего веб-приложения. - HTTPException для обработки ответов об ошибках.
- BaseModel от
pydantic
для проверки данных и управления настройками с использованием аннотаций типов Python. - Optional из
typing
для обозначения необязательных полей. - UUID и uuid4 для генерации и работы с универсально уникальными идентификаторами.
Определение моделей данных
Мы определяем модель Pydantic с именем Item
, которая представляет структуру данных элемента в нашем API. Эта модель включает поля для name
, description
, price
и on_offer
, причем description
является необязательным, а для on_offer
по умолчанию установлено значение False
.
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
on_offer: bool = False
Экземпляр приложения FastAPI и данные в памяти
app = FastAPI()
items = {}
Мы создаем items = {}
, чтобы сохранить элементы в памяти для нашего теста.
RESTful операции
Теперь перейдем к созданию наших операций по сохранению items
. Для этого мы создадим RESTfull API с функциями публикации, размещения, получения и удаления:
Начиная с post
:
@app.post("/items/", response_model=Item)
async def create_item(item: Item):
item_id = uuid4()
items[item_id] = item
return item
Этот код создаст новый элемент с uuid
для создания индекса.
Далее давайте создадим два метода: один для вывода списка всех элементов, а другой для перечисления по идентификатору:
@app.get("/items/", response_model=dict)
async def read_items():
return items
@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: UUID):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return items[item_id]
Следующим шагом будут методы обновления и удаления:
@app.put("/items/{item_id}", response_model=Item)
async def update_item(item_id: UUID, item: Item):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
items[item_id] = item
return item
@app.delete("/items/{item_id}", response_model=Item)
async def delete_item(item_id: UUID):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return items.pop(item_id)
А теперь приступим к тестированию. Для этого в вашем терминале введите следующую команду:
uvicorn main:app --reload
Эта команда создаст сервер на порту 8000.
Теперь, чтобы создать новый элемент, мы можем использовать этот завиток ниже:
import requests
import json
url = "localhost:8000/items"
payload = json.dumps({
"name": "Example",
"description": "This is an example description for the item.",
"price": 10.99,
"on_offer": False
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
И откройте localhost:8000/docs
и проверьте свои конечные точки с помощью Swagger.