mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-31 16:07:51 +03:00 
			
		
		
		
	Refactor password hashing example
This commit is contained in:
		
							parent
							
								
									e257fd9cb0
								
							
						
					
					
						commit
						5306b27c48
					
				|  | @ -14,6 +14,6 @@ This sections contains assorted ``Dependency Injector`` examples. | |||
|     :maxdepth: 2 | ||||
| 
 | ||||
|     use_cases_miniapp | ||||
|     password_hashing_miniapp | ||||
|     password-hashing | ||||
|     chained_factories | ||||
|     factory_of_factories | ||||
|  |  | |||
							
								
								
									
										19
									
								
								docs/examples-other/password-hashing.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								docs/examples-other/password-hashing.rst
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| Password hashing example | ||||
| ======================== | ||||
| 
 | ||||
| This example demonstrates an injection of the ``Callable`` provider. | ||||
| 
 | ||||
| Listing of the ``example.py``: | ||||
| 
 | ||||
| .. literalinclude:: ../../examples/miniapps/password-hashing/example.py | ||||
|    :language: python | ||||
| 
 | ||||
| Instructions for running: | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|     python example.py | ||||
| 
 | ||||
| You can find the source code on the `Github <https://github.com/ets-labs/python-dependency-injector/tree/master/examples/miniapps/password-hashing>`_. | ||||
| 
 | ||||
| .. disqus:: | ||||
|  | @ -1,18 +0,0 @@ | |||
| Dependency injection and password hashing in Python | ||||
| =================================================== | ||||
| 
 | ||||
| Small example that demonstrates using of dependency injection for user | ||||
| password hashing. | ||||
| 
 | ||||
| Instructions for running: | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|     python example.py | ||||
| 
 | ||||
| Listing of ``example.py``: | ||||
| 
 | ||||
| .. literalinclude:: ../../examples/miniapps/password_hashing/example.py | ||||
|    :language: python | ||||
| 
 | ||||
| .. disqus:: | ||||
|  | @ -7,6 +7,10 @@ that were made in every particular version. | |||
| From version 0.7.6 *Dependency Injector* framework strictly  | ||||
| follows `Semantic versioning`_ | ||||
| 
 | ||||
| Develop | ||||
| ------- | ||||
| - Refactor "password hashing" example. | ||||
| 
 | ||||
| 3.40.0 | ||||
| ------ | ||||
| - Add "Decoupled packages" example. | ||||
|  |  | |||
							
								
								
									
										10
									
								
								examples/miniapps/password-hashing/README.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								examples/miniapps/password-hashing/README.rst
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | |||
| Password hashing | ||||
| ================ | ||||
| 
 | ||||
| This example demonstrates an injection of the ``Callable`` provider. | ||||
| 
 | ||||
| Instructions for running: | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|     python example.py | ||||
							
								
								
									
										50
									
								
								examples/miniapps/password-hashing/example.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								examples/miniapps/password-hashing/example.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | |||
| """Password hashing example.""" | ||||
| 
 | ||||
| from typing import Callable, Dict | ||||
| 
 | ||||
| import passlib.hash | ||||
| 
 | ||||
| from dependency_injector import containers, providers | ||||
| 
 | ||||
| 
 | ||||
| class UserService: | ||||
| 
 | ||||
|     def __init__(self, password_hasher: Callable[[str], str]) -> None: | ||||
|         self._password_hasher = password_hasher | ||||
| 
 | ||||
|     def create_user(self, name: str, password: str) -> Dict[str, str]: | ||||
|         hashed_password = self._password_hasher(password) | ||||
|         return { | ||||
|             'name': name, | ||||
|             'password': hashed_password, | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| class Container(containers.DeclarativeContainer): | ||||
| 
 | ||||
|     config = providers.Configuration() | ||||
| 
 | ||||
|     password_hasher = providers.Callable( | ||||
|         passlib.hash.sha256_crypt.hash, | ||||
|         salt_size=config.salt_size, | ||||
|         rounds=config.rounds, | ||||
|     ) | ||||
| 
 | ||||
|     user_service = providers.Factory( | ||||
|         UserService, | ||||
|         password_hasher=password_hasher.provider, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     container = Container( | ||||
|         config={ | ||||
|             'salt_size': 16, | ||||
|             'rounds': 10000, | ||||
|         }, | ||||
|     ) | ||||
| 
 | ||||
|     user_service = container.user_service() | ||||
| 
 | ||||
|     user = user_service.create_user(name='Roman', password='secret1') | ||||
|     print(user) | ||||
|  | @ -1,12 +0,0 @@ | |||
| Dependency injection and password hashing in Python | ||||
| =================================================== | ||||
| 
 | ||||
| Small example that demonstrates using of dependency injection for user | ||||
| password hashing. | ||||
| 
 | ||||
| 
 | ||||
| instructions for running: | ||||
| 
 | ||||
| .. code-block:: bash | ||||
| 
 | ||||
|     python example.py | ||||
|  | @ -1,42 +0,0 @@ | |||
| """Example of dependency injection and password hashing in Python.""" | ||||
| 
 | ||||
| import passlib.hash | ||||
| 
 | ||||
| import dependency_injector.containers as containers | ||||
| import dependency_injector.providers as providers | ||||
| 
 | ||||
| 
 | ||||
| class UsersService: | ||||
|     """Users service.""" | ||||
| 
 | ||||
|     def __init__(self, password_hasher): | ||||
|         """Initialize instance.""" | ||||
|         self._password_hasher = password_hasher | ||||
| 
 | ||||
|     def create_user(self, name, password): | ||||
|         """Create user with hashed password.""" | ||||
|         hashed_password = self._password_hasher(password) | ||||
|         return dict(name=name, password=hashed_password) | ||||
| 
 | ||||
| 
 | ||||
| class Container(containers.DeclarativeContainer): | ||||
|     """Inversion of control container.""" | ||||
| 
 | ||||
|     password_hasher = providers.Callable( | ||||
|         passlib.hash.sha256_crypt.hash, | ||||
|         salt_size=16, | ||||
|         rounds=10000) | ||||
| 
 | ||||
|     users_service = providers.Factory( | ||||
|         UsersService, | ||||
|         password_hasher=password_hasher.provider) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     container = Container() | ||||
|     users_service = container.users_service() | ||||
| 
 | ||||
|     user1 = users_service.create_user(name='Roman', password='secret1') | ||||
|     user2 = users_service.create_user(name='Vitaly', password='secret2') | ||||
| 
 | ||||
|     print(user1, user2) | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user