مرحبًا ،
لقد قمت بإصدار نسخة جديدة من Dependency Injector 4.4. يسمح لك باستخدام حاقن التبعية مع FastAPI . في هذا المنشور سوف أريكم كيف يعمل.
وتتمثل المهمة الرئيسية للتكامل هي لتكوين صداقات مع
DependsFastAPI التوجيه مع علامات Provideو Providerالتبعية الحاقن.
لم يعمل خارج الصندوق قبل DI 4.4. يستخدم FastAPI الكتابة و Pydantic للتحقق من صحة الإدخال والاستجابة. علامات حاقن التبعية حيرته.
جاء الحل بعد فحص الأجزاء الداخلية لـ FastAPI. اضطررت إلى إجراء بعض التغييرات على وحدة الأسلاك الخاصة بحاقن التبعية. يعمل التوجيه
Dependsالآن مع العلامات Provideو Provider.
مثال
قم بإنشاء ملف
fastapi_di_example.pyووضع الأسطر التالية فيه:
import sys
from fastapi import FastAPI, Depends
from dependency_injector import containers, providers
from dependency_injector.wiring import inject, Provide
class Service:
async def process(self) -> str:
return 'Ok'
class Container(containers.DeclarativeContainer):
service = providers.Factory(Service)
app = FastAPI()
@app.api_route('/')
@inject
async def index(service: Service = Depends(Provide[Container.service])):
result = await service.process()
return {'result': result}
container = Container()
container.wire(modules=[sys.modules[__name__]])
لتشغيل المثال ، قم بتثبيت التبعيات:
pip install fastapi dependency-injector uvicorn
وتشغيل
uvicorn:
uvicorn fastapi_di_example:app --reload
يجب أن تعرض المحطة شيئًا مثل:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [11910] using watchgod
INFO: Started server process [11912]
INFO: Waiting for application startup.
INFO: Application startup complete.
لكن
http://127.0.0.1:8000يجب أن تعود:
{
"result": "Ok"
}
كيف تختبر؟
قم بإنشاء ملف بجانبه
tests.pyوضع الأسطر التالية فيه:
from unittest import mock
import pytest
from httpx import AsyncClient
from fastapi_di_example import app, container, Service
@pytest.fixture
def client(event_loop):
client = AsyncClient(app=app, base_url='http://test')
yield client
event_loop.run_until_complete(client.aclose())
@pytest.mark.asyncio
async def test_index(client):
service_mock = mock.AsyncMock(spec=Service)
service_mock.process.return_value = 'Foo'
with container.service.override(service_mock):
response = await client.get('/')
assert response.status_code == 200
assert response.json() == {'result': 'Foo'}
لإجراء الاختبارات ، قم بتثبيت التبعيات:
pip install pytest pytest-asyncio httpx
وتشغيل
pytest:
pytest tests.py
يجب أن تعرض المحطة:
======= test session starts =======
platform darwin -- Python 3.8.3, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
rootdir: ...
plugins: asyncio-0.14.0
collected 1 item
tests.py . [100%]
======= 1 passed in 0.17s =======
ماذا يعطي الاندماج؟
FastAPI هو إطار عمل بناء API رائع. آلية حقن التبعية الأساسية مدمجة فيه.
يعمل هذا التكامل على تحسين حقن التبعية في FastAPI. يسمح لك باستخدام موفري وتجاوزات وتكوين وموارد حاقن التبعية فيه.
ماذا بعد؟
- تحقق من المشروع جيثب
- تحقق من الوثائق
- انظر مثال FastAPI مع وحدات نمطية متعددة