Dependencies¶
Warning
The current page still doesn't have a translation for this language.
But you can help translating it: Contributing.
In this section, you'll learn how to use dependency injection with Ravyn.
Dependencies let you share reusable logic across handlers without duplicating setup code.
Basic dependency injection¶
Use Inject to register a dependency and Injects to receive it.
from ravyn import Gateway, Inject, Injects, Ravyn, get
def get_token() -> str:
return "super-secret-token"
@get()
def secure(token: str = Injects()) -> dict:
return {"token": token}
app = Ravyn(
routes=[Gateway("/secure", handler=secure)],
dependencies={"token": Inject(get_token)},
)
Class-based dependencies¶
For class construction, prefer Factory.
from ravyn import Factory, Inject, Injects, get
class AuthService:
def get_user(self) -> dict:
return {"name": "John Doe"}
@get("/user", dependencies={"auth": Inject(Factory(AuthService))})
def user(auth: AuthService = Injects()) -> dict:
return auth.get_user()
Caching behavior (use_cache)¶
Inject(..., use_cache=False) is the default.
use_cache=False: resolve dependency each time it is needed.use_cache=True: reuse the resolved value during the dependency lifecycle.
from ravyn import Inject
# No cache (default)
no_cache = Inject(get_token)
# Cached
cached = Inject(get_token, use_cache=True)
Nested dependencies¶
A dependency can depend on another dependency.
from ravyn import Inject, Injects, get
def get_settings() -> dict:
return {"env": "production"}
def get_config(settings: dict = Injects()) -> str:
return f"Running in {settings['env']}"
@get(
"/config",
dependencies={
"settings": Inject(get_settings),
"config": Inject(get_config),
},
)
def read_config(config: str = Injects()) -> dict:
return {"config": config}
Next step¶
Continue to requests and responses.