Dependencies with parameters let you reuse code that needs extra information to work. This helps keep your app clean and organized.
Dependencies with parameters in FastAPI
Start learning this pattern below
Jump into concepts and practice - no test required
from fastapi import Depends from fastapi import FastAPI app = FastAPI() def common_dependency(param: str): # use param inside return f"Value is {param}" @app.get("/") async def read_root(value: str = Depends(lambda: common_dependency('example'))): return {"message": value}
You define a function that takes parameters and use it inside Depends().
You can pass parameters by wrapping the dependency call in a lambda or another function.
from fastapi import Depends, FastAPI app = FastAPI() def get_query_param(q: str): return q.upper() @app.get("/items/") async def read_items(q: str = Depends(lambda: get_query_param('hello'))): return {"query": q}
from fastapi import Depends, FastAPI, HTTPException app = FastAPI() def verify_role(role: str): if role != "admin": raise HTTPException(status_code=403, detail="Not authorized") return True @app.get("/admin/") async def admin_access(authorized: bool = Depends(lambda: verify_role('admin'))): return {"status": "Welcome admin"}
This program defines a dependency that checks if the role is 'user'. The endpoint uses this dependency with the parameter 'user'. If the role is correct, it returns a success message.
from fastapi import FastAPI, Depends, HTTPException app = FastAPI() def check_permission(role: str): if role != "user": raise HTTPException(status_code=403, detail="Access denied") return f"Permission granted for {role}" @app.get("/dashboard") async def dashboard(permission: str = Depends(lambda: check_permission('user'))): return {"message": permission}
Use lambda or small wrapper functions to pass parameters to dependencies.
Dependencies with parameters help avoid repeating similar code with small changes.
Remember to handle errors inside dependencies to keep your app safe.
Dependencies with parameters let you customize shared code.
You pass parameters by wrapping the dependency call.
This keeps your code clean and easy to maintain.
Practice
Solution
Step 1: Understand dependency role
Dependencies in FastAPI are reusable pieces of code that can be shared across routes.Step 2: Recognize parameter use
Adding parameters to dependencies allows customizing their behavior for different routes or situations.Final Answer:
To customize shared code by passing arguments to dependencies -> Option DQuick Check:
Dependencies with parameters = customize shared code [OK]
- Thinking dependencies create global variables
- Confusing dependencies with route handlers
- Assuming dependencies generate HTML
Solution
Step 1: Recall Depends usage
Depends expects a callable or a call to a callable that returns a dependency.Step 2: Passing parameters
To pass parameters, you call the dependency function inside Depends, like Depends(get_user(user_id=5)).Final Answer:
Depends(get_user(user_id=5)) -> Option AQuick Check:
Call dependency inside Depends to pass parameters [OK]
- Passing parameters directly to Depends without calling
- Using brackets [] instead of parentheses ()
- Trying to call Depends as a function with parameters
from fastapi import FastAPI, Depends
app = FastAPI()
def get_multiplier(factor: int):
def multiplier(value: int):
return value * factor
return multiplier
@app.get("/multiply")
async def multiply(value: int, multiply_func = Depends(get_multiplier(3))):
return {"result": multiply_func(value)}Solution
Step 1: Understand get_multiplier
get_multiplier(3) returns a function that multiplies input by 3.Step 2: Analyze endpoint call
When calling /multiply with value=3, multiply_func(3) returns 3 * 3 = 9.Final Answer:
{"result": 9} when value=3 -> Option CQuick Check:
Dependency returns multiplier with factor 3, output 9 [OK]
- Assuming Depends cannot take parameters
- Confusing returned function with direct value
- Mixing up multiplication factor
def get_limit(limit: int = 10):
return limit
@app.get("/items")
async def read_items(limit = Depends(get_limit(limit=20))):
return {"limit": limit}Solution
Step 1: Check Depends usage
Depends expects a callable or a call to a callable without parameters directly inside Depends.Step 2: Correct way to pass parameters
To pass parameters, wrap get_limit in another function or use a lambda to supply parameters.Final Answer:
Cannot pass parameters directly inside Depends like get_limit(limit=20) -> Option BQuick Check:
Depends() must wrap callable, not call with parameters directly [OK]
- Calling dependency with parameters inside Depends directly
- Ignoring need for wrapper function
- Wrong import path for Depends
def common_dep(param: str):
def dependency():
return f"Value is {param}"
return dependency
@app.get("/route1")
async def route1(dep = Depends(common_dep("A"))):
return {"msg": dep}
@app.get("/route2")
async def route2(dep = Depends(common_dep("B"))):
return {"msg": dep}Solution
Step 1: Understand reusable dependency pattern
Define a function that returns a dependency function customized by parameters.Step 2: Apply pattern per route
Call this function with different parameters inside Depends for each route to customize behavior.Final Answer:
Define a function returning a dependency function with parameter, then call it inside Depends -> Option AQuick Check:
Wrap dependency with parameter function, call inside Depends [OK]
- Using global variables instead of parameters
- Passing parameters directly to Depends without wrapping
- Duplicating dependency functions unnecessarily
