link

FastAPI

FastAPI commands for managing web applications, APIs, and microservices

34 commands

Commands

34 commands available
fastapi

Install FastAPI

Install FastAPI and dependencies

pip install fastapi uvicorn
setup
installation
fastapi

Minimal Application

Create basic FastAPI app

from fastapi import FastAPI
  
  app = FastAPI()
  
  @app.get("/")
  def read_root():
      return {"Hello": "World"}
basic
setup
fastapi

Run Development Server

Start auto-reloading server

uvicorn main:app --reload
development
server
fastapi

Run Production Server

Start production server

uvicorn main:app --workers 4
production
server
fastapi

GET Route

Create GET endpoint

@app.get("/items/")
  def read_items():
      return [{"name": "Item 1"}, {"name": "Item 2"}]
routing
http
fastapi

POST Route

Create POST endpoint

@app.post("/items/")
  def create_item(item: Item):
      db.save(item)
      return item
routing
http
fastapi

Path Parameter

Extract path parameters

@app.get("/items/{item_id}")
  def read_item(item_id: int):
      return {"item_id": item_id}
parameters
routing
fastapi

Path Type Converter

Convert path parameters

@app.get("/files/{file_path:path}")
  def read_file(file_path: str):
      return {"file_path": file_path}
parameters
validation
fastapi

Query Parameter

Handle query parameters

@app.get("/items/")
  def read_items(skip: int = 0, limit: int = 10):
      return db.items[skip: skip + limit]
parameters
routing
fastapi

Optional Parameter

Declare optional parameters

@app.get("/items/{item_id}")
  def read_item(item_id: str, q: Optional[str] = None):
      return {"item_id": item_id, "q": q}
parameters
validation
fastapi

Pydantic Model

Define request body model

from pydantic import BaseModel
  
  class Item(BaseModel):
      name: str
      description: Optional[str] = None
      price: float
      tax: Optional[float] = None
model
validation
fastapi

Request Body

Extract request body

@app.post("/items/")
  def create_item(item: Item):
      return item
body
validation
fastapi

Response Model

Define output model

@app.post("/items/", response_model=Item)
  def create_item(item: Item):
      return item
response
validation
fastapi

Status Codes

Set HTTP status code

from fastapi import status
  
  @app.post("/items/", status_code=status.HTTP_201_CREATED)
  def create_item(item: Item):
      return item
response
http
fastapi

Dependency Injection

Use dependency injection

async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
      return {"q": q, "skip": skip, "limit": limit}
  
  @app.get("/items/")
  async def read_items(commons: dict = Depends(common_parameters)):
      return commons
di
architecture
fastapi

Database Session Dependency

Create database session

async def get_db():
      db = SessionLocal()
      try:
          yield db
      finally:
          db.close()
  
  @app.post("/users/")
  def create_user(user: UserCreate, db: Session = Depends(get_db)):
      db_user = User(**user.dict())
      db.add(db_user)
      db.commit()
      db.refresh(db_user)
      return db_user
di
database
fastapi

OAuth2 Password Flow

Implement authentication

from fastapi.security import OAuth2PasswordBearer
  
  oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
  
  @app.get("/users/me")
  async def read_current_user(token: str = Depends(oauth2_scheme)):
      user = decode_token(token)
      return user
security
authentication
fastapi

JWT Authentication

JSON Web Token auth

from jose import JWTError, jwt
  
  SECRET_KEY = "secret"
  ALGORITHM = "HS256"
  
  def create_access_token(data: dict):
      to_encode = data.copy()
      return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
security
jwt
fastapi

Custom Exception Handler

Handle exceptions globally

from fastapi import FastAPI, HTTPException
  
  @app.exception_handler(HTTPException)
  async def http_exception_handler(request, exc):
      return JSONResponse(
          status_code=exc.status_code,
          content={"detail": exc.detail},
      )
error
handling
fastapi

Raise HTTPException

Return error responses

from fastapi import HTTPException
  
  @app.get("/items/{item_id}")
  def read_item(item_id: str):
      item = db.get(item_id)
      if not item:
          raise HTTPException(status_code=404, detail="Item not found")
      return item
error
handling
fastapi

CORS Middleware

Enable Cross-Origin Requests

from fastapi.middleware.cors import CORSMiddleware
  
  app = FastAPI()
  
  app.add_middleware(
      CORSMiddleware,
      allow_origins=["*"],
      allow_credentials=True,
      allow_methods=["*"],
      allow_headers=["*"],
  )
middleware
security
fastapi

Custom Middleware

Create request/response middleware

@app.middleware("http")
  async def log_requests(request: Request, call_next):
      start_time = time.time()
      response = await call_next(request)
      process_time = time.time() - start_time
      logger.info(f"{request.method} {request.url} {response.status_code} {process_time:.2f}s")
      return response
middleware
logging
fastapi

Background Tasks

Run tasks after response

from fastapi import BackgroundTasks
  
  def write_notification(email: str, message=""):
      # Send email in background
      send_email(email, message)
  
  @app.post("/send-notification/{email}")
  async def send_notification(email: str, background_tasks: BackgroundTasks):
      background_tasks.add_task(write_notification, email, message="Hello!")
      return {"message": "Notification sent in background"}
background
async
fastapi

Test Client

Write API tests

from fastapi.testclient import TestClient
  
  client = TestClient(app)
  
  def test_read_main():
      response = client.get("/")
      assert response.status_code == 200
      assert response.json() == {"Hello": "World"}
testing
pytest
fastapi

SQLAlchemy Setup

Configure SQLAlchemy ORM

from sqlalchemy import create_engine
  from sqlalchemy.ext.declarative import declarative_base
  from sqlalchemy.orm import sessionmaker
  
  SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
  engine = create_engine(SQLALCHEMY_DATABASE_URL)
  SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  Base = declarative_base()
database
orm
fastapi

Database Migrations

Use Alembic for migrations

# Initialize Alembic
  alembic init migrations
  
  # Create new migration
  alembic revision --autogenerate -m "Add users table"
  
  # Apply migrations
  alembic upgrade head
database
migrations
fastapi

File Upload

Handle file uploads

from fastapi import File, UploadFile
  
  @app.post("/upload/")
  async def upload_file(file: UploadFile = File(...)):
      contents = await file.read()
      save_file(file.filename, contents)
      return {"filename": file.filename}
file
upload
fastapi

File Download

Serve static files

from fastapi.staticfiles import StaticFiles
  
  app.mount("/static", StaticFiles(directory="static"), name="static")
file
download
fastapi

WebSocket Endpoint

Create WebSocket route

from fastapi import WebSocket
  
  @app.websocket("/ws")
  async def websocket_endpoint(websocket: WebSocket):
      await websocket.accept()
      while True:
          data = await websocket.receive_text()
          await websocket.send_text(f"Message: {data}")
websocket
realtime
fastapi

Customize Documentation

Modify API docs

app = FastAPI(
      title="My API",
      description="API for my application",
      version="0.1.0",
      openapi_url="/api/v1/openapi.json",
      docs_url="/docs",
      redoc_url="/redoc",
  )
documentation
openapi
fastapi

Dockerfile

Create Docker container

FROM python:3.9
  
  WORKDIR /app
  COPY requirements.txt .
  RUN pip install -r requirements.txt
  COPY . .
  
  CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
deployment
docker
fastapi

Enable HTTPS

Configure SSL/TLS

uvicorn main:app --ssl-keyfile key.pem --ssl-certfile cert.pem
deployment
security
fastapi

Response Caching

Cache endpoint responses

from fastapi_cache import FastAPICache
  from fastapi_cache.backends.redis import RedisBackend
  from fastapi_cache.decorator import cache
  
  @app.on_event("startup")
  async def startup():
      redis = aioredis.from_url("redis://localhost")
      FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache")
  
  @app.get("/")
  @cache(expire=60)
  async def index():
      return dict(hello="world")
performance
caching
fastapi

Custom Route Class

Create advanced routes

from fastapi.routing import APIRoute
  
  class CustomRoute(APIRoute):
      def get_route_handler(self):
          original_route_handler = super().get_route_handler()
          
          async def custom_route_handler(request):
              # Pre-processing
              response = await original_route_handler(request)
              # Post-processing
              return response
              
          return custom_route_handler
  
  app = FastAPI()
  app.router.route_class = CustomRoute
advanced
routing