Shared dependencies let you reuse code for things like authentication or database access across different parts of your app. This keeps your code clean and easy to manage.
Shared dependencies across routers in FastAPI
from fastapi import FastAPI, APIRouter, Depends # Define a dependency function def common_dependency(): return "Shared value" # Create routers router1 = APIRouter(dependencies=[Depends(common_dependency)]) router2 = APIRouter(dependencies=[Depends(common_dependency)]) # Use routers in app app = FastAPI() app.include_router(router1) app.include_router(router2)
Use dependencies=[Depends(your_dependency)] when creating an APIRouter to share dependencies.
Dependencies listed here run before any route in that router.
from fastapi import APIRouter, Depends def verify_token(): # Imagine token verification here return True router = APIRouter(dependencies=[Depends(verify_token)])
from fastapi import APIRouter, Depends def get_db(): db = "db session" try: yield db finally: pass # close db router = APIRouter(dependencies=[Depends(get_db)])
This example shows two routers sharing the same dependency that could add a common header or perform a check. Both routers have routes that return simple messages.
from fastapi import FastAPI, APIRouter, Depends from fastapi.responses import JSONResponse # Dependency function async def common_header(): return {"X-Common-Header": "Value"} # Router 1 with shared dependency router1 = APIRouter(dependencies=[Depends(common_header)]) @router1.get("/items") async def read_items(): return {"message": "Items from router1"} # Router 2 with same shared dependency router2 = APIRouter(dependencies=[Depends(common_header)]) @router2.get("/users") async def read_users(): return {"message": "Users from router2"} # Create app and include routers app = FastAPI() app.include_router(router1, prefix="/r1") app.include_router(router2, prefix="/r2")
Shared dependencies run for every request to routes in that router.
You can also add dependencies globally to the FastAPI app for all routes.
Dependencies can return values or perform actions like authentication or logging.
Shared dependencies help reuse code across multiple routers.
They keep your app organized and avoid repeating code.
Use dependencies=[Depends(your_dependency)] when creating routers.
Practice
Solution
Step 1: Understand what shared dependencies do
Shared dependencies allow you to write a dependency once and apply it to many routers, avoiding repetition.Step 2: Identify the benefit in code maintenance
This reduces duplicate code and makes the project easier to maintain and update.Final Answer:
To avoid repeating the same dependency code in multiple routers -> Option DQuick Check:
Shared dependencies = avoid repetition [OK]
- Thinking shared dependencies slow down the API
- Confusing shared dependencies with path prefixes
- Believing shared dependencies disable injection
APIRouter in FastAPI?Solution
Step 1: Recall the APIRouter parameter for dependencies
The correct parameter name isdependencies, which takes a list of Depends objects.Step 2: Match the syntax to the correct option
router = APIRouter(dependencies=[Depends(common_dep)]) usesdependencies=[Depends(common_dep)], which is the correct syntax.Final Answer:
router = APIRouter(dependencies=[Depends(common_dep)]) -> Option BQuick Check:
dependencies param = correct syntax [OK]
- Using 'shared_dependencies' instead of 'dependencies'
- Passing Depends directly without a list
- Using wrong parameter names like 'dependency' or 'shared'
/items/42?
from fastapi import FastAPI, APIRouter, Depends
app = FastAPI()
def common_dep():
print("Common dependency called")
router = APIRouter(dependencies=[Depends(common_dep)])
@router.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
app.include_router(router)Solution
Step 1: Understand how dependencies run in FastAPI
Dependencies listed in the router's dependencies run for every matching request automatically.Step 2: Analyze the print statement in common_dep
Each time the endpoint is called, common_dep runs and prints "Common dependency called" once.Final Answer:
"Common dependency called" is printed once per request -> Option AQuick Check:
Router dependencies run once per request [OK]
- Thinking dependencies run multiple times per request
- Expecting no output from print statements
- Confusing async with sync dependencies causing errors
from fastapi import APIRouter, Depends
def verify_token():
pass
router = APIRouter(dependencies=Depends(verify_token))
@router.get("/secure")
async def secure_endpoint():
return {"message": "Secure"}Solution
Step 1: Check the dependencies parameter type
The dependencies parameter expects a list of Depends objects, not a single Depends instance.Step 2: Identify the correct syntax
It should be dependencies=[Depends(verify_token)] to be valid.Final Answer:
Depends should be inside a list in dependencies parameter -> Option AQuick Check:
dependencies param requires a list [OK]
- Passing Depends directly without list
- Assuming dependencies param accepts single Depends
- Ignoring syntax errors from wrong dependencies format
router_a and router_b. Which approach correctly shares the dependency without repeating code?Solution
Step 1: Understand how to share dependencies across routers
Using the dependencies parameter in APIRouter allows applying a dependency to all routes in that router.Step 2: Apply the dependency to both routers
Adding dependencies=[Depends(get_current_user)] to both router_a and router_b shares the logic without repeating it in each route.Final Answer:
Add the dependency to each router using the dependencies parameter with Depends(get_current_user) -> Option CQuick Check:
Shared dependencies via router dependencies param [OK]
- Repeating dependency code in every route
- Trying to add dependencies in FastAPI app instead of routers
- Using global variables instead of dependency injection
Ready to prove it?
Pass the test and this pattern moves unknown
