Showing posts with label Learn Python. Show all posts
Showing posts with label Learn Python. Show all posts

Monday, 22 December 2025

FastAPI Dependency Injection Explained with Examples

Dependency Injection (DI) is one of the most powerful features of FastAPI, yet it’s also one of the most confusing topics for beginners.

If you are coming from Spring Boot, you may think:

“Where is @Autowired in FastAPI?”

In this post, we’ll explain FastAPI Dependency Injection in simple terms, with real-world examples and best practices.


What Is Dependency Injection?

Dependency Injection means:

Passing required objects (dependencies) into a function instead of creating them inside the function.

Why it matters

  • Cleaner code

  • Better reusability

  • Easier testing

  • Loose coupling


Dependency Injection in FastAPI

FastAPI provides dependency injection using the Depends() function.

It allows you to:

  • Inject database connections

  • Inject authentication logic

  • Inject services

  • Share common logic across APIs


Basic Dependency Injection Example

Simple dependency function

from fastapi import Depends def get_message(): return "Hello from dependency"

Using it in an API

from fastapi import FastAPI, Depends app = FastAPI() @app.get("/hello") def hello(message: str = Depends(get_message)): return {"message": message}

📌 FastAPI automatically:

  • Calls get_message()

  • Injects the returned value

  • Manages execution order


Dependency Injection vs Normal Function Call

❌ Without DI:

@app.get("/users") def get_users(): db = create_db_connection() return db.fetch_users()

✅ With DI:

def get_db(): return create_db_connection() @app.get("/users") def get_users(db = Depends(get_db)): return db.fetch_users()

✔ Cleaner
✔ Reusable
✔ Test-friendly


Real-World Example: Database Dependency

Database session dependency

def get_db(): db = DBSession() try: yield db finally: db.close()

Injecting DB into API

@app.get("/users") def get_users(db = Depends(get_db)): return db.get_all_users()

📌 FastAPI handles:

  • Opening the DB

  • Closing the DB

  • Exception safety


Dependency Injection for Authentication

Auth dependency

def get_current_user(token: str = Depends(oauth2_scheme)): return decode_jwt(token)

Protected API

@app.get("/profile") def profile(user = Depends(get_current_user)): return user

✔ Auth logic is reusable
✔ APIs stay clean


Dependency Injection for Services (Spring Boot Style)

Service class

class UserService: def get_users(self): return ["Alice", "Bob"]

Dependency provider

def get_user_service(): return UserService()

API using service

@app.get("/users") def users(service: UserService = Depends(get_user_service)): return service.get_users()

📌 This is similar to:

@Autowired UserService userService;

Dependency Injection with Parameters

Dependencies can also accept parameters:

def common_params(limit: int = 10, offset: int = 0): return {"limit": limit, "offset": offset} @app.get("/items") def get_items(params = Depends(common_params)): return params

Great for:

  • Pagination

  • Filters

  • Query parameters


Nested Dependencies

Dependencies can depend on other dependencies:

def get_db(): ... def get_user(db = Depends(get_db)): ...

FastAPI resolves them automatically.


Dependency Injection for Testing (Huge Benefit)

Override dependency in tests

app.dependency_overrides[get_db] = get_test_db

✔ No real DB
✔ Faster tests
✔ Cleaner test setup


Common Use Cases for Dependency Injection in FastAPI

✅ Database sessions
✅ Authentication & authorization
✅ API keys
✅ Logging
✅ Configuration
✅ Feature flags


Common Mistakes to Avoid

❌ Creating DB connections inside endpoints
❌ Writing auth logic repeatedly
❌ Mixing business logic in controllers
❌ Not using DI for shared logic


FastAPI DI vs Spring Boot DI

FeatureFastAPISpring Boot
DI StyleFunction-basedAnnotation-based
Learning curveEasyMedium
FlexibilityVery highStructured
BoilerplateLowHigh

FastAPI DI is lighter, while Spring DI is more structured.


Best Practices

✔ Keep dependencies small
✔ Use DI for cross-cutting concerns
✔ Avoid heavy logic in endpoints
✔ Use DI for better testing
✔ Name dependencies clearly


Final Thoughts

FastAPI’s Dependency Injection system is:

  • Simple

  • Powerful

  • Pythonic

  • Production-ready

Once you master Depends(), your FastAPI code becomes:

  • Cleaner

  • More maintainable

  • Easier to scale


Suggested Next Reads

  • FastAPI Project Structure Best Practices

  • FastAPI Microservices Setup

  • FastAPI Authentication with JWT

  • FastAPI Interview Questions

FastAPI Microservices Setup

 Below is a real-world FastAPI microservices setup, explained step by step, and mapped to how companies actually do it in production. I’ll also relate it to Spring Boot microservices, so it’s easy to grasp.


FastAPI Microservices Setup (Production-Ready Guide)

1️⃣ What Is a FastAPI Microservices Architecture?

Instead of one large backend, you create multiple small FastAPI services, each responsible for one business capability.

Example services:

  • Auth Service

  • User Service

  • Notification Service

  • Event / Integration Service

  • Reporting Service

Each service:

  • Has its own codebase

  • Has its own database (recommended)

  • Can be deployed and scaled independently


2️⃣ High-Level Architecture

Frontend (Angular / React / Mobile) ↓ API Gateway ↓ ┌────────┬─────────┬──────────┐ | Auth | Users | Events | FastAPI services |Service | Service | Service | └────────┴─────────┴──────────┘ ↓ Databases / Queues / Caches

3️⃣ Example Microservices Folder Structure

microservices/ │ ├── api-gateway/ │ └── app/ │ └── main.py │ ├── auth-service/ │ └── app/ │ ├── main.py │ └── api/ │ ├── user-service/ │ └── app/ │ ├── main.py │ └── api/ │ ├── event-service/ │ └── app/ │ ├── main.py │ └── api/ │ ├── docker-compose.yml └── README.md

👉 Each service is a separate FastAPI app.


4️⃣ Service-to-Service Communication

Option 1: REST (Most Common)

  • HTTP calls between services

  • Use async HTTP clients (httpx)

User Service → Auth Service

Option 2: Message Queue (Recommended for scale)

  • Kafka / RabbitMQ / AWS SQS

  • Event-driven communication

Event Service → Queue → Notification Service

5️⃣ API Gateway (Very Important)

Companies use:

  • Nginx

  • Kong

  • FastAPI Gateway

Responsibilities:

  • Routing

  • Authentication

  • Rate limiting

  • Logging

Simple FastAPI Gateway Example

@app.api_route("/{path:path}", methods=["GET", "POST"]) async def proxy(path: str, request: Request): async with httpx.AsyncClient() as client: response = await client.request( request.method, f"http://user-service/{path}", headers=request.headers.raw, content=await request.body() ) return Response(response.content)

6️⃣ Authentication Strategy

Central Auth Service (Recommended)

Flow:

  1. User logs in → Auth Service

  2. JWT token issued

  3. Other services validate JWT

Each service:

  • Validates token

  • Does not store auth logic

📌 Same idea as Spring Security + JWT.


7️⃣ Database Strategy

Best practice:

  • One database per service

Examples:

  • Auth Service → PostgreSQL

  • User Service → MongoDB

  • Event Service → NoSQL / Kafka

❌ Avoid shared databases between services.


8️⃣ Async & Performance Setup

Run services using:

Gunicorn + Uvicorn workers

Example:

gunicorn app.main:app -k uvicorn.workers.UvicornWorker -w 4

9️⃣ Docker Setup (Per Service)

Dockerfile (Common for all services)

FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY app app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

🔟 docker-compose (Local Development)

version: "3.8" services: auth-service: build: ./auth-service ports: - "8001:8000" user-service: build: ./user-service ports: - "8002:8000" event-service: build: ./event-service ports: - "8003:8000"

1️⃣1️⃣ Configuration Management

Use:

  • .env files

  • Environment variables

  • Secrets manager (in prod)

Example:

AUTH_SERVICE_URL=http://auth-service:8000

1️⃣2️⃣ Logging & Monitoring

Production services include:

  • Structured logging

  • Request tracing (request ID)

  • Metrics (Prometheus)

  • Central log aggregation


1️⃣3️⃣ Scaling Strategy

  • Stateless services

  • Horizontal scaling

  • Kubernetes HPA

  • Load balancing via ingress


1️⃣4️⃣ FastAPI vs Spring Boot Microservices

AspectFastAPISpring Boot
Startup timeVery fastSlower
Resource usageLowHigher
AsyncSimpleComplex
Enterprise toolingModerateExcellent

Many companies use:

Spring Boot → Core services FastAPI → Integration & API services

1️⃣5️⃣ Common Mistakes to Avoid

❌ Sharing databases
❌ Tight coupling between services
❌ Missing API gateway
❌ Blocking calls in async routes
❌ No centralized auth


Final Thoughts

FastAPI microservices are:

  • Lightweight

  • Fast

  • Easy to scale

  • Perfect for integration-heavy systems

For someone with your background:

  • Spring Boot → Core business logic

  • FastAPI → Microservices, integrations, ML APIs

This combo is very powerful in modern architectures.

FastAPI Project Structure

 

Production Best Practices

1️⃣ Recommended Folder Structure

fastapi-app/ │ ├── app/ │ ├── main.py # Entry point (like SpringBootApplication) │ │ │ ├── core/ # Core configs (security, settings) │ │ ├── config.py # App settings (env based) │ │ ├── security.py # Auth, JWT, OAuth2 │ │ └── logging.py │ │ │ ├── api/ # API layer (Controllers) │ │ ├── v1/ │ │ │ ├── router.py # API router aggregation │ │ │ └── endpoints/ │ │ │ ├── users.py │ │ │ ├── auth.py │ │ │ └── health.py │ │ │ ├── models/ # DB models (Entities) │ │ ├── user.py │ │ └── base.py │ │ │ ├── schemas/ # Pydantic schemas (DTOs) │ │ ├── user.py │ │ └── auth.py │ │ │ ├── services/ # Business logic (Service layer) │ │ ├── user_service.py │ │ └── auth_service.py │ │ │ ├── repositories/ # DB access layer │ │ └── user_repo.py │ │ │ ├── db/ # Database setup │ │ ├── session.py │ │ └── init_db.py │ │ │ ├── middlewares/ # Custom middleware │ │ └── request_log.py │ │ │ ├── utils/ # Utilities/helpers │ │ └── date_utils.py │ │ │ └── tests/ # Unit & integration tests │ └── test_users.py │ ├── requirements.txt ├── Dockerfile ├── docker-compose.yml ├── .env └── README.md

2️⃣ Mapping to Spring Boot (So It Feels Familiar)

Spring BootFastAPI
@SpringBootApplicationmain.py
Controllerapi/endpoints
Serviceservices
Repositoryrepositories
Entitymodels
DTOschemas
application.ymlconfig.py / .env
Filtersmiddlewares

3️⃣ main.py – Application Entry Point

from fastapi import FastAPI from app.api.v1.router import api_router app = FastAPI(title="FastAPI App") app.include_router(api_router, prefix="/api/v1")

➡ Similar to:

@SpringBootApplication public class App { }

4️⃣ Router Aggregation (Like Controller Scanning)

api/v1/router.py

from fastapi import APIRouter from app.api.v1.endpoints import users, auth, health api_router = APIRouter() api_router.include_router(users.router, prefix="/users", tags=["Users"]) api_router.include_router(auth.router, prefix="/auth", tags=["Auth"]) api_router.include_router(health.router, prefix="/health", tags=["Health"])

5️⃣ Controller Layer (Endpoints)

api/v1/endpoints/users.py

from fastapi import APIRouter from app.schemas.user import UserCreate router = APIRouter() @router.post("/") def create_user(user: UserCreate): return {"message": "User created"}

6️⃣ Schema (DTO)

schemas/user.py

from pydantic import BaseModel class UserCreate(BaseModel): name: str email: str

7️⃣ Service Layer (Business Logic)

services/user_service.py

def create_user(user): # business rules here return user

8️⃣ Repository Layer (DB Access)

repositories/user_repo.py

def save(user): pass

9️⃣ Dependency Injection (FastAPI Style)

from fastapi import Depends def get_user_service(): return UserService() @router.get("/{id}") def get_user(id: int, service=Depends(get_user_service)): return service.find(id)

➡ Similar concept to @Autowired.


🔟 Environment Configuration

.env

DB_URL=mongodb://localhost:27017/app JWT_SECRET=secret

config.py

from pydantic import BaseSettings class Settings(BaseSettings): DB_URL: str JWT_SECRET: str settings = Settings()

1️⃣1️⃣ Testing Structure

tests/ ├── test_users.py └── conftest.py

Uses:

  • pytest

  • TestClient


1️⃣2️⃣ Production-Grade Tips

✅ Keep business logic out of controllers
✅ Use async DB drivers
✅ Version your APIs (/v1)
✅ Use dependency injection properly
✅ Add middleware for logging
✅ Use Docker for consistency


1️⃣3️⃣ Minimal Structure (For Small Services)

app/ ├── main.py ├── routes.py ├── schemas.py └── services.py

Use this only for small microservices.


Final Thoughts

FastAPI doesn’t force structure like Spring Boot, but teams must enforce discipline.

If you follow the above structure:

  • Code stays clean

  • Team collaboration improves

  • Scaling becomes easy

FastAPI vs Spring Boot

 

FastAPI vs Spring Boot: Which One Should You Choose?

In the world of backend development, Spring Boot has been the gold standard for years—especially in enterprise Java applications.
But recently, FastAPI has gained massive popularity in the Python ecosystem for building modern APIs.

So the big question is:

👉 FastAPI vs Spring Boot — which one is better?
👉 Should Java developers care about FastAPI?

Let’s compare them from a real-world, production perspective.


What is Spring Boot?

Spring Boot is a Java-based framework that simplifies building enterprise-grade applications.

It provides:

  • Dependency Injection

  • Security

  • Transaction management

  • Database integration

  • Production-ready tooling

Spring Boot is widely used in:

  • Banking

  • Insurance

  • Government systems

  • Large enterprises


What is FastAPI?

FastAPI is a modern Python framework designed specifically for building high-performance APIs.

It focuses on:

  • Speed

  • Simplicity

  • Automatic validation

  • Automatic documentation

FastAPI is widely used in:

  • Microservices

  • Startups

  • AI / ML platforms

  • Integration-heavy systems


Core Comparison: FastAPI vs Spring Boot

1️⃣ Language & Ecosystem

AspectFastAPISpring Boot
LanguagePythonJava
EcosystemLightweight, fastEnterprise-grade
VerbosityVery lowHigh

Verdict:
Spring Boot is structured and strict. FastAPI is flexible and fast to develop.


2️⃣ Development Speed

FastAPISpring Boot
BoilerplateMinimalHeavy
API setup timeMinutes30–60 minutes
ConfigurationVery lessExtensive

FastAPI allows teams to ship APIs much faster.


3️⃣ Performance & Concurrency

FastAPISpring Boot
Concurrency modelAsync (event loop)Thread-based
Best forIO-heavy APIsCPU-heavy logic
LatencyLowerSlightly higher

FastAPI shines in:

  • Webhooks

  • Event ingestion

  • High-concurrency APIs


4️⃣ Validation & API Contracts

FastAPISpring Boot
Request validationAutomaticAnnotations
OpenAPI specAuto-generatedManual setup
Error messagesClearVerbose

FastAPI’s validation feels like:

DTO + Validation + Swagger — without extra configuration


5️⃣ API Documentation (Major Difference)

FastAPI provides:

  • Swagger UI at /docs

  • ReDoc at /redoc

No extra setup needed.

In Spring Boot:

  • Swagger/OpenAPI requires manual configuration

  • Docs often go out of sync

📌 Frontend teams love FastAPI for this reason alone.


6️⃣ Async Support

FastAPISpring Boot
Async supportNativeWebFlux
ComplexitySimpleHigh
Learning curveEasySteep

Many Java teams avoid WebFlux due to complexity, while FastAPI makes async natural.


7️⃣ Enterprise Features

FeatureFastAPISpring Boot
SecurityGoodExcellent
TransactionsManualStrong
AOP
Dependency InjectionBasicAdvanced

Spring Boot clearly wins in enterprise governance and safety.


8️⃣ Database & ORM Support

FastAPISpring Boot
ORMSQLAlchemyHibernate
MongoDBMotorSpring Data Mongo
MaturityMediumVery High

Spring Data is more mature for large teams and long-term projects.


When to Use FastAPI?

Choose FastAPI if you are building:

  • Microservices

  • API gateways

  • Integration platforms

  • Event-driven systems

  • AI / ML APIs

  • Backend for React / Angular apps


When to Use Spring Boot?

Choose Spring Boot if you are building:

  • Enterprise systems

  • Banking or finance apps

  • Complex transactional workflows

  • Long-term systems (10–15 years lifespan)

  • Large, regulated platforms


Real-World Architecture (Very Common)

Many companies use both together:

Spring Boot → Core business logic FastAPI → API layer, integrations, ML services

This hybrid approach offers stability + speed.


Final Verdict

FastAPI is not a replacement for Spring Boot.
It is a complement.

  • Spring Boot = Enterprise backbone

  • FastAPI = Fast, modern API layer

For experienced Java developers, learning FastAPI adds a powerful new skill and opens doors to modern architectures and AI-driven systems.


Conclusion

If you want:

  • Faster development

  • Cleaner APIs

  • Better API documentation

  • Modern async architecture

👉 FastAPI is worth learning.

If you want:

  • Enterprise reliability

  • Strong governance

  • Long-term maintainability

👉 Spring Boot remains unbeatable.

Saturday, 17 June 2023

How do you learn Python from basic until you become a programmer?

Here are some tips on how to learn Python from basic until you become a programmer:

  1. Set realistic goals. Don't expect to become a master programmer overnight. It takes time and effort to learn a new programming language. Start by setting small, achievable goals for yourself. For example, you could start by learning the basics of Python, such as variables, data types, and operators. Once you have mastered the basics, you can move on to more advanced topics, such as functions, classes, and modules.
  2. Find a good learning resource. There are many great resources available to help you learn Python. Books, online tutorials, and coding bootcamps can all be helpful. It's important to find a resource that fits your learning style and budget.
  3. Practice regularly. The best way to learn Python is to practice regularly. Try to set aside some time each day to work on your Python skills. You can practice by writing your own code, working on coding challenges, or contributing to open source projects.
  4. Don't be afraid to ask for help. If you get stuck, don't be afraid to ask for help. There are many online forums and communities where you can get help from other Python developers. You can also hire a Python tutor or take a coding bootcamp.
  5. Be patient and persistent. Learning Python takes time and effort. Don't get discouraged if you don't understand something right away. Keep practicing and you will eventually get the hang of it.

Here are some additional tips for becoming a programmer:

  • Build projects. One of the best ways to learn Python is to build projects. This will help you to apply what you have learned and to develop your problem-solving skills.
  • Contribute to open source projects. This is a great way to get involved in the Python community and to learn from other developers.
  • Attend meetups and conferences. This is a great way to meet other Python developers and to learn about new trends in Python programming.
  • Read books and articles about Python. This is a great way to stay up-to-date on the latest Python news and developments.
  • Get involved in the Python community. There are many ways to get involved in the Python community, such as attending meetups, participating in online forums, and contributing to open source projects. Getting involved in the community is a great way to learn from other developers and to get help when you need it.

Learning Python can be a challenging but rewarding experience. By following these tips, you can increase your chances of success.