DEV Community

Thiago da Silva Adriano
Thiago da Silva Adriano

Posted on

Create a RESTful API with Python 3 and FastAPI

In this article, we'll create a simple RESTful API using Python 3 and FastAPI.

But whats is FastAPI?

FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints.

First, lets go to import necessary modules and classes:

pip3 install fastapi uvicorn
Enter fullscreen mode Exit fullscreen mode

Now the imports:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
from uuid import UUID, uuid4
Enter fullscreen mode Exit fullscreen mode
  • FastAPI from the fastapi package to create our web application.
  • HTTPException to handle error responses.
  • BaseModel from pydantic for data validation and settings management using Python type annotations.
  • Optional from typing to denote optional fields.
  • UUID and uuid4 for generating and working with universally unique identifiers.

Defining Data Models

We define a Pydantic model named Item to represent the data structure of an item in our API. This model includes fields for name, description, price, and on_offer, with description being optional and on_offer defaulting to False.

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    on_offer: bool = False

Enter fullscreen mode Exit fullscreen mode

FastAPI app instance and in-memory data

app = FastAPI()
items = {}
Enter fullscreen mode Exit fullscreen mode

We create items = {} to save itens in memory to our test.

RESTful operations

Now Let's go to create our operations to save itens. To do this we'll create a RESTfull API with post, put, get and delete:

starting by post:

@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    item_id = uuid4()
    items[item_id] = item
    return item
Enter fullscreen mode Exit fullscreen mode

This code will create a new Item with uuid to create a index.

Next, lets go to create two methods, one to list all itens and other to list by id:

@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]
Enter fullscreen mode Exit fullscreen mode

Next step will be the Update and Delete methods:

@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)

Enter fullscreen mode Exit fullscreen mode

And now let's go to test. To do this, at your terminal past this command below:

uvicorn main:app --reload
Enter fullscreen mode Exit fullscreen mode

This command will create a server at port 8000.

Now to create a new Item we can use this curl below:

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)

Enter fullscreen mode Exit fullscreen mode

And open localhost:8000/docs and test your endpoints using swagger :)

Image description

Top comments (0)