mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 09:57:37 +03:00 
			
		
		
		
	Update README.rst
This commit is contained in:
		
							parent
							
								
									8878645c7b
								
							
						
					
					
						commit
						80aad7748d
					
				
							
								
								
									
										112
									
								
								README.rst
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								README.rst
									
									
									
									
									
								
							| 
						 | 
					@ -71,10 +71,8 @@ How does it different from the other frameworks?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
``Dependency Injector`` is a simple tool for the powerful concept.
 | 
					``Dependency Injector`` is a simple tool for the powerful concept.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Why do I need it?
 | 
					Example
 | 
				
			||||||
=================
 | 
					=======
 | 
				
			||||||
 | 
					 | 
				
			||||||
``Dependency Injector`` helps you understand and change the structure of the application.
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
With the ``Dependency Injector`` you keep **application structure in one place**.
 | 
					With the ``Dependency Injector`` you keep **application structure in one place**.
 | 
				
			||||||
This place is called **the container**. You use the container to manage all the components of the
 | 
					This place is called **the container**. You use the container to manage all the components of the
 | 
				
			||||||
| 
						 | 
					@ -86,98 +84,80 @@ the application structure. It is **easy to understand and change** it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
*The container is like a map of your application. You always know what depends on what.*
 | 
					*The container is like a map of your application. You always know what depends on what.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
``Flask`` + ``Dependency Injector`` example application container:
 | 
					Example application container:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: python
 | 
					.. code-block:: python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    from dependency_injector import containers, providers
 | 
					   import logging
 | 
				
			||||||
    from dependency_injector.ext import flask
 | 
					   import sys
 | 
				
			||||||
    from flask import Flask
 | 
					 | 
				
			||||||
    from flask_bootstrap import Bootstrap
 | 
					 | 
				
			||||||
    from github import Github
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    from . import views, services
 | 
					   from dependency_injector import containers, providers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   from . import http, monitors, dispatcher
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   class ApplicationContainer(containers.DeclarativeContainer):
 | 
					   class ApplicationContainer(containers.DeclarativeContainer):
 | 
				
			||||||
        """Application container."""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        app = flask.Application(Flask, __name__)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        bootstrap = flask.Extension(Bootstrap)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
       config = providers.Configuration()
 | 
					       config = providers.Configuration()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        github_client = providers.Factory(
 | 
					       configure_logging = providers.Callable(
 | 
				
			||||||
            Github,
 | 
					           logging.basicConfig,
 | 
				
			||||||
            login_or_token=config.github.auth_token,
 | 
					           stream=sys.stdout,
 | 
				
			||||||
            timeout=config.github.request_timeout,
 | 
					           level=config.log.level,
 | 
				
			||||||
 | 
					           format=config.log.format,
 | 
				
			||||||
       )
 | 
					       )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        search_service = providers.Factory(
 | 
					       http_client = providers.Factory(http.HttpClient)
 | 
				
			||||||
            services.SearchService,
 | 
					
 | 
				
			||||||
            github_client=github_client,
 | 
					       example_monitor = providers.Factory(
 | 
				
			||||||
 | 
					           monitors.HttpMonitor,
 | 
				
			||||||
 | 
					           http_client=http_client,
 | 
				
			||||||
 | 
					           options=config.monitors.example,
 | 
				
			||||||
       )
 | 
					       )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        index_view = flask.View(
 | 
					       httpbin_monitor = providers.Factory(
 | 
				
			||||||
            views.index,
 | 
					           monitors.HttpMonitor,
 | 
				
			||||||
            search_service=search_service,
 | 
					           http_client=http_client,
 | 
				
			||||||
            default_query=config.search.default_query,
 | 
					           options=config.monitors.httpbin,
 | 
				
			||||||
            default_limit=config.search.default_limit,
 | 
					 | 
				
			||||||
       )
 | 
					       )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Running such container looks like this:
 | 
					       dispatcher = providers.Factory(
 | 
				
			||||||
 | 
					           dispatcher.Dispatcher,
 | 
				
			||||||
 | 
					           monitors=providers.List(
 | 
				
			||||||
 | 
					               example_monitor,
 | 
				
			||||||
 | 
					               httpbin_monitor,
 | 
				
			||||||
 | 
					           ),
 | 
				
			||||||
 | 
					       )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Running of such container looks like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.. code-block:: python
 | 
					.. code-block:: python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   from .containers import ApplicationContainer
 | 
					   from .containers import ApplicationContainer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def create_app():
 | 
					   def main() -> None:
 | 
				
			||||||
        """Create and return Flask application."""
 | 
					 | 
				
			||||||
       container = ApplicationContainer()
 | 
					       container = ApplicationContainer()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       container.config.from_yaml('config.yml')
 | 
					       container.config.from_yaml('config.yml')
 | 
				
			||||||
        container.config.github.auth_token.from_env('GITHUB_TOKEN')
 | 
					       container.configure_logging()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        app = container.app()
 | 
					       dispatcher = container.dispatcher()
 | 
				
			||||||
        app.container = container
 | 
					       dispatcher.run()
 | 
				
			||||||
 | 
					 | 
				
			||||||
        bootstrap = container.bootstrap()
 | 
					 | 
				
			||||||
        bootstrap.init_app(app)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        app.add_url_rule('/', view_func=container.index_view.as_view())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return app
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
And testing looks like:
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.. code-block:: python
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    from unittest import mock
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import pytest
 | 
					 | 
				
			||||||
    from github import Github
 | 
					 | 
				
			||||||
    from flask import url_for
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    from .application import create_app
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @pytest.fixture
 | 
					   if __name__ == '__main__':
 | 
				
			||||||
    def app():
 | 
					       main()
 | 
				
			||||||
        return create_app()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Tutorials
 | 
				
			||||||
 | 
					=========
 | 
				
			||||||
 | 
					Tutorial will be a good point to start.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_index(client, app):
 | 
					You can pass one of the dependency injection tutorials:
 | 
				
			||||||
        github_client_mock = mock.Mock(spec=Github)
 | 
					 | 
				
			||||||
        # Configure mock
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with app.container.github_client.override(github_client_mock):
 | 
					- `Flask web application tutorial <http://python-dependency-injector.ets-labs.org/tutorials/flask.html>`_
 | 
				
			||||||
            response = client.get(url_for('index'))
 | 
					- `Aiohttp REST API tutorial <http://python-dependency-injector.ets-labs.org/tutorials/aiohttp.html>`_
 | 
				
			||||||
 | 
					- `Asyncio monitoring daemon tutorial <http://python-dependency-injector.ets-labs.org/tutorials/asyncio-daemon.html>`_
 | 
				
			||||||
        assert response.status_code == 200
 | 
					 | 
				
			||||||
        # Do more asserts
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
See complete example here - `Flask + Dependency Injector Example <https://github.com/ets-labs/python-dependency-injector/tree/master/examples/miniapps/ghnav-flask>`_
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
How to install?
 | 
					How to install?
 | 
				
			||||||
---------------
 | 
					---------------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user