diff --git a/docs/ru/docs/tutorial/security/get-current-user.md b/docs/ru/docs/tutorial/security/get-current-user.md new file mode 100644 index 000000000..523810462 --- /dev/null +++ b/docs/ru/docs/tutorial/security/get-current-user.md @@ -0,0 +1,288 @@ +# Текущий пользователь + +В предыдущей главе система безопасности (основанная на системе внедрения зависимостей) передавала *функции операции пути* `токен` в виде `строки`: + +=== "Python 3.9+" + + ```Python hl_lines="12" + {!> ../../../docs_src/security/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="11" + {!> ../../../docs_src/security/tutorial001_an.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="10" + {!> ../../../docs_src/security/tutorial001.py!} + ``` + +Но это все равно не достаточно полезно. + +Давайте сделаем так, чтобы он выдавал нам текущего пользователя. + +## Создание модели пользователя + +Сначала создадим Pydantic-модель пользователя. + +Точно так же, как мы используем Pydantic для объявления тела запроса в *функции операции пути*, мы можем использовать его и в других местах: + +=== "Python 3.10+" + + ```Python hl_lines="5 12-16" + {!> ../../../docs_src/security/tutorial002_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="5 12-16" + {!> ../../../docs_src/security/tutorial002_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="5 13-17" + {!> ../../../docs_src/security/tutorial002_an.py!} + ``` + +=== "Python 3.10+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="3 10-14" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="5 12-16" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +## Создание зависимости `get_current_user` + +Давайте создадим зависимость `get_current_user`. + +Помните, что у зависимостей могут быть подзависимости? + +`get_current_user` как раз будет иметь подзависимость `oauth2_scheme`, которую мы создали ранее. + +Аналогично тому, как мы делали это ранее в *операции пути* наша новая зависимость `get_current_user` будет получать `token` в виде `строки` от подзависимости `oauth2_scheme`: + +=== "Python 3.10+" + + ```Python hl_lines="25" + {!> ../../../docs_src/security/tutorial002_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="25" + {!> ../../../docs_src/security/tutorial002_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="26" + {!> ../../../docs_src/security/tutorial002_an.py!} + ``` + +=== "Python 3.10+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="23" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="25" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +## Получение пользователя + +`get_current_user` будет использовать созданную нами (ненастоящую) служебную функцию, которая принимает токен в виде `строки` и возвращает нашу Pydantic-модель `User`: + +=== "Python 3.10+" + + ```Python hl_lines="19-22 26-27" + {!> ../../../docs_src/security/tutorial002_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="19-22 26-27" + {!> ../../../docs_src/security/tutorial002_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="20-23 27-28" + {!> ../../../docs_src/security/tutorial002_an.py!} + ``` + +=== "Python 3.10+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="17-20 24-25" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="19-22 26-27" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +## Внедрение текущего пользователя + +Теперь мы можем использовать тот же `Depends` с нашей записимостью `get_current_user` в *функции операции пути*: + +=== "Python 3.10+" + + ```Python hl_lines="31" + {!> ../../../docs_src/security/tutorial002_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="31" + {!> ../../../docs_src/security/tutorial002_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="32" + {!> ../../../docs_src/security/tutorial002_an.py!} + ``` + +=== "Python 3.10+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="29" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="31" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +Обратите внимание, что мы объявляем тип переменной `current_user` как Pydantic-модель `User`. + +Это поможет редактору выполнить внутри функции все проверки автозаполнения и типа. + +!!! tip "Подсказка" + Возможно, вы помните, что тело запроса также объявляется с помощью Pydantic-моделей. + + В этом месте **FastAPI** не запутается в том, что вы используете именно `Depends`. + +!!! check "Заметка" + То, как устроена эта система зависимостей, позволяет нам иметь различные зависимости, которые возвращают модель `User`. + + Мы не ограничены наличием только одной зависимости, которая может возвращать данные такого типа. + +## Другие модели + +Теперь вы можете получать информацию о текущем пользователе непосредственно в *функции операции пути* и работать с механизмами безопасности на уровне **Внедрения Записимостей**, используя `Depends`. + +Причем для обеспечения требований безопасности можно использовать любую модель или данные (в данном случае - Pydantic-модель `User`). + +Но вы не ограничены использованием какой-то конкретной моделю данных, классом или типом. + +Вы хотите иметь `id` и `email` и не иметь в модели никакого `username`? Конечно. Вы можете использовать эти же инструменты. + +Вы хотите иметь только `строки`? Или только `словари`? Или непосредственно экземпляр модели класса базы данных? Все это работает одинаково. + +У вас нет пользователей, которые входят в ваше приложение, а только роботы, боты или другие системы, у которых есть только токен доступа? Опять же, все работает одинаково. + +Просто используйте любую модель, любой класс, любую базу данных, которые нужны для вашего приложения. Система внедрения зависимостей **FastAPI** поможет вам в этом. + +## Размер кода + +Этот пример может показаться многословным. Следует иметь в виду, что в одном файле мы смешиваем безопасность, модели данных, служебные функции и *операции путей*. + +Но вот ключевой момент: + +Все, что касается безопасности и внедрения зависимостей, пишется один раз. + +И вы можете сделать его настолько сложным, насколько захотите. И все это будет написано только один раз, в одном месте, со всей своей гибкостью. + +И у вас могут быть тысячи конечных точек (*операций путей*), использующих одну и ту же систему безопасности. + +И все они (или любая их часть по вашему желанию) могут воспользоваться преимуществами повторного использования этих зависимостей или любых других зависимостей, которые вы создадите. + +И все эти тысячи *операций путей* могут составлять всего 3 строки: + +=== "Python 3.10+" + + ```Python hl_lines="30-32" + {!> ../../../docs_src/security/tutorial002_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="30-32" + {!> ../../../docs_src/security/tutorial002_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="31-33" + {!> ../../../docs_src/security/tutorial002_an.py!} + ``` + +=== "Python 3.10+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="28-30" + {!> ../../../docs_src/security/tutorial002_py310.py!} + ``` + +=== "Python 3.8+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="30-32" + {!> ../../../docs_src/security/tutorial002.py!} + ``` + +## Резюме + +Теперь вы можете получать данные о текущем пользователе непосредственно в своей *функции операции пути*. + +Мы уже на полпути к этому. + +Осталось лишь добавить *операцию пути* для отправки пользователем/клиентом своих `имени пользователя` и `пароля`. + +Это будет дальше.