DEV Community

Thiago da Silva Adriano
Thiago da Silva Adriano

Posted on

8

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

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay