Update aiohttp example

This commit is contained in:
Roman Mogylatov 2020-09-22 21:47:44 -04:00
parent 170263de4d
commit 4fab71c35b
14 changed files with 53 additions and 57 deletions

View File

@ -9,7 +9,8 @@ follows `Semantic versioning`_
4.0.0 4.0.0
----- -----
- Add wiring. - Add ``wiring`` feature.
- Update ``aiohttp`` example.
3.44.0 3.44.0
------ ------

View File

@ -1,8 +1,8 @@
Aiohttp Dependency Injection Example Dependency Injector + Aiohttp Example
==================================== =====================================
Application ``giphynavigator`` is an `Aiohttp <https://docs.aiohttp.org/>`_ + Application ``giphynavigator`` is an `Aiohttp <https://docs.aiohttp.org/>`_ +
`Dependency Injector <http://python-dependency-injector.ets-labs.org/>`_ application. `Dependency Injector <http://python-dependency-injector.ets-labs.org/>`_ example application.
Run Run
--- ---
@ -107,11 +107,11 @@ The output should be something like:
--------------------------------------------------- ---------------------------------------------------
giphynavigator/__init__.py 0 0 100% giphynavigator/__init__.py 0 0 100%
giphynavigator/__main__.py 5 5 0% giphynavigator/__main__.py 5 5 0%
giphynavigator/application.py 10 0 100% giphynavigator/application.py 12 0 100%
giphynavigator/containers.py 10 0 100% giphynavigator/containers.py 6 0 100%
giphynavigator/giphy.py 14 9 36% giphynavigator/giphy.py 14 9 36%
giphynavigator/services.py 9 1 89% giphynavigator/services.py 9 1 89%
giphynavigator/tests.py 35 0 100% giphynavigator/tests.py 37 0 100%
giphynavigator/views.py 7 0 100% giphynavigator/views.py 9 0 100%
--------------------------------------------------- ---------------------------------------------------
TOTAL 90 15 83% TOTAL 92 15 84%

View File

@ -0,0 +1,5 @@
giphy:
request_timeout: 10
default:
query: "Dependency Injector"
limit: 10

View File

@ -2,20 +2,23 @@
from aiohttp import web from aiohttp import web
from .containers import ApplicationContainer from .containers import Container
from . import views
def create_app(): def create_app():
"""Create and return aiohttp application.""" """Create and return aiohttp application."""
container = ApplicationContainer() container = Container()
container.config.from_yaml('config.yml') container.config.from_yaml('config.yml')
container.config.giphy.api_key.from_env('GIPHY_API_KEY') container.config.giphy.api_key.from_env('GIPHY_API_KEY')
app: web.Application = container.app() container.wire(modules=[views])
app = web.Application()
app.container = container app.container = container
app.add_routes([ app.add_routes([
web.get('/', container.index_view.as_view()), web.get('/', views.index),
]) ])
return app return app

View File

@ -0,0 +1,21 @@
"""Containers module."""
from dependency_injector import containers, providers
from . import giphy, services
class Container(containers.DeclarativeContainer):
config = providers.Configuration()
giphy_client = providers.Factory(
giphy.GiphyClient,
api_key=config.giphy.api_key,
timeout=config.giphy.request_timeout,
)
search_service = providers.Factory(
services.SearchService,
giphy_client=giphy_client,
)

View File

@ -10,7 +10,9 @@ from giphynavigator.giphy import GiphyClient
@pytest.fixture @pytest.fixture
def app(): def app():
return create_app() app = create_app()
yield app
app.container.unwire()
@pytest.fixture @pytest.fixture
@ -73,5 +75,5 @@ async def test_index_default_params(client, app):
assert response.status == 200 assert response.status == 200
data = await response.json() data = await response.json()
assert data['query'] == app.container.config.search.default_query() assert data['query'] == app.container.config.default.query()
assert data['limit'] == app.container.config.search.default_limit() assert data['limit'] == app.container.config.default.limit()

View File

@ -1,15 +1,17 @@
"""Views module.""" """Views module."""
from aiohttp import web from aiohttp import web
from dependency_injector.wiring import Provide
from .services import SearchService from .services import SearchService
from .containers import Container
async def index( async def index(
request: web.Request, request: web.Request,
search_service: SearchService, search_service: SearchService = Provide[Container.search_service],
default_query: str, default_query: str = Provide[Container.config.default.query],
default_limit: int, default_limit: int = Provide[Container.config.default.limit.as_int()],
) -> web.Response: ) -> web.Response:
query = request.query.get('query', default_query) query = request.query.get('query', default_query)
limit = int(request.query.get('limit', default_limit)) limit = int(request.query.get('limit', default_limit))

View File

@ -1,5 +0,0 @@
giphy:
request_timeout: 10
search:
default_query: "Dependency Injector"
default_limit: 10

View File

@ -1,33 +0,0 @@
"""Application containers module."""
from dependency_injector import containers, providers
from dependency_injector.ext import aiohttp
from aiohttp import web
from . import giphy, services, views
class ApplicationContainer(containers.DeclarativeContainer):
"""Application container."""
app = aiohttp.Application(web.Application)
config = providers.Configuration()
giphy_client = providers.Factory(
giphy.GiphyClient,
api_key=config.giphy.api_key,
timeout=config.giphy.request_timeout,
)
search_service = providers.Factory(
services.SearchService,
giphy_client=giphy_client,
)
index_view = aiohttp.View(
views.index,
search_service=search_service,
default_query=config.search.default_query,
default_limit=config.search.default_limit,
)