Merülj el a FastAPI hatékony függőség injektáló rendszerében. Tanulj haladó technikákat, egyéni függőségeket, hatóköröket és tesztelési stratégiákat a robusztus API fejlesztéshez.
FastAPI Függőségi Rendszer: Haladó Függőség Injektálás
A FastAPI fĂĽggĹ‘sĂ©g injektálĂł (DI) rendszere a tervezĂ©sĂ©nek sarokköve, amely elĹ‘segĂti a modularitást, a tesztelhetĹ‘sĂ©get Ă©s az ĂşjrafelhasználhatĂłságot. Bár az alapvetĹ‘ használata egyszerű, a haladĂł DI technikák elsajátĂtása jelentĹ‘s erĹ‘t Ă©s rugalmasságot szabadĂt fel. Ez a cikk a FastAPI haladĂł fĂĽggĹ‘sĂ©g injektálásával foglalkozik, beleĂ©rtve az egyĂ©ni fĂĽggĹ‘sĂ©geket, a hatĂłköröket, a tesztelĂ©si stratĂ©giákat Ă©s a bevált gyakorlatokat.
Az Alapok Megértése
Mielőtt belemerülnénk a haladó témákba, foglaljuk össze gyorsan a FastAPI függőség injektálásának alapjait:
- Függőségek, mint Függvények: A függőségek egyszerű Python függvényekként vannak deklarálva.
- Automatikus Injektálás: A FastAPI automatikusan injektálja ezeket a fĂĽggĹ‘sĂ©geket az Ăştvonalműveletekbe a tĂpusjegyzetek alapján.
- TĂpusjegyzetek, mint SzerzĹ‘dĂ©sek: A tĂpusjegyzetek definiálják a fĂĽggĹ‘sĂ©gek Ă©s az Ăştvonalművelet fĂĽggvĂ©nyek elvárt bemeneti tĂpusait.
- Hierarchikus Függőségek: A függőségek függhetnek más függőségektől, létrehozva egy függőségi fát.
Itt van egy egyszerű példa:
from fastapi import FastAPI, Depends
app = FastAPI()
def get_db():
db = {"items": []}
try:
yield db
finally:
# Close the connection if needed
pass
@app.get("/items/")
async def read_items(db: dict = Depends(get_db)):
return db["items"]
Ebben a pĂ©ldában a get_db egy fĂĽggĹ‘sĂ©g, amely adatbázis-kapcsolatot biztosĂt. A FastAPI automatikusan meghĂvja a get_db fĂĽggvĂ©nyt, Ă©s injektálja az eredmĂ©nyt a read_items fĂĽggvĂ©nybe.
Haladó Függőségi Technikák
1. Osztályok Használata Függőségekként
Bár a fĂĽggvĂ©nyeket általában használják, az osztályok is szolgálhatnak fĂĽggĹ‘sĂ©gekkĂ©nt, lehetĹ‘vĂ© tĂ©ve a komplexebb állapotkezelĂ©st Ă©s metĂłdusokat. Ez kĂĽlönösen hasznos adatbázis-kapcsolatok, hitelesĂtĂ©si szolgáltatások vagy más erĹ‘források kezelĂ©sekor, amelyek inicializálást Ă©s lezárást igĂ©nyelnek.
from fastapi import FastAPI, Depends
app = FastAPI()
class Database:
def __init__(self):
self.connection = self.create_connection()
def create_connection(self):
# Simulate a database connection
print("Creating database connection...")
return {"items": []}
def close(self):
# Simulate closing a database connection
print("Closing database connection...")
def get_db():
db = Database()
try:
yield db.connection
finally:
db.close()
@app.get("/items/")
async def read_items(db: dict = Depends(get_db)):
return db["items"]
Ebben a pĂ©ldában a Database osztály magában foglalja az adatbázis-kapcsolat logikáját. A get_db fĂĽggĹ‘sĂ©g lĂ©trehoz egy pĂ©ldányt a Database osztálybĂłl, Ă©s kiadja a kapcsolatot. A finally blokk biztosĂtja, hogy a kapcsolat megfelelĹ‘en lezáruljon a kĂ©rĂ©s feldolgozása után.
2. FĂĽggĹ‘sĂ©gek FelĂĽlĂrása
A FastAPI lehetĹ‘vĂ© teszi a fĂĽggĹ‘sĂ©gek felĂĽlĂrását, ami elengedhetetlen a tesztelĂ©shez Ă©s a fejlesztĂ©shez. A valĂłs fĂĽggĹ‘sĂ©get helyettesĂtheti egy mock-kal vagy stub-bal, hogy elkĂĽlönĂtse a kĂłdot Ă©s biztosĂtsa a következetes eredmĂ©nyeket.
from fastapi import FastAPI, Depends
app = FastAPI()
# Original dependency
def get_settings():
# Simulate loading settings from a file or environment
return {"api_key": "real_api_key"}
@app.get("/items/")
async def read_items(settings: dict = Depends(get_settings)):
return {"api_key": settings["api_key"]}
# Override for testing
def get_settings_override():
return {"api_key": "test_api_key"}
app.dependency_overrides[get_settings] = get_settings_override
# To revert back to the original:
# del app.dependency_overrides[get_settings]
Ebben a pĂ©ldában a get_settings fĂĽggĹ‘sĂ©g felĂĽl van Ărva a get_settings_override fĂĽggĹ‘sĂ©ggel. Ez lehetĹ‘vĂ© teszi egy másik API-kulcs használatát tesztelĂ©si cĂ©lokra.
3. `contextvars` Használata Kéréshez Kötött Adatokhoz
A contextvars egy Python modul, amely kontextus-lokális változĂłkat biztosĂt. Ez hasznos a kĂ©rĂ©shez kötött adatok tárolására, mint pĂ©ldául felhasználĂłi hitelesĂtĂ©si informáciĂłk, kĂ©rĂ©sazonosĂtĂłk vagy nyomkövetĂ©si adatok. A contextvars használata a FastAPI fĂĽggĹ‘sĂ©g injektálásával lehetĹ‘vĂ© teszi ezen adatok elĂ©rĂ©sĂ©t az alkalmazásban.
import contextvars
from fastapi import FastAPI, Depends, Request
import uuid
app = FastAPI()
# Create a context variable for the request ID
request_id_var = contextvars.ContextVar("request_id")
# Middleware to set the request ID
@app.middleware("http")
async def add_request_id(request: Request, call_next):
request_id = str(uuid.uuid4())
request_id_var.set(request_id)
response = await call_next(request)
response.headers["X-Request-ID"] = request_id
return response
# Dependency to access the request ID
def get_request_id():
return request_id_var.get()
@app.get("/items/")
async def read_items(request_id: str = Depends(get_request_id)):
return {"request_id": request_id}
Ebben a pĂ©ldában a middleware beállĂt egy egyedi kĂ©rĂ©sazonosĂtĂłt minden bejövĹ‘ kĂ©rĂ©shez. A get_request_id fĂĽggĹ‘sĂ©g lekĂ©ri a kĂ©rĂ©sazonosĂtĂłt a contextvars kontextusbĂłl. Ez lehetĹ‘vĂ© teszi a kĂ©relmek nyomon követĂ©sĂ©t az alkalmazásban.
4. Aszinkron Függőségek
A FastAPI zökkenĹ‘mentesen támogatja az aszinkron fĂĽggĹ‘sĂ©geket. Ez elengedhetetlen a nem blokkolĂł I/O műveletekhez, mint pĂ©ldául az adatbázis lekĂ©rdezĂ©sek vagy a kĂĽlsĹ‘ API hĂvások. Egyszerűen definiálja a fĂĽggĹ‘sĂ©gi fĂĽggvĂ©nyt async def fĂĽggvĂ©nykĂ©nt.
from fastapi import FastAPI, Depends
import asyncio
app = FastAPI()
async def get_data():
# Simulate an asynchronous operation
await asyncio.sleep(1)
return {"message": "Hello from async dependency!"}
@app.get("/items/")
async def read_items(data: dict = Depends(get_data)):
return data
Ebben a példában a get_data függőség egy aszinkron függvény, amely késleltetést szimulál. A FastAPI automatikusan megvárja az aszinkron függőség eredményét, mielőtt injektálná a read_items függvénybe.
5. Generátorok Használata Erőforrás-kezeléshez (Adatbázis-kapcsolatok, Fájlkezelők)
A generátorok (a yield használatával) automatikus erĹ‘forrás-kezelĂ©st biztosĂtanak, garantálva, hogy az erĹ‘források megfelelĹ‘en lezárásra/felszabadĂtásra kerĂĽlnek a finally blokkon keresztĂĽl, mĂ©g akkor is, ha hibák törtĂ©nnek.
from fastapi import FastAPI, Depends
app = FastAPI()
def get_file_handle():
try:
file_handle = open("my_file.txt", "r")
yield file_handle
finally:
file_handle.close()
@app.get("/file_content/")
async def read_file_content(file_handle = Depends(get_file_handle)):
content = file_handle.read()
return {"content": content}
Függőségi Hatókörök és Életciklusok
A fĂĽggĹ‘sĂ©gi hatĂłkörök megĂ©rtĂ©se kulcsfontosságĂş a fĂĽggĹ‘sĂ©gek Ă©letciklusának kezelĂ©sĂ©hez, Ă©s annak biztosĂtásához, hogy az erĹ‘források megfelelĹ‘en legyenek lefoglalva Ă©s felszabadĂtva. A FastAPI nem kĂnál közvetlenĂĽl explicit hatĂłkör-annotáciĂłkat, mint nĂ©hány más DI keretrendszer (pl. a Spring `@RequestScope`, `@ApplicationScope`), de a fĂĽggĹ‘sĂ©gek definiálásának Ă©s az állapot kezelĂ©sĂ©nek kombináciĂłja hasonlĂł eredmĂ©nyeket Ă©r el.
Kérés Hatóköre
Ez a leggyakoribb hatĂłkör. Minden kĂ©rĂ©shez a fĂĽggĹ‘sĂ©g egy Ăşj pĂ©ldányát kapja. Ez általában Ăşgy Ă©rhetĹ‘ el, hogy egy Ăşj objektumot hozunk lĂ©tre egy fĂĽggĹ‘sĂ©gi fĂĽggvĂ©nyen belĂĽl, Ă©s kiadjuk azt, ahogy az a korábbi adatbázis pĂ©ldában is láthatĂł. A contextvars használata szintĂ©n segĂt a kĂ©rĂ©s hatĂłkörĂ©nek elĂ©rĂ©sĂ©ben.
Alkalmazás Hatóköre (Singleton)
A függőség egyetlen példánya jön létre, és az alkalmazás teljes életciklusa során megosztásra kerül minden kérés között. Ez gyakran globális változók vagy osztályszintű attribútumok használatával történik.
from fastapi import FastAPI, Depends
app = FastAPI()
# Singleton instance
GLOBAL_SETTING = {"api_key": "global_api_key"}
def get_global_setting():
return GLOBAL_SETTING
@app.get("/items/")
async def read_items(setting: dict = Depends(get_global_setting)):
return setting
Legyen óvatos, amikor alkalmazás-hatóköri függőségeket használ változtatható állapottal, mivel az egyik kérés által végrehajtott változtatások befolyásolhatják a többi kérést. Szinkronizációs mechanizmusokra (zárak stb.) lehet szükség, ha az alkalmazásban egyidejű kérések vannak.
Munkamenet Hatóköre (Felhasználó-Specifikus Adatok)
A függőségek felhasználói munkamenetekhez rendelése. Ehhez munkamenet-kezelési mechanizmusra (pl. cookie-k vagy JWT-k használatára) van szükség, és jellemzően a függőségek munkamenet-adatokban való tárolását foglalja magában.
from fastapi import FastAPI, Depends, Cookie
from typing import Optional
import uuid
app = FastAPI()
# In a real app, store sessions in a database or cache
sessions = {}
async def get_user_id(session_id: Optional[str] = Cookie(None)) -> str:
if session_id is None or session_id not in sessions:
session_id = str(uuid.uuid4())
sessions[session_id] = {"user_id": str(uuid.uuid4())} # Assign a random user ID
return sessions[session_id]["user_id"]
@app.get("/profile/")
async def read_profile(user_id: str = Depends(get_user_id)):
return {"user_id": user_id}
Függőségek Tesztelése
A fĂĽggĹ‘sĂ©g injektálás egyik elsĹ‘dleges elĹ‘nye a jobb tesztelhetĹ‘sĂ©g. Az összetevĹ‘k szĂ©tválasztásával könnyen helyettesĂtheti a fĂĽggĹ‘sĂ©geket mock-okkal vagy stub-okkal a tesztelĂ©s során.
1. FĂĽggĹ‘sĂ©gek FelĂĽlĂrása Tesztekben
Ahogy korábban bemutattuk, a FastAPI dependency_overrides mechanizmusa ideális a tesztelĂ©shez. Hozzon lĂ©tre mock fĂĽggĹ‘sĂ©geket, amelyek elĹ‘re jelezhetĹ‘ eredmĂ©nyeket adnak vissza, Ă©s használja Ĺ‘ket a tesztelĂ©s alatt állĂł kĂłd elkĂĽlönĂtĂ©sĂ©re.
from fastapi.testclient import TestClient
from fastapi import FastAPI, Depends
app = FastAPI()
# Original dependency
def get_external_data():
# Simulate fetching data from an external API
return {"data": "Real external data"}
@app.get("/data/")
async def read_data(data: dict = Depends(get_external_data)):
return data
# Test
from unittest.mock import MagicMock
def get_external_data_mock():
return {"data": "Mocked external data"}
def test_read_data():
app.dependency_overrides[get_external_data] = get_external_data_mock
client = TestClient(app)
response = client.get("/data/")
assert response.status_code == 200
assert response.json() == {"data": "Mocked external data"}
# Clean up overrides
app.dependency_overrides.clear()
2. Mocking Könyvtárak Használata
Az olyan könyvtárak, mint az unittest.mock, hatĂ©kony eszközöket biztosĂtanak a mock objektumok lĂ©trehozásához Ă©s viselkedĂ©sĂĽk szabályozásához. A mock-ok segĂtsĂ©gĂ©vel szimulálhatja a komplex fĂĽggĹ‘sĂ©geket, Ă©s ellenĹ‘rizheti, hogy a kĂłd megfelelĹ‘en kommunikál-e velĂĽk.
import unittest
from unittest.mock import MagicMock
# (Define the FastAPI app and get_external_data as above)
class TestReadData(unittest.TestCase):
def test_read_data_with_mock(self):
# Create a mock for the get_external_data dependency
mock_get_external_data = MagicMock(return_value={"data": "Mocked data from unittest"})
# Override the dependency with the mock
app.dependency_overrides[get_external_data] = mock_get_external_data
client = TestClient(app)
response = client.get("/data/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.json(), {"data": "Mocked data from unittest"})
# Assert that the mock was called
mock_get_external_data.assert_called_once()
# Clean up overrides
app.dependency_overrides.clear()
3. FĂĽggĹ‘sĂ©g Injektálása EgysĂ©gtesztelĂ©shez (FastAPI Kontextuson KĂvĂĽl)
MĂ©g akkor is, ha API vĂ©gpont kezelĹ‘in *kĂvĂĽl* esĹ‘ fĂĽggvĂ©nyeket egysĂ©gtesztel, a fĂĽggĹ‘sĂ©g injektálás elvei továbbra is Ă©rvĂ©nyesek. A FastAPI Depends-re valĂł támaszkodás helyett manuálisan injektálja a fĂĽggĹ‘sĂ©geket a tesztelĂ©s alatt állĂł fĂĽggvĂ©nybe.
# Example function to test
def process_data(data_source):
data = data_source.fetch_data()
# ... process the data ...
return processed_data
class MockDataSource:
def fetch_data(self):
return {"example": "data"}
# Unit test
def test_process_data():
mock_data_source = MockDataSource()
result = process_data(mock_data_source)
# Assertions on the result
Biztonsági Megfontolások a Függőség Injektálásnál
A fĂĽggĹ‘sĂ©g injektálás, bár elĹ‘nyös, potenciális biztonsági problĂ©mákat vet fel, ha nem valĂłsĂtják meg gondosan.
1. Függőségi Zavar
GyĹ‘zĹ‘djön meg arrĂłl, hogy a fĂĽggĹ‘sĂ©geket megbĂzhatĂł forrásokbĂłl veszi. EllenĹ‘rizze a csomagok integritását, Ă©s használjon csomagkezelĹ‘ket sebezhetĹ‘sĂ©g-vizsgálati kĂ©pessĂ©gekkel. Ez egy általános szoftverellátási lánc biztonsági elv, de a DI sĂşlyosbĂtja, mivel komponenseket injektálhat kĂĽlönbözĹ‘ forrásokbĂłl.
2. Rosszindulatú Függőségek Injektálása
Ăśgyeljen azokra a fĂĽggĹ‘sĂ©gekre, amelyek kĂĽlsĹ‘ bemenetet fogadnak el megfelelĹ‘ validálás nĂ©lkĂĽl. A támadĂł potenciálisan rosszindulatĂş kĂłdot vagy adatokat injektálhat egy feltört fĂĽggĹ‘sĂ©gen keresztĂĽl. TisztĂtsa meg az összes felhasználĂłi bemenetet, Ă©s valĂłsĂtson meg robusztus validálási mechanizmusokat.
3. Információkiszivárgás Függőségeken Keresztül
GyĹ‘zĹ‘djön meg arrĂłl, hogy a fĂĽggĹ‘sĂ©gek nem fednek fel vĂ©letlenĂĽl Ă©rzĂ©keny informáciĂłkat. Tekintse át a fĂĽggĹ‘sĂ©gek kĂłdját Ă©s konfiguráciĂłját a potenciális informáciĂłkiszivárgási sebezhetĹ‘sĂ©gek azonosĂtása Ă©rdekĂ©ben.
4. Hardcoded Titkok
Kerülje a titkok (API-kulcsok, adatbázis jelszavak stb.) közvetlen beégetését a függőségi kódba. Használjon környezeti változókat vagy biztonságos konfigurációkezelő eszközöket a titkok tárolására és kezelésére.
import os
from fastapi import FastAPI, Depends
app = FastAPI()
def get_api_key():
api_key = os.environ.get("API_KEY")
if not api_key:
raise ValueError("API_KEY environment variable not set.")
return api_key
@app.get("/secure_endpoint/")
async def secure_endpoint(api_key: str = Depends(get_api_key)):
# Use api_key for authentication/authorization
return {"message": "Access granted"}
TeljesĂtmĂ©ny Optimalizálás a FĂĽggĹ‘sĂ©g Injektálással
A fĂĽggĹ‘sĂ©g injektálás befolyásolhatja a teljesĂtmĂ©nyt, ha nem használják körĂĽltekintĹ‘en. ĂŤme nĂ©hány optimalizálási stratĂ©gia:
1. Minimalizálja a Függőség Létrehozási Költségét
Ha lehetsĂ©ges, kerĂĽlje a költsĂ©ges fĂĽggĹ‘sĂ©gek lĂ©trehozását minden kĂ©rĂ©snĂ©l. Ha egy fĂĽggĹ‘sĂ©g állapotmentes, vagy megoszthatĂł a kĂ©rĂ©sek között, fontolja meg egy singleton hatĂłkör használatát, vagy a fĂĽggĹ‘sĂ©gi pĂ©ldány gyorsĂtĂłtárazását.
2. Lusta Inicializálás
Inicializálja a fĂĽggĹ‘sĂ©geket csak akkor, amikor szĂĽksĂ©g van rájuk. Ez csökkentheti az indĂtási idĹ‘t Ă©s a memĂłriafelhasználást, kĂĽlönösen a sok fĂĽggĹ‘sĂ©ggel rendelkezĹ‘ alkalmazások esetĂ©ben.
3. FĂĽggĹ‘sĂ©gi EredmĂ©nyek GyorsĂtĂłtárazása
GyorsĂtĂłtárazza a költsĂ©ges fĂĽggĹ‘sĂ©gi számĂtások eredmĂ©nyeit, ha valĂłszĂnű, hogy az eredmĂ©nyeket Ăşjra felhasználják. Használjon gyorsĂtĂłtárazási mechanizmusokat (pl. Redis, Memcached) a fĂĽggĹ‘sĂ©gi eredmĂ©nyek tárolására Ă©s lekĂ©rĂ©sĂ©re.
4. Optimalizálja a Függőségi Gráfot
Elemezze a fĂĽggĹ‘sĂ©gi gráfot a potenciális szűk keresztmetszetek azonosĂtása Ă©rdekĂ©ben. EgyszerűsĂtse a fĂĽggĹ‘sĂ©gi struktĂşrát, Ă©s csökkentse a fĂĽggĹ‘sĂ©gek számát, ha lehetsĂ©ges.
5. Aszinkron Függőségek I/O Kötött Műveletekhez
Használjon aszinkron fĂĽggĹ‘sĂ©geket blokkolĂł I/O műveletek vĂ©grehajtásakor, mint pĂ©ldául az adatbázis lekĂ©rdezĂ©sek vagy a kĂĽlsĹ‘ API hĂvások. Ez megakadályozza a fĹ‘ szál blokkolását, Ă©s javĂtja az alkalmazás általános válaszkĂ©szsĂ©gĂ©t.
Bevált Gyakorlatok a FastAPI Függőség Injektáláshoz
- Tartsa Egyszerűen a FĂĽggĹ‘sĂ©geket: Törekedjen a kis, fĂłkuszált fĂĽggĹ‘sĂ©gekre, amelyek egyetlen feladatot hajtanak vĂ©gre. Ez javĂtja az olvashatĂłságot, a tesztelhetĹ‘sĂ©get Ă©s a karbantarthatĂłságot.
- Használjon TĂpusjegyzeteket: Használja ki a tĂpusjegyzeteket a fĂĽggĹ‘sĂ©gek elvárt bemeneti Ă©s kimeneti tĂpusainak egyĂ©rtelmű definiálásához. Ez javĂtja a kĂłd tisztaságát, Ă©s lehetĹ‘vĂ© teszi a FastAPI számára a statikus tĂpusellenĹ‘rzĂ©st.
- Dokumentálja a FĂĽggĹ‘sĂ©geket: Dokumentálja az egyes fĂĽggĹ‘sĂ©gek cĂ©lját Ă©s használatát. Ez segĂt más fejlesztĹ‘knek megĂ©rteni, hogyan használják Ă©s karbantartják a kĂłdot.
- Tesztelje Alaposan a FĂĽggĹ‘sĂ©geket: ĂŤrjon egysĂ©gteszteket a fĂĽggĹ‘sĂ©gekhez, hogy biztosĂtsa, hogy a várt mĂłdon működnek. Ez segĂt megelĹ‘zni a hibákat, Ă©s javĂtja az alkalmazás általános megbĂzhatĂłságát.
- Használjon Következetes ElnevezĂ©si Szabályokat: Használjon következetes elnevezĂ©si szabályokat a fĂĽggĹ‘sĂ©geknĂ©l a kĂłd olvashatĂłságának javĂtása Ă©rdekĂ©ben.
- Kerülje a Cirkuláris Függőségeket: A cirkuláris függőségek komplex és nehezen debugolható kódhoz vezethetnek. Refaktorálja a kódot a cirkuláris függőségek kiküszöbölése érdekében.
- Fontolja meg a FĂĽggĹ‘sĂ©g InjektálĂł KontĂ©nereket (Opcionális): Bár a FastAPI beĂ©pĂtett fĂĽggĹ‘sĂ©g injektálása a legtöbb esetben elegendĹ‘, fontolja meg egy dedikált fĂĽggĹ‘sĂ©g injektálĂł kontĂ©ner (pl.
inject,autowire) használatát a komplexebb alkalmazásokhoz.
Következtetés
A FastAPI fĂĽggĹ‘sĂ©g injektálĂł rendszere egy hatĂ©kony eszköz, amely elĹ‘segĂti a modularitást, a tesztelhetĹ‘sĂ©get Ă©s az ĂşjrafelhasználhatĂłságot. A haladĂł technikák elsajátĂtásával, mint pĂ©ldául az osztályok fĂĽggĹ‘sĂ©gekkĂ©nt valĂł használata, a fĂĽggĹ‘sĂ©gek felĂĽlĂrása Ă©s a contextvars használata, robusztus Ă©s skálázhatĂł API-kat Ă©pĂthet. A fĂĽggĹ‘sĂ©gi hatĂłkörök Ă©s Ă©letciklusok megĂ©rtĂ©se kulcsfontosságĂş az erĹ‘források hatĂ©kony kezelĂ©sĂ©hez. Mindig helyezze elĹ‘tĂ©rbe a fĂĽggĹ‘sĂ©gek alapos tesztelĂ©sĂ©t az alkalmazások megbĂzhatĂłságának Ă©s biztonságának biztosĂtása Ă©rdekĂ©ben. A bevált gyakorlatok követĂ©sĂ©vel, valamint a potenciális biztonsági Ă©s teljesĂtmĂ©nybeli következmĂ©nyek figyelembevĂ©telĂ©vel teljes mĂ©rtĂ©kben kihasználhatja a FastAPI fĂĽggĹ‘sĂ©g injektálĂł rendszerĂ©nek lehetĹ‘sĂ©geit.