mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-12 01:20: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
|
:maxdepth: 2
|
||||||
|
|
||||||
use_cases_miniapp
|
use_cases_miniapp
|
||||||
password_hashing_miniapp
|
password-hashing
|
||||||
chained_factories
|
chained_factories
|
||||||
factory_of_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
|
From version 0.7.6 *Dependency Injector* framework strictly
|
||||||
follows `Semantic versioning`_
|
follows `Semantic versioning`_
|
||||||
|
|
||||||
|
Develop
|
||||||
|
-------
|
||||||
|
- Refactor "password hashing" example.
|
||||||
|
|
||||||
3.40.0
|
3.40.0
|
||||||
------
|
------
|
||||||
- Add "Decoupled packages" example.
|
- 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