mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-31 16:07:51 +03:00 
			
		
		
		
	Add ioc_container example
This commit is contained in:
		
							parent
							
								
									cdc3a7b51d
								
							
						
					
					
						commit
						431dee80d8
					
				|  | @ -7,6 +7,10 @@ that were made in every particular version. | |||
| From version 0.7.6 *Dependency Injector* framework strictly  | ||||
| follows `Semantic versioning`_ | ||||
| 
 | ||||
| Development version | ||||
| ------------------- | ||||
| - Add new example miniapp "ioc_container". | ||||
| 
 | ||||
| 3.12.0 | ||||
| ------ | ||||
| - Regenerate C sources using Cython 0.28.2. | ||||
|  |  | |||
							
								
								
									
										8
									
								
								examples/miniapps/ioc_container/README.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								examples/miniapps/ioc_container/README.rst
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| Dependency Injector IoC containers example | ||||
| ========================================== | ||||
| 
 | ||||
| Instructions for running | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|     python run.py 1 secret photo.jpg | ||||
							
								
								
									
										55
									
								
								examples/miniapps/ioc_container/container.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								examples/miniapps/ioc_container/container.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | |||
| """Example of dependency injection in Python.""" | ||||
| 
 | ||||
| import logging | ||||
| import sqlite3 | ||||
| 
 | ||||
| import boto3 | ||||
| 
 | ||||
| import example.main | ||||
| import example.services | ||||
| 
 | ||||
| import dependency_injector.containers as containers | ||||
| import dependency_injector.providers as providers | ||||
| 
 | ||||
| 
 | ||||
| class IocContainer(containers.DeclarativeContainer): | ||||
|     """Application IoC container.""" | ||||
| 
 | ||||
|     config = providers.Configuration('config') | ||||
|     logger = providers.Singleton(logging.Logger, name='example') | ||||
| 
 | ||||
|     # Gateways | ||||
| 
 | ||||
|     database_client = providers.Singleton(sqlite3.connect, config.database.dsn) | ||||
| 
 | ||||
|     s3_client = providers.Singleton( | ||||
|         boto3.client, 's3', | ||||
|         aws_access_key_id=config.aws.access_key_id, | ||||
|         aws_secret_access_key=config.aws.secret_access_key) | ||||
| 
 | ||||
|     # Services | ||||
| 
 | ||||
|     users_service = providers.Factory( | ||||
|         example.services.UsersService, | ||||
|         db=database_client, | ||||
|         logger=logger) | ||||
| 
 | ||||
|     auth_service = providers.Factory( | ||||
|         example.services.AuthService, | ||||
|         token_ttl=config.auth.token_ttl, | ||||
|         db=database_client, | ||||
|         logger=logger) | ||||
| 
 | ||||
|     photos_service = providers.Factory( | ||||
|         example.services.PhotosService, | ||||
|         db=database_client, | ||||
|         s3=s3_client, | ||||
|         logger=logger) | ||||
| 
 | ||||
|     # Misc | ||||
| 
 | ||||
|     main = providers.Callable( | ||||
|         example.main.main, | ||||
|         users_service=users_service, | ||||
|         auth_service=auth_service, | ||||
|         photos_service=photos_service) | ||||
							
								
								
									
										1
									
								
								examples/miniapps/ioc_container/example/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								examples/miniapps/ioc_container/example/__init__.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| """Example top-level package.""" | ||||
							
								
								
									
										27
									
								
								examples/miniapps/ioc_container/example/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								examples/miniapps/ioc_container/example/main.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,27 @@ | |||
| """Example main module.""" | ||||
| 
 | ||||
| 
 | ||||
| def main(uid, password, photo, users_service, auth_service, photos_service): | ||||
|     """Authenticate user and upload photo. | ||||
| 
 | ||||
|     :param uid: User identifier. | ||||
|     :type uid: int | ||||
| 
 | ||||
|     :param password: User's password for verification. | ||||
|     :type password: str | ||||
| 
 | ||||
|     :param photo_path: Path to photo for uploading. | ||||
|     :type photo_path: str | ||||
| 
 | ||||
|     :param users_service: Users service. | ||||
|     :type users_service: example.services.UsersService | ||||
| 
 | ||||
|     :param auth_service: Authentication service. | ||||
|     :type auth_service: example.services.AuthService | ||||
| 
 | ||||
|     :param photo_service: Photo service. | ||||
|     :type photo_service: example.services.PhotoService | ||||
|     """ | ||||
|     user = users_service.get_user_by_id(uid) | ||||
|     auth_service.authenticate(user, password) | ||||
|     photos_service.upload_photo(user['uid'], photo) | ||||
							
								
								
									
										103
									
								
								examples/miniapps/ioc_container/example/services.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								examples/miniapps/ioc_container/example/services.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,103 @@ | |||
| """Example business services module.""" | ||||
| 
 | ||||
| 
 | ||||
| class BaseService(object): | ||||
|     """Service base class.""" | ||||
| 
 | ||||
| 
 | ||||
| class UsersService(BaseService): | ||||
|     """Users service.""" | ||||
| 
 | ||||
|     def __init__(self, logger, db): | ||||
|         """Initializer. | ||||
| 
 | ||||
|         :param logger: Logger instance. | ||||
|         :type logger: logging.Logger | ||||
| 
 | ||||
|         :param db: Database connection. | ||||
|         :type db: sqlite3.Connection | ||||
|         """ | ||||
|         self.logger = logger | ||||
|         self.db = db | ||||
| 
 | ||||
|     def get_user_by_id(self, uid): | ||||
|         """Return user's data by identifier. | ||||
| 
 | ||||
|         :param uid: User identifier. | ||||
|         :type uid: int | ||||
| 
 | ||||
|         :rtype: dict | ||||
|         """ | ||||
|         self.logger.debug('User %s has been found in database', uid) | ||||
|         return dict(uid=uid, password_hash='secret_hash') | ||||
| 
 | ||||
| 
 | ||||
| class AuthService(BaseService): | ||||
|     """Authentication service.""" | ||||
| 
 | ||||
|     def __init__(self, logger, db, token_ttl): | ||||
|         """Initializer. | ||||
| 
 | ||||
|         :param logger: Logger instance. | ||||
|         :type logger: logging.Logger | ||||
| 
 | ||||
|         :param db: Database connection. | ||||
|         :type db: sqlite3.Connection | ||||
| 
 | ||||
|         :param token_ttl: Token lifetime in seconds. | ||||
|         :type token_ttl: int | ||||
|         """ | ||||
|         self.logger = logger | ||||
|         self.db = db | ||||
|         self.token_ttl = token_ttl | ||||
| 
 | ||||
|     def authenticate(self, user, password): | ||||
|         """Authenticate user. | ||||
| 
 | ||||
|         :param user: User's data. | ||||
|         :type user: dict | ||||
| 
 | ||||
|         :param password: User's password for verification. | ||||
|         :type password: str | ||||
| 
 | ||||
|         :raises: AssertionError when password is wrong | ||||
| 
 | ||||
|         :rtype: None | ||||
|         """ | ||||
|         assert user['password_hash'] == '_'.join((password, 'hash')) | ||||
|         self.logger.debug('User %s has been successfully authenticated', | ||||
|                           user['uid']) | ||||
| 
 | ||||
| 
 | ||||
| class PhotosService(BaseService): | ||||
|     """Photos service.""" | ||||
| 
 | ||||
|     def __init__(self, logger, db, s3): | ||||
|         """Initializer. | ||||
| 
 | ||||
|         :param logger: Logger instance. | ||||
|         :type logger: logging.Logger | ||||
| 
 | ||||
|         :param db: Database connection. | ||||
|         :type db: sqlite3.Connection | ||||
| 
 | ||||
|         :param s3: AWS S3 client. | ||||
|         :type s3: botocore.client.S3 | ||||
|         """ | ||||
|         self.logger = logger | ||||
|         self.db = db | ||||
|         self.s3 = s3 | ||||
| 
 | ||||
|     def upload_photo(self, uid, photo_path): | ||||
|         """Upload user photo. | ||||
| 
 | ||||
|         :param uid: User identifier. | ||||
|         :type uid: int | ||||
| 
 | ||||
|         :param photo_path: Path to photo for uploading. | ||||
|         :type photo_path: str | ||||
| 
 | ||||
|         :rtpe: None | ||||
|         """ | ||||
|         self.logger.debug('Photo %s has been successfully uploaded by user %s', | ||||
|                           photo_path, uid) | ||||
							
								
								
									
										21
									
								
								examples/miniapps/ioc_container/run.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								examples/miniapps/ioc_container/run.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| """Run example of dependency injection in Python.""" | ||||
| 
 | ||||
| import sys | ||||
| import logging | ||||
| 
 | ||||
| from container import IocContainer | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     # Configure platform: | ||||
|     container = IocContainer( | ||||
|         config={'database': {'dsn': ':memory:'}, | ||||
|                 'aws': {'access_key_id': 'KEY', | ||||
|                         'secret_access_key': 'SECRET'}, | ||||
|                 'auth': {'token_ttl': 3600}}) | ||||
|     container.logger().addHandler(logging.StreamHandler(sys.stdout)) | ||||
| 
 | ||||
|     # Run application: | ||||
|     container.main(uid=sys.argv[1], | ||||
|                    password=sys.argv[2], | ||||
|                    photo=sys.argv[3]) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user