mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 01:47:36 +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.
 | 
			
		||||
 | 
			
		||||
Why do I need it?
 | 
			
		||||
=================
 | 
			
		||||
 | 
			
		||||
``Dependency Injector`` helps you understand and change the structure of the application.
 | 
			
		||||
Example
 | 
			
		||||
=======
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
| 
						 | 
				
			
			@ -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.*
 | 
			
		||||
 | 
			
		||||
``Flask`` + ``Dependency Injector`` example application container:
 | 
			
		||||
Example application container:
 | 
			
		||||
 | 
			
		||||
.. code-block:: python
 | 
			
		||||
 | 
			
		||||
    from dependency_injector import containers, providers
 | 
			
		||||
    from dependency_injector.ext import flask
 | 
			
		||||
    from flask import Flask
 | 
			
		||||
    from flask_bootstrap import Bootstrap
 | 
			
		||||
    from github import Github
 | 
			
		||||
   import logging
 | 
			
		||||
   import sys
 | 
			
		||||
 | 
			
		||||
    from . import views, services
 | 
			
		||||
   from dependency_injector import containers, providers
 | 
			
		||||
 | 
			
		||||
   from . import http, monitors, dispatcher
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   class ApplicationContainer(containers.DeclarativeContainer):
 | 
			
		||||
        """Application container."""
 | 
			
		||||
 | 
			
		||||
        app = flask.Application(Flask, __name__)
 | 
			
		||||
 | 
			
		||||
        bootstrap = flask.Extension(Bootstrap)
 | 
			
		||||
 | 
			
		||||
       config = providers.Configuration()
 | 
			
		||||
 | 
			
		||||
        github_client = providers.Factory(
 | 
			
		||||
            Github,
 | 
			
		||||
            login_or_token=config.github.auth_token,
 | 
			
		||||
            timeout=config.github.request_timeout,
 | 
			
		||||
       configure_logging = providers.Callable(
 | 
			
		||||
           logging.basicConfig,
 | 
			
		||||
           stream=sys.stdout,
 | 
			
		||||
           level=config.log.level,
 | 
			
		||||
           format=config.log.format,
 | 
			
		||||
       )
 | 
			
		||||
 | 
			
		||||
        search_service = providers.Factory(
 | 
			
		||||
            services.SearchService,
 | 
			
		||||
            github_client=github_client,
 | 
			
		||||
       http_client = providers.Factory(http.HttpClient)
 | 
			
		||||
 | 
			
		||||
       example_monitor = providers.Factory(
 | 
			
		||||
           monitors.HttpMonitor,
 | 
			
		||||
           http_client=http_client,
 | 
			
		||||
           options=config.monitors.example,
 | 
			
		||||
       )
 | 
			
		||||
 | 
			
		||||
        index_view = flask.View(
 | 
			
		||||
            views.index,
 | 
			
		||||
            search_service=search_service,
 | 
			
		||||
            default_query=config.search.default_query,
 | 
			
		||||
            default_limit=config.search.default_limit,
 | 
			
		||||
       httpbin_monitor = providers.Factory(
 | 
			
		||||
           monitors.HttpMonitor,
 | 
			
		||||
           http_client=http_client,
 | 
			
		||||
           options=config.monitors.httpbin,
 | 
			
		||||
       )
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
   from .containers import ApplicationContainer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def create_app():
 | 
			
		||||
        """Create and return Flask application."""
 | 
			
		||||
   def main() -> None:
 | 
			
		||||
       container = ApplicationContainer()
 | 
			
		||||
 | 
			
		||||
       container.config.from_yaml('config.yml')
 | 
			
		||||
        container.config.github.auth_token.from_env('GITHUB_TOKEN')
 | 
			
		||||
       container.configure_logging()
 | 
			
		||||
 | 
			
		||||
        app = container.app()
 | 
			
		||||
        app.container = container
 | 
			
		||||
 | 
			
		||||
        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
 | 
			
		||||
       dispatcher = container.dispatcher()
 | 
			
		||||
       dispatcher.run()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @pytest.fixture
 | 
			
		||||
    def app():
 | 
			
		||||
        return create_app()
 | 
			
		||||
   if __name__ == '__main__':
 | 
			
		||||
       main()
 | 
			
		||||
 | 
			
		||||
Tutorials
 | 
			
		||||
=========
 | 
			
		||||
Tutorial will be a good point to start.
 | 
			
		||||
 | 
			
		||||
    def test_index(client, app):
 | 
			
		||||
        github_client_mock = mock.Mock(spec=Github)
 | 
			
		||||
        # Configure mock
 | 
			
		||||
You can pass one of the dependency injection tutorials:
 | 
			
		||||
 | 
			
		||||
        with app.container.github_client.override(github_client_mock):
 | 
			
		||||
            response = client.get(url_for('index'))
 | 
			
		||||
 | 
			
		||||
        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>`_
 | 
			
		||||
- `Flask web application tutorial <http://python-dependency-injector.ets-labs.org/tutorials/flask.html>`_
 | 
			
		||||
- `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>`_
 | 
			
		||||
 | 
			
		||||
How to install?
 | 
			
		||||
---------------
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user