Навигация по курсу:
Внедрения зависимостей — прекрасная идея. Не буду вас мучить громкими словами, давайте разберемся на простом примере. Вы должны знать, что мы используем тестовую базу данных для запуска модульного теста и базу данных производства/разработки. Можете ли вы представить, что произойдет, если мы везде будем использовать одну и ту же базу данных? Да, через несколько недель в нашей базе данных будет беспорядок! Он будет заполнен бесполезными электронными письмами типа test@example.com, mycutetest@test.com и так далее!
Когда мы будем создавать нашу логику для создания пользователя, нам нужно будет отделить настройки нашей базы данных, а не жестко захардкодить их. Во время тестов нам нужна была бы другая база данных, а во время разработки/производства наша БД должна быть совершенно другой. Этого можно достичь с помощью внедрения зависимостей. Для этого мы создадим зависимость под названием «get_db», которая будет управлять нашим подключением к базе данных. Во время модульного тестирования мы переопределяли эту зависимость get_db и подключались к какой-либо другой тестовой базе данных. Я думаю, вы должны были это в какой-то степени понять. Теперь давайте введем приведенный ниже код в db > session.py.
Готово, теперь во время тестирования мы переопределим этот get_db для подключения к другой базе данных. Давайте встретимся после постов в разделе тестирования. Там мы сможем лучше оценить зависимости.
Теперь мы сможем использовать генератор для запроса таблиц, как показано ниже:
>>> from db.models.user import User
>>> from db.session import get_dbDatabase URL is postgresql://nofoobar:supersecret@localhost:5432/blogdb
>>> db = get_db().__next__()
>>> db.query(User).all()
[]
Так, супер! Мы научились подключаться к бд и получать данные. Теперь давайте попробуем создать систему для хранения паролей на нашем сайте.
Хеширование паролей с помощью Bcrypt
Хранение необработанных паролей очень опасно. На случай, если наша база данных будет скомпрометирована по какой-либо причине. Все пароли наших пользователей будут доступны хакеру без каких-либо усилий. Чтобы справиться с этим сценарием, мы используем хеширование паролей. Проще говоря, это односторонний алгоритм преобразования паролей в строку, которая выглядит как тарабарщина. Например, если ваш пароль «HelloWorld», он будет выглядеть как $2y$12$kbQm9Vb96023efZFhSkZf.a4bAGyzDW6zKC/K1JDtKY0f.gKZxAHO с 12 криптографическими итерациями. Я бы предложил поиграться с Bcrypt Generator , чтобы почувствовать хеширование. Замечательная особенность хеширования заключается в том, что мы не дехэшируем, а сравниваем хэши, чтобы увидеть, совпадает ли введенный пароль с существующим паролем.
Существует множество алгоритмов хеширования, таких как PBKDF2, SHA1, SHA256 и многие другие. В этом посте мы собираемся использовать алгоритм BCrypt. Мы будем использовать супербиблиотеку passlib для выполнения хеширования и сравнения. Итак, давайте установим passlib вместе с Bcrypt. Обновите файл requirements.txt с помощью passlib[bcrypt] и выполните команду pip install -r require.txt.
Теперь мы собираемся создать файл, в котором будем реализовывать класс для обработки хеширования. Создайте новый файл в основной папке с именем hashing.py. core > hashing.py и вставьте следующие строки.
- Мы создаем статические методы. Статический метод — это метод, который не требует вызова с использованием экземпляра/объекта класса. Мы можем напрямую вызывать эти методы, например «Hasher.verify_password».
- Я сделал методы статическими, потому что не было необходимости вызывать их из объекта. Создание объекта было бы излишним. Теперь вы можете задаться вопросом, почему я обернул эти функции внутри класса Hasher? Да, это правильный вопрос. Я сделал это, чтобы быть более явным при вызове функции проверки пароля. Легче понять, что Hasher.verify_password() и подобные методы остаются связанными или объединенными вместе.
- Хорошо, давайте попробуем это на оболочке. Введите «python» или «python3» в терминале или в командной строке, нажмите Enter и изучите наш новый hasher.
(env) nofoobar@fastapi:~/Documents/algoholic.io/backend$ python
>>> Hasher.get_password_hash("supersecret1234") '$2b$12$qFVOexqUL3/qhlHwy8W8eu0S80hxq2h382cTQrJyqyDJiJlCVRBhe'
>>>
>>>Hasher.verify_password("supersecret1234","$2b$12$qFVOexqUL3/qhlHwy8W8eu0S80hxq2h382cTQrJyqyDJiJlCVRBhe")
True
Готово, теперь я ухожу за кадр. Есть мир снаружи, который тоже важен :D
✅ В следующей статье мы c тобой создадим первы роут
Читайте также: Часть 9 (Создание роута)
.
❤️ Если вам понравилась статья, ставьте лайк и подписывайтесь на мой канал (Заходи в Ай-Ти).
✅ Кстати, у меня куча интересных курсов и статей по питону. Заходи, тебе понравится)
#fastapi python #питон обучение #python обучение #сайт на питоне #программирование на python
|16+vk.comРЕКЛАМА
|16+perekrestok.ruРЕКЛАМА
Заказывайте доставку
в приложении
Перекрёсток