FastAPI + حاقن التبعية





مرحبًا ،



لقد قمت بإصدار نسخة جديدة من 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. يسمح لك باستخدام موفري وتجاوزات وتكوين وموارد حاقن التبعية فيه.



ماذا بعد؟






All Articles