You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7.3 KiB

Данные текущего пользователя

В предыдущей главе система безопасности (основанная на системе внедрения зависимостей) передавала функции, обрабатывающей эндпоинт, токен в виде строки:

{* ../../docs_src/security/tutorial001_an_py39.py hl[12] *}

Это пока что не слишком нам полезно. Давайте изменим код так, чтобы он возвращал нам данные пользователя, отправившего запрос.

Создание модели пользователя

Сначала создадим Pydantic-модель пользователя.

Точно так же, как мы использовали Pydantic для объявления тел запросов, мы можем использовать его где угодно:

{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}

Создание зависимости get_current_user

Давайте создадим зависимость get_current_user.

Помните, что у зависимостей могут быть подзависимости?

get_current_user как раз будет иметь подзависимость oauth2_scheme, которую мы создали ранее.

Аналогично тому, как мы делали это ранее в обработчике эндпоинта наша новая зависимость get_current_user будет получать token в виде строки от подзависимости oauth2_scheme:

{* ../../docs_src/security/tutorial002_an_py310.py hl[25] *}

Получение данных пользователя

get_current_user будет использовать созданную нами (ненастоящую) служебную функцию, которая принимает токен в виде строки и возвращает нашу Pydantic-модель User:

{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *}

Внедрение зависимости текущего пользователя

Теперь мы можем использовать тот же Depends с нашей зависимостью get_current_user в функции обрабатывающей эндпоинт:

{* ../../docs_src/security/tutorial002_an_py310.py hl[31] *}

Обратите внимание, что мы объявляем тип переменной current_user как Pydantic-модель User.

Это поможет выполнить внутри функции все проверки автозаполнения и типа.

/// tip | Подсказка Возможно, вы помните, что тело запроса также объявляется с помощью Pydantic-моделей.

В этом месте у FastAPI не возникнет проблем, потому что вы используете Depends. ///

/// check | Заметка То, как устроена эта система зависимостей, позволяет нам иметь различные зависимости, которые возвращают модель User.

Мы не ограничены наличием только одной зависимости, которая может возвращать данные такого типа. ///

Другие модели

Теперь вы можете получать информацию о текущем пользователе непосредственно в функции обрабатывающей эндпоинт и работать с механизмами безопасности на уровне Внедрения Зависимостей, используя Depends.

Причем для обеспечения требований безопасности можно использовать любую модель или данные (в данном случае - Pydantic-модель User).

Но вы не ограничены использованием какой-то конкретной моделью данных, классом или типом.

Вы хотите использовать в модели id и email, а username вам не нужен? Ну разумеется. Воспользуйтесь тем же инструментарием.

Вам нужны только строки? Или только словари? Или непосредственно экземпляр модели класса базы данных? Все это работает точно также.

У вас нет пользователей, которые входят в ваше приложение, а только роботы, боты или другие системы, у которых есть только токен доступа? Опять же, все работает одинаково.

Просто используйте любую модель, любой класс, любую базу данных, которые нужны для вашего приложения. Система внедрения зависимостей FastAPI поможет вам в этом.

Размер кода

Этот пример может показаться многословным. Следует иметь в виду, что в одном файле мы смешиваем безопасность, модели данных, служебные функции и эндпоинты.

Но вот ключевой момент:

Все, что касается безопасности и внедрения зависимостей, пишется один раз.

И вы можете сделать его настолько сложным, насколько захотите. И все это будет написано только один раз, в одном месте, со всей своей гибкостью.

И у вас могут быть тысячи конечных точек (эндпоинтов), использующих одну и ту же систему безопасности.

И все они (или любая их часть по вашему желанию) могут воспользоваться преимуществами повторного использования этих зависимостей или любых других зависимостей, которые вы создадите.

И все эти тысячи эндпоинтов могут составлять всего 3 строки:

{* ../../docs_src/security/tutorial002_an_py310.py hl[30:32] *}

Резюме

Теперь вы можете получать данные о текущем пользователе непосредственно в своей функции обработчике эндпоинта.

Мы уже на полпути к этому.

Осталось лишь добавить эндпоинт для отправки пользователем/клиентом своих имени пользователя и пароля.

Это будет рассмотрено в следующем разделе.