FastAPI Dependency Injection: The Magic Trick You Actually Need
How to make your code reusable, testable, and clean without pulling your hair out.
“Dependency Injection” (DI) sounds like something you’d hear at an Enterprise Java Architecture Recovery Group meeting. It sounds scary. It sounds complex.
In FastAPI, it’s… surprisingly simple. And it’s the killer feature you didn’t know you needed.
The Problem: Spaghetti Dependencies
Imagine you have 10 routes, and all of them need to:
- Connect to the database.
- Get the current user from a token.
- Check if the user has permissions.
In a lesser framework, you might write a decorator. Or copy-paste 15 lines of code into every endpoint. (Don’t lie, I know you do it).
The Solution: Depends
FastAPI gives you Depends.
First, you define a function that does the logic:
async def get_current_user(token: str = Header(...)):
# ... magic to validate token ...
return user
Then, you just… ask for it in your route.
@app.get("/items/")
async def read_items(user: User = Depends(get_current_user)):
return {"user": user.username}
That’s it. FastAPI sees Depends, runs get_current_user, handles any errors (like 401 Unauthorized), and injects the result into user.
It Gets Better: Nested Dependencies
What if get_current_user needs a database connection?
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
async def get_current_user(db: Session = Depends(get_db), token: str = Header(...)):
# use db to find user...
You can chain them! read_items needs user, which needs db. FastAPI figures out the graph and executes it in order.
Testing Nirvana
Here’s the kicker. When you write tests, you can override these dependencies.
app.dependency_overrides[get_db] = override_get_db
No patching modules. No gross mocks. Just swap out the dependency logic and run your test.
Conclusion
FastAPI’s DI system isn’t just about “best practices.” It’s about writing less code. And writing less code means fewer places for bugs to hide.
Embrace the Depends. Your future self (who has to debug this mess) will thank you.