Date: Tue, 10 Dec 2024 13:34:19 +0200
Subject: [PATCH 081/106] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?=
=?UTF-8?q?ion=20for=20`docs/ru/docs/virtual-environments.md`=20(#13026)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/ru/docs/virtual-environments.md | 839 +++++++++++++++++++++++++++
1 file changed, 839 insertions(+)
create mode 100644 docs/ru/docs/virtual-environments.md
diff --git a/docs/ru/docs/virtual-environments.md b/docs/ru/docs/virtual-environments.md
new file mode 100644
index 000000000..777adaf22
--- /dev/null
+++ b/docs/ru/docs/virtual-environments.md
@@ -0,0 +1,839 @@
+# Виртуальная среда
+
+При работе с проектами в Python рекомендуется использовать **виртуальную среду разработки** (или какой-нибудь другой подобный механизм). Это нужно для того, чтобы изолировать устанавливаемые пакеты для каждого отдельного проекта.
+
+/// info | Дополнительная информация
+
+Если вы уже знакомы с виртуальными средами разработки, знаете как их создавать и использовать, то вы можете свободно пропустить данный раздел. 🤓
+
+///
+
+/// tip | Подсказка
+
+**Виртуальная среда** и **переменная окружения** это две разные вещи.
+
+**Переменная окружения** это системная переменная, которую могут использовать программы.
+
+**Виртуальная среда** это папка, содержащая файлы.
+
+///
+
+/// info | Дополнительная информация
+
+В этом разделе мы научим вас пользоваться виртуальными средами разработки и расскажем, как они работают.
+
+Если же вы готовы воспользоваться инструментом, **который умеет управлять всем, что касается Python-проектов**,
+(включая установку Python), то попробуйте uv.
+
+///
+
+## Создание проекта
+
+В первую очередь, создайте директорию для вашего проекта.
+
+Я обычно создаю папку под названием `code` внутри моего домашнего каталога `/home/user`.
+
+Затем внутри данной папки я создаю отдельную директорию под каждый свой проект.
+
+
+
+```console
+// Перейдите в домашний каталог
+$ cd
+// Создайте отдельную папку под все будущие программные проекты (code)
+$ mkdir code
+// Войдите в директорию code
+$ cd code
+// Создайте директрорию под данный проект (awesome-project)
+$ mkdir awesome-project
+// Перейдите в созданную директорию проекта
+$ cd awesome-project
+```
+
+
+
+## Создание виртуальной среды разработки
+
+Начиная работу с Python-проектом, сразу же создавайте виртуальную среду разработки
+**внутри вашего проекта**.
+
+/// tip | Подсказка
+
+Виртуальная среда разработки создается один раз, и в дальнейшем, работая с проектом, этого больше делать не придется.
+
+///
+
+//// tab | `venv`
+
+Для создания виртуальной среды вы можете воспользоваться модулем `venv`, который является частью встроенной библиотеки Python.
+
+
+
+```console
+$ python -m venv .venv
+```
+
+
+
+/// details | Что делает эта команда?
+
+* `python`: использовать программу под именем `python`
+* `-m`: вызывать модуль как скрипт, в следующей инструкции мы скажем какой именно модуль вызвать
+* `venv`: использовать модуль под названием `venv`, который обычно устанавливается вместе с Python
+* `.venv`: создать виртуальную среду разработки в новой директории `.venv`
+
+///
+
+////
+
+//// tab | `uv`
+
+Если вы установили `uv`, то вы можете им воспользоваться для создания виртуальной среды разработки.
+
+
+
+```console
+$ uv venv
+```
+
+
+
+/// tip | Подсказка
+
+По умолчанию `uv` создаст виртуальную среду разработки в папке под названием `.venv`.
+
+Но вы можете это изменить, передав дополнительный аргумент с именем директории.
+
+///
+
+////
+
+Данная команда создаст новую виртуальную среду разработки в папке `.venv`.
+
+/// details | `.venv` или другое имя?
+
+Вы можете поместить виртуальную среду разработки в папку с другим именем, но традиционным (конвенциональным) названием является `.venv` .
+
+///
+
+## Активация виртуальной среды разработки
+
+Активируйте виртуальную среду разработки, и тогда любая запускаемая Python-команда или устанавливаемый пакет будут ее использовать.
+
+/// tip | Подсказка
+
+При работе над проектом делайте это **каждый раз** при запуске **новой сессии в терминале**.
+
+///
+
+//// tab | Linux, macOS
+
+
+
+```console
+$ source .venv/bin/activate
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ .venv\Scripts\Activate.ps1
+```
+
+
+
+////
+
+//// tab | Windows Bash
+
+Или при использовании Bash для Windows (напр. Git Bash):
+
+
+
+```console
+$ source .venv/Scripts/activate
+```
+
+
+
+////
+
+## Проверка активации виртуальной среды
+
+Проверьте, активна ли виртуальная среда (удостоверимся, что предыдущая команда сработала).
+
+/// tip | Подсказка
+
+Убедитесь в том, что все работает так, как нужно и вы используете именно ту виртуальную среду разработки, которую нужно. Делать это необязательно, но желательно.
+
+///
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+$ which python
+
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+
+
+Если данная команда показывает, что исполняемый файл `python` (`.venv\bin\python`), находится внутри виртуальной среды вашего проекта (у нас это `awesome-project`), значит все отработало как нужно. 🎉
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ Get-Command python
+
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+
+
+Если данная команда показывает, что исполняемый файл `python` (`.venv\Scripts\python`), находится внутри виртуальной среды вашего проекта (у нас это `awesome-project`), значит все отработало как нужно. 🎉
+
+////
+
+## Обновление `pip`
+
+/// tip | Подсказка
+
+Если вы используете `uv`, то вы должны будете его использовать для установки пакетов вместо `pip`, поэтому обновлять `pip` вам ненужно. 😎
+
+///
+
+Если для установки пакетов вы используете `pip` (он устанавливается по умолчанию вместе с Python), то обновите `pip` до последней версии.
+
+Большинство экзотических ошибок, возникающих при установке пакетов, устраняется предварительным обновлением `pip`.
+
+/// tip | Подсказка
+
+Обычно это делается только один раз, сразу после создания виртуальной среды разработки.
+
+///
+
+Убедитесь в том, что виртуальная среда активирована (с помощью вышеуказанной команды) и запустите следующую команду:
+
+
+
+```console
+$ python -m pip install --upgrade pip
+
+---> 100%
+```
+
+
+
+## Добавление `.gitignore`
+
+Если вы используете **Git** (а вы должны его использовать), то добавьте файл `.gitignore` и исключите из Git всё, что находится в папке `.venv`.
+
+/// tip | Подсказка
+
+Если для создания виртуальной среды вы используете `uv`, то для вас все уже сделано и вы можете пропустить этот шаг. 😎
+
+///
+
+/// tip | Подсказка
+
+Это делается один раз, сразу после создания виртуальной среды разработки.
+
+///
+
+
+
+```console
+$ echo "*" > .venv/.gitignore
+```
+
+
+
+/// details | Что делает эта команда?
+
+* `echo "*"`: напечатать `*` в консоли (следующий шаг это слегка изменит)
+* `>`: все что находится слева от `>` не печатать в консоль, но записать в файл находящийся справа от `>`
+* `.gitignore`: имя файла, в который нужно записать текст.
+
+`*` в Git означает "всё". Т.е. будет проигнорировано всё, что содержится в папке `.venv`.
+
+Данная команда создаст файл `.gitignore` следующего содержания:
+
+```gitignore
+*
+```
+
+///
+
+## Установка пакетов
+
+После установки виртуальной среды, вы можете устанавливать в нее пакеты.
+
+/// tip | Подсказка
+
+Сделайте это **один раз**, при установке или обновлении пакетов, нужных вашему проекту.
+
+Если вам понадобится обновить версию пакета или добавить новый пакет, то вы должны будете **сделать это снова**.
+
+///
+
+### Установка пакетов напрямую
+
+Если вы торопитесь и не хотите объявлять зависимости проекта в отдельном файле, то вы можете установить их напрямую.
+
+/// tip | Подсказка
+
+Объявление пакетов, которые использует ваш проект, и их версий в отдельном файле (например, в `requirements.txt` или в `pyproject.toml`) - это отличная идея.
+
+///
+
+//// tab | `pip`
+
+
+
+```console
+$ pip install "fastapi[standard]"
+
+---> 100%
+```
+
+
+
+////
+
+//// tab | `uv`
+
+Если вы используете `uv`:
+
+
+
+```console
+$ uv pip install "fastapi[standard]"
+---> 100%
+```
+
+
+
+////
+
+### Установка из `requirements.txt`
+
+Если у вас есть `requirements.txt`, то вы можете использовать его для установки пакетов.
+
+//// tab | `pip`
+
+
+
+```console
+$ pip install -r requirements.txt
+---> 100%
+```
+
+
+
+////
+
+//// tab | `uv`
+
+Если вы используете `uv`:
+
+
+
+```console
+$ uv pip install -r requirements.txt
+---> 100%
+```
+
+
+
+////
+
+/// details | `requirements.txt`
+
+`requirements.txt` с парочкой пакетов внутри выглядит приблизительно так:
+
+```requirements.txt
+fastapi[standard]==0.113.0
+pydantic==2.8.0
+```
+
+///
+
+## Запуск программы
+
+После активации виртуальной среды разработки вы можете запустить свою программу и она будет использовать версию Python и пакеты, установленные в виртуальной среде.
+
+
+
+```console
+$ python main.py
+
+Hello World
+```
+
+
+
+## Настройка редактора
+
+Вероятно, вы захотите воспользоваться редактором. Убедитесь, что вы настроили его на использование той самой виртуальной среды, которую вы создали. (Скорее всего, она автоматически будет обнаружена). Это позволит вам использовать авто-завершение и выделение ошибок в редакторе.
+
+Например:
+
+* VS Code
+* PyCharm
+
+/// tip | Подсказка
+
+Обычно это делается один раз, при создании виртуальной среды разработки.
+
+///
+
+## Деактивация виртуальной среды разработки
+
+По окончании работы над проектом вы можете деактивировать виртуальную среду.
+
+
+
+```console
+$ deactivate
+```
+
+
+
+Таким образом, при запуске `python`, будет использована версия `python` установленная глобально, а не из этой виртуальной среды вместе с установленными в ней пакетами.
+
+## Все готово к работе
+
+Теперь вы готовы к тому, чтобы начать работу над своим проектом.
+
+
+
+/// tip | Подсказка
+
+Хотите разобраться со всем, что написано выше?
+
+Продолжайте читать. 👇🤓
+
+///
+
+## Зачем использовать виртуальную среду?
+
+Для работы с FastAPI вам потребуется установить Python.
+
+После этого вам нужно будет **установить** FastAPI и другие **пакеты**, которые вы собираетесь использовать.
+
+Для установки пакетов обычно используют `pip`, который устанавливается вместе с Python (или же используют альтернативные решения).
+
+Тем не менее, если вы просто используете `pip` напрямую, то пакеты будут установлены в **глобальное Python-окружение** (глобально установленный Python).
+
+### Проблема
+
+Так в чем же проблема с установкой пакетов в глобальную среду Python?
+
+В какой-то момент вам, вероятно, придется писать множество разных программ, которые используют различные пакеты. 😱
+
+Например, вы создаете проект `philosophers-stone`, который зависит от пакета под названием **`harry`, версии `1`**. Таким образом, вам нужно установить `harry`.
+
+```mermaid
+flowchart LR
+ stone(philosophers-stone) -->|requires| harry-1[harry v1]
+```
+
+Затем, в какой-то момент, вы создаете другой проект под названием `prisoner-of-azkaban`, и этот проект тоже зависит от `harry`, но он уже использует **`harry` версии `3`**.
+
+```mermaid
+flowchart LR
+ azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
+```
+
+Проблема заключается в том, что при установке в глобальное окружение, а не в локальную виртуальную среду разработки, вам нужно будет выбирать, какую версию пакета `harry` устанавливать.
+
+Если вам нужен `philosophers-stone`, то вам нужно сначала установить `harry` версии `1`:
+
+
+
+```console
+$ pip install "harry==1"
+```
+
+
+
+И тогда в вашем глобальном окружении Python будет установлен `harry` версии `1`:
+
+```mermaid
+flowchart LR
+ subgraph global[global env]
+ harry-1[harry v1]
+ end
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) -->|requires| harry-1
+ end
+```
+
+Но если позднее вы захотите запустить `prisoner-of-azkaban`, то вам нужно будет удалить `harry` версии 1, и установить `harry` версии `3` (при установке пакета версии `3` поверх пакета версии `1`, пакет версии `1` удаляется автоматически).
+
+
+
+```console
+$ pip install "harry==3"
+```
+
+
+
+И тогда, в вашей глобальной среде окружения Python, будет установлен пакет `harry` версии `3`.
+
+И когда вы снова попытаетесь запустить `philosophers-stone`, то существует вероятность того, что он не будет работать, так как он использует `harry` версии `1`.
+
+```mermaid
+flowchart LR
+ subgraph global[global env]
+ harry-1[harry v1]
+ style harry-1 fill:#ccc,stroke-dasharray: 5 5
+ harry-3[harry v3]
+ end
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) -.-x|⛔️| harry-1
+ end
+ subgraph azkaban-project[prisoner-of-azkaban project]
+ azkaban(prisoner-of-azkaban) --> |requires| harry-3
+ end
+```
+
+/// tip | Подсказка
+
+В пакетах Python очень часто стараются изо всех сил избегать внесения критических изменений в новые версии, но лучше перестраховаться и планово устанавливать новые версии, а затем запускать тесты, чтобы проверить, все ли работает правильно.
+
+///
+
+Теперь представьте, что это происходит со многими другими пакетами, которые используются в ваших проектах. С этим очень сложно справиться. И скорее всего, в конечном итоге вы будете запускать некоторые проекты с некоторыми несовместимыми зависимостями и не будете знать, почему что-то не работает.
+
+Кроме того, в зависимости от вашей операционной системы (напр. Linux, Windows, macOS), она может поставляться с уже установленным Python. Вероятно, что в этом случае в ней уже установлены системные пакеты определенных версий. Если вы устанавливаете пакеты глобально, то вы можете **поломать** программы, являющиеся частью ОС.
+
+## Куда устанавливаются пакеты?
+
+Когда вы устанавливаете Python, то на вашей машине создается некоторое количество директорий, содержащих некоторое количество файлов.
+
+Среди них есть каталоги, отвечающие за хранение всех устанавливаемых вами пакетов.
+
+Когда вы запустите команду:
+
+
+
+```console
+// Не запускайте эту команду, это просто пример 🤓
+$ pip install "fastapi[standard]"
+---> 100%
+```
+
+
+
+То будет скачан сжатый файл, содержащий код FastAPI, обычно скачивание происходит с PyPI.
+
+Также будут скачаны файлы, содержащие пакеты, которые использует FastAPI.
+
+Затем все файлы будут извлечены и помещены в директорию на вашем компьютере.
+
+По умолчанию эти файлы будут загружены и извлечены в один из каталогов установки Python, т.е. в глобальную среду.
+
+## Что такое виртуальная среда разработки?
+
+Решением проблемы размещения всех пакетов в глобальной среде будет использование отдельной виртуальной среды под каждый проект, над которым вы работаете.
+
+Виртуальная среда это обычная папка, очень похожая на глобальную, куда вы можете устанавливать пакеты для вашего проекта.
+
+Таким образом, каждый проект будет иметь свою отдельную виртуальную среду разработки (в директории `.venv`) вместе со своими пакетами.
+
+```mermaid
+flowchart TB
+ subgraph stone-project[philosophers-stone project]
+ stone(philosophers-stone) --->|requires| harry-1
+ subgraph venv1[.venv]
+ harry-1[harry v1]
+ end
+ end
+ subgraph azkaban-project[prisoner-of-azkaban project]
+ azkaban(prisoner-of-azkaban) --->|requires| harry-3
+ subgraph venv2[.venv]
+ harry-3[harry v3]
+ end
+ end
+ stone-project ~~~ azkaban-project
+```
+
+## Что означает активация виртуальной среды?
+
+Когда вы активируете виртуальную среду разработки, например, так:
+
+//// tab | Linux, macOS
+
+
+
+```console
+$ source .venv/bin/activate
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ .venv\Scripts\Activate.ps1
+```
+
+
+
+////
+
+//// tab | Windows Bash
+
+Или если вы воспользуетесь Bash под Windows (напр. Git Bash):
+
+
+
+```console
+$ source .venv/Scripts/activate
+```
+
+
+
+////
+
+
+Эта команда создаст или изменит некоторые [переменные окружения](environment-variables.md){.internal-link target=_blank}, которые будут доступны для последующих команд.
+
+Одной из таких переменных является `PATH`.
+
+/// tip | Подсказка
+
+Вы можете узнать больше о переменной окружения `PATH` в разделе [Переменные окружения](environment-variables.md#path-environment-variable){.internal-link target=_blank}.
+
+///
+
+При активации виртуальной среды путь `.venv/bin` (для Linux и macOS) или `.venv\Scripts` (для Windows) добавляется в переменную окружения `PATH`.
+
+Предположим, что до активации виртуальной среды переменная `PATH` выглядела так:
+
+//// tab | Linux, macOS
+
+```plaintext
+/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+Это означает, что система ищет программы в следующих каталогах:
+
+* `/usr/bin`
+* `/bin`
+* `/usr/sbin`
+* `/sbin`
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Windows\System32
+```
+
+Это означает, что система ищет программы в:
+
+* `C:\Windows\System32`
+
+////
+
+После активации виртуальной среды переменная окружение `PATH` будет выглядеть примерно так:
+
+//// tab | Linux, macOS
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
+```
+
+Это означает, что система теперь будет искать программы в:
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin
+```
+
+прежде чем начать искать в других каталогах.
+
+Таким образом, когда вы введете в консоль `python`, система будет искать Python в
+
+```plaintext
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+и будет использовать именно его.
+
+////
+
+//// tab | Windows
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
+```
+
+Это означает, что система в первую очередь начнет искать программы в:
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts
+```
+
+прежде чем начать искать в других директориях.
+
+Таким образом, если вы введете в консоль команду `python`, то система найдет Python в:
+
+```plaintext
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+и использует его.
+
+////
+
+Очень важной деталью является то, что путь к виртуальной среде будет помещен в самое начало переменной `PATH`. Система обнаружит данный путь к Python раньше, чем какой-либо другой. Таким образом, при запуске команды `python`, будет использован именно Python из виртуальной среды разработки, а не какой-нибудь другой (например, Python из глобальной среды)
+
+Активация виртуальной среды разработки также меняет и несколько других вещей, но данная функция является основной.
+
+## Проверка виртуальной среды
+
+Когда вы проверяете активна ли виртуальная среда разработки, например, так:
+
+//// tab | Linux, macOS, Windows Bash
+
+
+
+```console
+$ which python
+
+/home/user/code/awesome-project/.venv/bin/python
+```
+
+
+
+////
+
+//// tab | Windows PowerShell
+
+
+
+```console
+$ Get-Command python
+
+C:\Users\user\code\awesome-project\.venv\Scripts\python
+```
+
+
+
+////
+
+Это означает, что будет использоваться `python` **из виртуальной среды разработки**.
+
+Вы используете `which` для Linux и macOS и `Get-Command` для Windows PowerShell.
+
+Эта команда работает следующим образом: она проверяет переменную окружения `PATH`, проходя по очереди каждый указанный путь в поисках программы под названием `python`. И когда она её находит, то возвращает путь к данной программе.
+
+Основной момент при вызове команды `python` состоит в том, какой именно "`python`" будет запущен.
+
+Таким образом, вы можете убедиться, что используете правильную виртуальную среду разработки.
+
+/// tip | Подсказка
+
+Легко активировать одну виртуальную среду, вызвать один Python и **перейти к следующему проекту**.
+
+И следующий проект не будет работать потому, что вы используете **неправильный Python** из виртуальной среды другого проекта.
+
+Так что, будет нелишним проверить, какой `python` вы используете. 🤓
+
+///
+
+## Зачем деактивируют виртуальную среду?
+
+Предположим, что вы работаете над проектом `philosophers-stone`, **активируете виртуальную среду разработки**, устанавливаете пакеты и работаете с данной средой.
+
+И позже вам понадобилось поработать с **другим проектом** `prisoner-of-azkaban`.
+
+Вы переходите к этому проекту:
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+```
+
+
+
+Если вы не деактивировали виртуальное окружение проекта `philosophers-stone`, то при запуске `python` через консоль будет вызван Python из `philosophers-stone`
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+
+$ python main.py
+
+// Error importing sirius, it's not installed 😱
+Traceback (most recent call last):
+ File "main.py", line 1, in
+ import sirius
+```
+
+
+
+Но если вы деактивируете виртуальную среду разработки и активируете новую среду для `prisoner-of-askaban`, то вы тогда запустите Python из виртуального окружения `prisoner-of-azkaban`.
+
+
+
+```console
+$ cd ~/code/prisoner-of-azkaban
+
+// Вам не требуется находится в старой директории для деактивации среды разработки, вы можете это сделать откуда угодно, даже из каталога другого проекта, в который вы перешли. 😎
+$ deactivate
+
+// Активируйте виртуальную среду разработки в prisoner-of-azkaban/.venv 🚀
+$ source .venv/bin/activate
+
+// Тепреь, когда вы запустите python, он найдет пакет sirius, установленный в виртуальной среде ✨
+$ python main.py
+
+Я торжественно клянусь в этом! 🐺
+```
+
+
+
+## Альтернативы
+
+Это простое руководство поможет вам начать работу и научит тому, как всё работает **изнутри**.
+
+Существует много альтернативных решений для работы с виртуальными средами разработки, с программными зависимостями, а также с проектами.
+
+Когда вы будете готовы использовать единый инструмент для управления проектом, программными зависимостями, виртуальными средами разработки и т.д., то я рекомендую вам попробовать uv.
+
+`uv` может очень многое. Он умеет:
+
+* **Устанавливать Python**, включая установку различных версий
+* Управлять средой виртуального окружения вашего проекта
+* Устанавливать **пакеты**
+* Управлять пакетами и их версиями внутри вашего проекта
+* Удостовериться, что вы используете **точный** набор пакетов и версий при установке, включая зависимости. Таким образом, вы можете быть уверенны, что проект, запускается в production, точно также, как и при разработке, этот механизм называется *locking*
+* Многие другие вещи
+
+## Заключение
+
+Если вы прочитали и поняли всё это, то теперь вы знаете **гораздо больше** о виртуальных средах разработки, чем многие другие разработчики. 🤓
+
+Скорее всего, знание этих деталей будет полезно вам в будущем. Когда вы будете отлаживать что-то, кажущееся сложным, вы будете знать, **как это работает под капотом**. 😎
From fed6fab8f9f2776b4dc847ac78d3ed6f256c63f6 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Tue, 10 Dec 2024 11:35:32 +0000
Subject: [PATCH 082/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 219c01f84..f51b9c373 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Add Russian translation for `docs/ru/docs/virtual-environments.md`. PR [#13026](https://github.com/fastapi/fastapi/pull/13026) by [@alv2017](https://github.com/alv2017).
* 🌐 Add Korean translation for `docs/ko/docs/tutorial/testing.md`. PR [#12968](https://github.com/fastapi/fastapi/pull/12968) by [@jts8257](https://github.com/jts8257).
* 🌐 Add Korean translation for `docs/ko/docs/advanced/async-test.md`. PR [#12918](https://github.com/fastapi/fastapi/pull/12918) by [@icehongssii](https://github.com/icehongssii).
* 🌐 Add Russian translation for `docs/ru/docs/tutorial/security/oauth2-jwt.md`. PR [#10601](https://github.com/fastapi/fastapi/pull/10601) by [@AlertRED](https://github.com/AlertRED).
From 6455f4bb0148d3cb45a25403b39959f90c98a2f3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 10 Dec 2024 20:34:48 +0000
Subject: [PATCH 083/106] =?UTF-8?q?=E2=AC=86=20Bump=20pypa/gh-action-pypi-?=
=?UTF-8?q?publish=20from=201.12.2=20to=201.12.3=20(#13055)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.12.2 to 1.12.3.
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.12.2...v1.12.3)
---
updated-dependencies:
- dependency-name: pypa/gh-action-pypi-publish
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
.github/workflows/publish.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index fc61c3fca..38df75928 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -35,7 +35,7 @@ jobs:
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }}
run: python -m build
- name: Publish
- uses: pypa/gh-action-pypi-publish@v1.12.2
+ uses: pypa/gh-action-pypi-publish@v1.12.3
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
From 727ce82e9b024a8d1b2f98ecb2911ba5b50cc146 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Tue, 10 Dec 2024 20:35:10 +0000
Subject: [PATCH 084/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index f51b9c373..599883d64 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -36,6 +36,7 @@ hide:
### Internal
+* ⬆ Bump pypa/gh-action-pypi-publish from 1.12.2 to 1.12.3. PR [#13055](https://github.com/fastapi/fastapi/pull/13055) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump types-ujson from 5.7.0.1 to 5.10.0.20240515. PR [#13018](https://github.com/fastapi/fastapi/pull/13018) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump black from 24.3.0 to 24.10.0. PR [#13014](https://github.com/fastapi/fastapi/pull/13014) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump inline-snapshot from 0.13.0 to 0.14.0. PR [#13017](https://github.com/fastapi/fastapi/pull/13017) by [@dependabot[bot]](https://github.com/apps/dependabot).
From 0d496337769bad0c442b3c8ac505418570876a46 Mon Sep 17 00:00:00 2001
From: Zhongheng Cheng
Date: Tue, 10 Dec 2024 15:36:08 -0500
Subject: [PATCH 085/106] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?=
=?UTF-8?q?ion=20for=20`docs/zh/docs/tutorial/request-form-models.md`=20(#?=
=?UTF-8?q?13045)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/zh/docs/tutorial/request-form-models.md | 78 ++++++++++++++++++++
1 file changed, 78 insertions(+)
create mode 100644 docs/zh/docs/tutorial/request-form-models.md
diff --git a/docs/zh/docs/tutorial/request-form-models.md b/docs/zh/docs/tutorial/request-form-models.md
new file mode 100644
index 000000000..e639e4b9f
--- /dev/null
+++ b/docs/zh/docs/tutorial/request-form-models.md
@@ -0,0 +1,78 @@
+# 表单模型
+
+您可以使用 **Pydantic 模型**在 FastAPI 中声明**表单字段**。
+
+/// info
+
+要使用表单,需预先安装 `python-multipart` 。
+
+确保您创建、激活一个[虚拟环境](../virtual-environments.md){.internal-link target=_blank}后再安装。
+
+```console
+$ pip install python-multipart
+```
+
+///
+
+/// note
+
+自 FastAPI 版本 `0.113.0` 起支持此功能。🤓
+
+///
+
+## 表单的 Pydantic 模型
+
+您只需声明一个 **Pydantic 模型**,其中包含您希望接收的**表单字段**,然后将参数声明为 `Form` :
+
+{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *}
+
+**FastAPI** 将从请求中的**表单数据**中**提取**出**每个字段**的数据,并提供您定义的 Pydantic 模型。
+
+## 检查文档
+
+您可以在文档 UI 中验证它,地址为 `/docs` :
+
+
+

+
+
+## 禁止额外的表单字段
+
+在某些特殊使用情况下(可能并不常见),您可能希望将表单字段**限制**为仅在 Pydantic 模型中声明过的字段,并**禁止**任何**额外**的字段。
+
+/// note
+
+自 FastAPI 版本 `0.114.0` 起支持此功能。🤓
+
+///
+
+您可以使用 Pydantic 的模型配置来禁止( `forbid` )任何额外( `extra` )字段:
+
+{* ../../docs_src/request_form_models/tutorial002_an_py39.py hl[12] *}
+
+如果客户端尝试发送一些额外的数据,他们将收到**错误**响应。
+
+例如,如果客户端尝试发送这样的表单字段:
+
+* `username`: `Rick`
+* `password`: `Portal Gun`
+* `extra`: `Mr. Poopybutthole`
+
+他们将收到一条错误响应,表明字段 `extra` 是不被允许的:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["body", "extra"],
+ "msg": "Extra inputs are not permitted",
+ "input": "Mr. Poopybutthole"
+ }
+ ]
+}
+```
+
+## 总结
+
+您可以使用 Pydantic 模型在 FastAPI 中声明表单字段。😎
From 6c8deb5a4f69faf1611689db7d9fec1478c270c3 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Tue, 10 Dec 2024 20:36:33 +0000
Subject: [PATCH 086/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 599883d64..06426daf7 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/request-form-models.md`. PR [#13045](https://github.com/fastapi/fastapi/pull/13045) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Add Russian translation for `docs/ru/docs/virtual-environments.md`. PR [#13026](https://github.com/fastapi/fastapi/pull/13026) by [@alv2017](https://github.com/alv2017).
* 🌐 Add Korean translation for `docs/ko/docs/tutorial/testing.md`. PR [#12968](https://github.com/fastapi/fastapi/pull/12968) by [@jts8257](https://github.com/jts8257).
* 🌐 Add Korean translation for `docs/ko/docs/advanced/async-test.md`. PR [#12918](https://github.com/fastapi/fastapi/pull/12918) by [@icehongssii](https://github.com/icehongssii).
From 9802b90b66b69ac2cca5fef2abada92f3e94a2e0 Mon Sep 17 00:00:00 2001
From: Zhongheng Cheng
Date: Tue, 10 Dec 2024 15:38:03 -0500
Subject: [PATCH 087/106] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?=
=?UTF-8?q?ion=20for=20`docs/zh/docs/tutorial/cookie-param-models.md`=20(#?=
=?UTF-8?q?13038)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/zh/docs/tutorial/cookie-param-models.md | 76 ++++++++++++++++++++
1 file changed, 76 insertions(+)
create mode 100644 docs/zh/docs/tutorial/cookie-param-models.md
diff --git a/docs/zh/docs/tutorial/cookie-param-models.md b/docs/zh/docs/tutorial/cookie-param-models.md
new file mode 100644
index 000000000..6a7b09e25
--- /dev/null
+++ b/docs/zh/docs/tutorial/cookie-param-models.md
@@ -0,0 +1,76 @@
+# Cookie 参数模型
+
+如果您有一组相关的 **cookie**,您可以创建一个 **Pydantic 模型**来声明它们。🍪
+
+这将允许您在**多个地方**能够**重用模型**,并且可以一次性声明所有参数的验证方式和元数据。😎
+
+/// note
+
+自 FastAPI 版本 `0.115.0` 起支持此功能。🤓
+
+///
+
+/// tip
+
+此技术同样适用于 `Query` 、 `Cookie` 和 `Header` 。😎
+
+///
+
+## 带有 Pydantic 模型的 Cookie
+
+在 **Pydantic** 模型中声明所需的 **cookie** 参数,然后将参数声明为 `Cookie` :
+
+{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
+
+**FastAPI** 将从请求中接收到的 **cookie** 中**提取**出**每个字段**的数据,并提供您定义的 Pydantic 模型。
+
+## 查看文档
+
+您可以在文档 UI 的 `/docs` 中查看定义的 cookie:
+
+
+

+
+
+/// info
+
+请记住,由于**浏览器**以特殊方式**处理 cookie**,并在后台进行操作,因此它们**不会**轻易允许 **JavaScript** 访问这些 cookie。
+
+如果您访问 `/docs` 的 **API 文档 UI**,您将能够查看您*路径操作*的 cookie **文档**。
+
+但是即使您**填写数据**并点击“执行”,由于文档界面使用 **JavaScript**,cookie 将不会被发送。而您会看到一条**错误**消息,就好像您没有输入任何值一样。
+
+///
+
+## 禁止额外的 Cookie
+
+在某些特殊使用情况下(可能并不常见),您可能希望**限制**您想要接收的 cookie。
+
+您的 API 现在可以控制自己的 cookie 同意。🤪🍪
+
+您可以使用 Pydantic 的模型配置来禁止( `forbid` )任何额外( `extra` )字段:
+
+{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *}
+
+如果客户尝试发送一些**额外的 cookie**,他们将收到**错误**响应。
+
+可怜的 cookie 通知条,费尽心思为了获得您的同意,却被API 拒绝了。🍪
+
+例如,如果客户端尝试发送一个值为 `good-list-please` 的 `santa_tracker` cookie,客户端将收到一个**错误**响应,告知他们 `santa_tracker` cookie 是不允许的:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["cookie", "santa_tracker"],
+ "msg": "Extra inputs are not permitted",
+ "input": "good-list-please",
+ }
+ ]
+}
+```
+
+## 总结
+
+您可以使用 **Pydantic 模型**在 **FastAPI** 中声明 **cookie**。😎
From e90af0c0f91513fd41b9f02c31de0a9a7fa16492 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Tue, 10 Dec 2024 20:39:15 +0000
Subject: [PATCH 088/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 06426daf7..d9ef6146b 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/cookie-param-models.md`. PR [#13038](https://github.com/fastapi/fastapi/pull/13038) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/request-form-models.md`. PR [#13045](https://github.com/fastapi/fastapi/pull/13045) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Add Russian translation for `docs/ru/docs/virtual-environments.md`. PR [#13026](https://github.com/fastapi/fastapi/pull/13026) by [@alv2017](https://github.com/alv2017).
* 🌐 Add Korean translation for `docs/ko/docs/tutorial/testing.md`. PR [#12968](https://github.com/fastapi/fastapi/pull/12968) by [@jts8257](https://github.com/jts8257).
From 974284be907a30ee2e9b1ce9c121c6e32fb2400e Mon Sep 17 00:00:00 2001
From: Gerry Sabar
Date: Fri, 13 Dec 2024 04:46:36 +0700
Subject: [PATCH 089/106] =?UTF-8?q?=F0=9F=8C=90=20Add=20Indonesian=20trans?=
=?UTF-8?q?lation=20for=20`docs/id/docs/tutorial/first-steps.md`=20(#13042?=
=?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/id/docs/tutorial/first-steps.md | 332 +++++++++++++++++++++++++++
1 file changed, 332 insertions(+)
create mode 100644 docs/id/docs/tutorial/first-steps.md
diff --git a/docs/id/docs/tutorial/first-steps.md b/docs/id/docs/tutorial/first-steps.md
new file mode 100644
index 000000000..9b461507d
--- /dev/null
+++ b/docs/id/docs/tutorial/first-steps.md
@@ -0,0 +1,332 @@
+# Langkah Pertama
+
+File FastAPI yang paling sederhana bisa seperti berikut:
+
+{* ../../docs_src/first_steps/tutorial001.py *}
+
+Salin file tersebut ke `main.py`.
+
+Jalankan di server:
+
+
+
+```console
+$ fastapi dev main.py
+INFO Using path main.py
+INFO Resolved absolute path /home/user/code/awesomeapp/main.py
+INFO Searching for package file structure from directories with __init__.py files
+INFO Importing from /home/user/code/awesomeapp
+
+ ╭─ Python module file ─╮
+ │ │
+ │ 🐍 main.py │
+ │ │
+ ╰──────────────────────╯
+
+INFO Importing module main
+INFO Found importable FastAPI app
+
+ ╭─ Importable FastAPI app ─╮
+ │ │
+ │ from main import app │
+ │ │
+ ╰──────────────────────────╯
+
+INFO Using import string main:app
+
+ ╭────────── FastAPI CLI - Development mode ───────────╮
+ │ │
+ │ Serving at: http://127.0.0.1:8000 │
+ │ │
+ │ API docs: http://127.0.0.1:8000/docs │
+ │ │
+ │ Running in development mode, for production use: │
+ │ │
+ │ fastapi run │
+ │ │
+ ╰─────────────────────────────────────────────────────╯
+
+INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
+INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+INFO: Started reloader process [2265862] using WatchFiles
+INFO: Started server process [2265873]
+INFO: Waiting for application startup.
+INFO: Application startup complete.
+```
+
+
+
+Di output, terdapat sebaris pesan:
+
+```hl_lines="4"
+INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+Baris tersebut menunjukan URL dimana app aktif di komputer anda.
+
+
+### Mencoba aplikasi
+
+Buka browser di http://127.0.0.1:8000.
+
+Anda akan melihat response JSON sebagai berikut:
+
+```JSON
+{"message": "Hello World"}
+```
+
+### Dokumen API interaktif
+
+Sekarang kunjungi http://127.0.0.1:8000/docs.
+
+Anda akan melihat dokumentasi API interaktif otomatis (dibuat oleh Swagger UI):
+
+
+
+### Dokumen API alternatif
+
+Dan sekarang, kunjungi http://127.0.0.1:8000/redoc.
+
+Anda akan melihat dokumentasi alternatif otomatis (dibuat oleh ReDoc):
+
+
+
+### OpenAPI
+
+**FastAPI** membuat sebuah "schema" dimana semua API anda menggunakan standar **OpenAPI** untuk mendefinisikan API.
+
+#### "Schema"
+
+"schema" adalah suatu definisi atau deskripsi dari sesuatu. Bukan kode yang mengimplementasi definisi tersebut. Ini hanyalah sebuah deskripsi abstrak.
+
+#### "schema" API
+
+Dalam hal ini, OpenAPI adalah spesifikasi yang menunjukan bagaimana untuk mendefinisikan sebuah skema di API anda.
+
+Definisi skema ini termasuk jalur API anda, parameter yang bisa diterima, dll.
+
+#### "schema" Data
+
+Istilah "schema" bisa juga merujuk ke struktur data, seperti konten JSON.
+
+Dalam kondisi ini, ini berarti attribut JSON dan tipe data yang dimiliki, dll.
+
+#### Schema OpenAPI and JSON
+
+"schema" OpenAPI mendefinisikan skema API dari API yang anda buat. Skema tersebut termasuk definisi (atau "schema") dari data yang dikirim atau diterima oleh API dari **JSON Schema**, skema data standar JSON.
+
+#### Lihat `openapi.json`
+
+Jika anda penasaran bagaimana skema OpenAPI polos seperti apa, FastAPI secara otomatis membuat JSON (schema) dengan deksripsi API anda.
+
+anda bisa melihatnya di: http://127.0.0.1:8000/openapi.json.
+
+Anda akan melihat JSON yang dimulai seperti:
+
+```JSON
+{
+ "openapi": "3.1.0",
+ "info": {
+ "title": "FastAPI",
+ "version": "0.1.0"
+ },
+ "paths": {
+ "/items/": {
+ "get": {
+ "responses": {
+ "200": {
+ "description": "Successful Response",
+ "content": {
+ "application/json": {
+
+
+
+...
+```
+
+#### Kegunaan OpenAPI
+
+Skema OpenAPI adalah tulang punggung dua sistem dokumentasi API interaktif yang ada di FastAPI.
+
+Ada banyak alternatif sistem dokumentasi lainnya yang semuanya berdasarkan OpenAPI. Anda bisa menambahkannya ke aplikasi **FastAPI** anda.
+
+Anda juga bisa menggunakan OpenAPI untuk membuat kode secara otomatis, untuk klien yang menggunakan API anda. Sebagai contoh, frontend, aplikasi mobile atau IoT.
+
+## Ringkasan, secara bertahap
+
+### Langkah 1: impor `FastAPI`
+
+{* ../../docs_src/first_steps/tutorial001.py hl[1] *}
+
+`FastAPI` adalah class Python yang menyediakan semua fungsionalitas API anda.
+
+/// note | Detail Teknis
+
+`FastAPI` adalah class turunan langsung dari `Starlette`.
+
+Anda bisa menggunakan semua fungsionalitas Starlette dengan `FastAPI` juga.
+
+///
+
+### Langkah 2: buat "instance" dari `FastAPI`
+
+{* ../../docs_src/first_steps/tutorial001.py hl[3] *}
+
+Di sini variabel `app` akan menjadi sebuah "instance" dari class `FastAPI`.
+
+Ini akan menjadi gerbang utama untuk membuat semua API anda.
+
+### Langkah 3: Buat *operasi path*
+
+#### Path
+
+"Path" atau jalur di sini merujuk ke bagian URL terakhir dimulai dari `/` pertama.
+
+Sehingga, URL seperti:
+
+```
+https://example.com/items/foo
+```
+
+...path-nya adalah:
+
+```
+/items/foo
+```
+
+/// info
+
+"path" juga biasa disebut "endpoint" atau "route".
+
+///
+
+ketika membuat API, "path" adalah jalan utama untuk memisahkan "concern" dan "resources".
+
+#### Operasi
+
+"Operasi" di sini merujuk ke salah satu dari metode HTTP berikut.
+
+Salah satu dari:
+
+* `POST`
+* `GET`
+* `PUT`
+* `DELETE`
+
+...dan operasi lainnya yang unik:
+
+* `OPTIONS`
+* `HEAD`
+* `PATCH`
+* `TRACE`
+
+Dalam protokol HTTP, anda bisa berkomunikasi ke setiap path menggunakan satu (atau lebih) metode di atas.
+
+---
+
+Ketika membuat API, anda umumnya menggunakan metode HTTP tertentu untuk proses tertentu.
+
+Umumnya menggunakan:
+
+* `POST`: untuk membuat data.
+* `GET`: untuk membaca data.
+* `PUT`: untuk memperbarui data.
+* `DELETE`: untuk menghapus data.
+
+Sehingga, di OpanAPI, setiap metode HTTP ini disebut sebuah "operasi".
+
+Kita akan menyebut mereka juga "**operasi**".
+
+#### Mendefinisikan *dekorator operasi path*
+
+{* ../../docs_src/first_steps/tutorial001.py hl[6] *}
+
+`@app.get("/")` memberitahu **FastAPI** bahwa fungsi di bawahnya mengurusi request yang menuju ke:
+
+* path `/`
+* menggunakan operasi get
+
+/// info | `@decorator` Info
+
+Sintaksis `@sesuatu` di Python disebut "dekorator".
+
+Dekorator ditempatkan di atas fungsi. Seperti sebuah topi cantik (Saya pikir istilah ini berasal dari situ).
+
+"dekorator" memanggil dan bekerja dengan fungsi yang ada di bawahnya
+
+Pada kondisi ini, dekorator ini memberi tahu **FastAPI** bahwa fungsi di bawah nya berhubungan dengan **path** `/` dengan **operasi** `get`.
+
+Sehingga disebut **dekorator operasi path**.
+
+///
+
+Operasi lainnya yang bisa digunakan:
+
+* `@app.post()`
+* `@app.put()`
+* `@app.delete()`
+
+Dan operasi unik lainnya:
+
+* `@app.options()`
+* `@app.head()`
+* `@app.patch()`
+* `@app.trace()`
+
+/// tip | Tips
+
+Jika anda bisa menggunakan operasi apa saja (metode HTTP).
+
+**FastAPI** tidak mengharuskan anda menggunakan operasi tertentu.
+
+Informasi di sini hanyalah sebagai panduan, bukan keharusan.
+
+Sebagai contoh, ketika menggunakan GraphQL, semua operasi umumnya hanya menggunakan `POST`.
+
+///
+
+### Langkah 4: mendefinisikan **fungsi operasi path**
+
+Ini "**fungsi operasi path**" kita:
+
+* **path**: adalah `/`.
+* **operasi**: adalah `get`.
+* **fungsi**: adalah fungsi yang ada di bawah dekorator (di bawah `@app.get("/")`).
+
+{* ../../docs_src/first_steps/tutorial001.py hl[7] *}
+
+Ini adalah fungsi Python.
+
+Fungsi ini dipanggil **FastAPI** setiap kali menerima request ke URL "`/`" dengan operasi `GET`.
+
+Di kondisi ini, ini adalah sebuah fungsi `async`.
+
+---
+
+Anda bisa mendefinisikan fungsi ini sebagai fungsi normal daripada `async def`:
+
+{* ../../docs_src/first_steps/tutorial003.py hl[7] *}
+
+/// note | Catatan
+
+Jika anda tidak tahu perbedaannya, kunjungi [Async: *"Panduan cepat"*](../async.md#in-a-hurry){.internal-link target=_blank}.
+
+///
+
+### Langkah 5: hasilkan konten
+
+{* ../../docs_src/first_steps/tutorial001.py hl[8] *}
+
+Anda bisa menghasilkan `dict`, `list`, nilai singular seperti `str`, `int`, dll.
+
+Anda juga bisa menghasilkan model Pydantic (anda akan belajar mengenai ini nanti).
+
+Ada banyak objek dan model yang secara otomatis dikonversi ke JSON (termasuk ORM, dll). Anda bisa menggunakan yang anda suka, kemungkinan sudah didukung.
+
+## Ringkasan
+
+* Impor `FastAPI`.
+* Buat sebuah instance `app`.
+* Tulis **dekorator operasi path** menggunakan dekorator seperti `@app.get("/")`.
+* Definisikan **fungsi operasi path**; sebagai contoh, `def root(): ...`.
+* Jalankan server development dengan perintah `fastapi dev`.
From a862acb877f72d157f9fe20e38e5242aa58ecec3 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Thu, 12 Dec 2024 21:47:03 +0000
Subject: [PATCH 090/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index d9ef6146b..8d4454c10 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Add Indonesian translation for `docs/id/docs/tutorial/first-steps.md`. PR [#13042](https://github.com/fastapi/fastapi/pull/13042) by [@gerry-sabar](https://github.com/gerry-sabar).
* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/cookie-param-models.md`. PR [#13038](https://github.com/fastapi/fastapi/pull/13038) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/request-form-models.md`. PR [#13045](https://github.com/fastapi/fastapi/pull/13045) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Add Russian translation for `docs/ru/docs/virtual-environments.md`. PR [#13026](https://github.com/fastapi/fastapi/pull/13026) by [@alv2017](https://github.com/alv2017).
From a277942a5297d230b85d8ff50910232c53ff0b6a Mon Sep 17 00:00:00 2001
From: Victor Menezes
Date: Thu, 12 Dec 2024 19:47:10 -0300
Subject: [PATCH 091/106] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?=
=?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/generate-clients.md`=20(#?=
=?UTF-8?q?13030)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/pt/docs/advanced/generate-clients.md | 261 ++++++++++++++++++++++
1 file changed, 261 insertions(+)
create mode 100644 docs/pt/docs/advanced/generate-clients.md
diff --git a/docs/pt/docs/advanced/generate-clients.md b/docs/pt/docs/advanced/generate-clients.md
new file mode 100644
index 000000000..04d7c0071
--- /dev/null
+++ b/docs/pt/docs/advanced/generate-clients.md
@@ -0,0 +1,261 @@
+# Generate Clients
+
+Como o **FastAPI** é baseado na especificação **OpenAPI**, você obtém compatibilidade automática com muitas ferramentas, incluindo a documentação automática da API (fornecida pelo Swagger UI).
+
+Uma vantagem particular que nem sempre é óbvia é que você pode **gerar clientes** (às vezes chamados de **SDKs**) para a sua API, para muitas **linguagens de programação** diferentes.
+
+## Geradores de Clientes OpenAPI
+
+Existem muitas ferramentas para gerar clientes a partir do **OpenAPI**.
+
+Uma ferramenta comum é o OpenAPI Generator.
+
+Se voce está construindo um **frontend**, uma alternativa muito interessante é o openapi-ts.
+
+## Geradores de Clientes e SDKs - Patrocinadores
+
+Existem também alguns geradores de clientes e SDKs baseados na OpenAPI (FastAPI) **patrocinados por empresas**, em alguns casos eles podem oferecer **recursos adicionais** além de SDKs/clientes gerados de alta qualidade.
+
+Alguns deles também ✨ [**patrocinam o FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, isso garante o **desenvolvimento** contínuo e saudável do FastAPI e seu **ecossistema**.
+
+E isso mostra o verdadeiro compromisso deles com o FastAPI e sua **comunidade** (você), pois eles não apenas querem fornecer um **bom serviço**, mas também querem garantir que você tenha um **framework bom e saudável**, o FastAPI. 🙇
+
+Por exemplo, você pode querer experimentar:
+
+* Speakeasy
+* Stainless
+* liblab
+
+Existem também várias outras empresas que oferecem serviços semelhantes que você pode pesquisar e encontrar online. 🤓
+
+## Gerar um Cliente Frontend TypeScript
+
+Vamos começar com um aplicativo **FastAPI** simples:
+
+{* ../../docs_src/generate_clients/tutorial001_py39.py hl[7:9,12:13,16:17,21] *}
+
+Note que as *operações de rota* definem os modelos que usam para o corpo da requisição e o corpo da resposta, usando os modelos `Item` e `ResponseMessage`.
+
+### Documentação da API
+
+Se você acessar a documentação da API, verá que ela tem os **schemas** para os dados a serem enviados nas requisições e recebidos nas respostas:
+
+
+
+Você pode ver esses schemas porque eles foram declarados com os modelos no app.
+
+Essas informações estão disponíveis no **OpenAPI schema** do app e são mostradas na documentação da API (pelo Swagger UI).
+
+E essas mesmas informações dos modelos que estão incluídas no OpenAPI são o que pode ser usado para **gerar o código do cliente**.
+
+### Gerar um Cliente TypeScript
+
+Agora que temos o app com os modelos, podemos gerar o código do cliente para o frontend.
+
+#### Instalar o `openapi-ts`
+
+Você pode instalar o `openapi-ts` no seu código frontend com:
+
+
+
+```console
+$ npm install @hey-api/openapi-ts --save-dev
+
+---> 100%
+```
+
+
+
+#### Gerar o Código do Cliente
+
+Para gerar o código do cliente, você pode usar a aplicação de linha de comando `openapi-ts` que agora está instalada.
+
+Como ela está instalada no projeto local, você provavelmente não conseguiria chamar esse comando diretamente, mas você o colocaria no seu arquivo `package.json`.
+
+Poderia ser assim:
+
+```JSON hl_lines="7"
+{
+ "name": "frontend-app",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "generate-client": "openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios"
+ },
+ "author": "",
+ "license": "",
+ "devDependencies": {
+ "@hey-api/openapi-ts": "^0.27.38",
+ "typescript": "^4.6.2"
+ }
+}
+```
+
+Depois de ter esse script NPM `generate-client` lá, você pode executá-lo com:
+
+
+
+```console
+$ npm run generate-client
+
+frontend-app@1.0.0 generate-client /home/user/code/frontend-app
+> openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios
+```
+
+
+
+Esse comando gerará o código em `./src/client` e usará o `axios` (a biblioteca HTTP frontend) internamente.
+
+### Experimente o Código do Cliente
+
+Agora você pode importar e usar o código do cliente, ele poderia ser assim, observe que você obtém preenchimento automático para os métodos:
+
+
+
+Você também obterá preenchimento automático para o corpo a ser enviado:
+
+
+
+/// tip | Dica
+
+Observe o preenchimento automático para `name` e `price`, que foi definido no aplicativo FastAPI, no modelo `Item`.
+
+///
+
+Você terá erros em linha para os dados que você envia:
+
+
+
+O objeto de resposta também terá preenchimento automático:
+
+
+
+## App FastAPI com Tags
+
+Em muitos casos seu app FastAPI será maior, e você provavelmente usará tags para separar diferentes grupos de *operações de rota*.
+
+Por exemplo, você poderia ter uma seção para **items** e outra seção para **users**, e elas poderiam ser separadas por tags:
+
+{* ../../docs_src/generate_clients/tutorial002_py39.py hl[21,26,34] *}
+
+### Gerar um Cliente TypeScript com Tags
+
+Se você gerar um cliente para um app FastAPI usando tags, normalmente também separará o código do cliente com base nas tags.
+
+Dessa forma, você poderá ter as coisas ordenadas e agrupadas corretamente para o código do cliente:
+
+
+
+Nesse caso você tem:
+
+* `ItemsService`
+* `UsersService`
+
+### Nomes dos Métodos do Cliente
+
+Agora os nomes dos métodos gerados como `createItemItemsPost` não parecem muito "limpos":
+
+```TypeScript
+ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
+```
+
+...isto ocorre porque o gerador de clientes usa o **operation ID** interno do OpenAPI para cada *operação de rota*.
+
+O OpenAPI exige que cada operation ID seja único em todas as *operações de rota*, então o FastAPI usa o **nome da função**, o **caminho** e o **método/operacao HTTP** para gerar esse operation ID, porque dessa forma ele pode garantir que os operation IDs sejam únicos.
+
+Mas eu vou te mostrar como melhorar isso a seguir. 🤓
+
+### IDs de Operação Personalizados e Melhores Nomes de Método
+
+Você pode **modificar** a maneira como esses IDs de operação são **gerados** para torná-los mais simples e ter **nomes de método mais simples** nos clientes.
+
+Neste caso, você terá que garantir que cada ID de operação seja **único** de alguma outra maneira.
+
+Por exemplo, você poderia garantir que cada *operação de rota* tenha uma tag, e então gerar o ID da operação com base na **tag** e no **nome** da *operação de rota* (o nome da função).
+
+### Função Personalizada para Gerar IDs de Operação Únicos
+
+O FastAPI usa um **ID único** para cada *operação de rota*, ele é usado para o **ID da operação** e também para os nomes de quaisquer modelos personalizados necessários, para requisições ou respostas.
+
+Você pode personalizar essa função. Ela recebe uma `APIRoute` e gera uma string.
+
+Por exemplo, aqui está usando a primeira tag (você provavelmente terá apenas uma tag) e o nome da *operação de rota* (o nome da função).
+
+Você pode então passar essa função personalizada para o **FastAPI** como o parâmetro `generate_unique_id_function`:
+
+{* ../../docs_src/generate_clients/tutorial003_py39.py hl[6:7,10] *}
+
+### Gerar um Cliente TypeScript com IDs de Operação Personalizados
+
+Agora, se você gerar o cliente novamente, verá que ele tem os nomes dos métodos melhorados:
+
+
+
+Como você pode ver, os nomes dos métodos agora têm a tag e, em seguida, o nome da função. Agora eles não incluem informações do caminho da URL e da operação HTTP.
+
+### Pré-processar a Especificação OpenAPI para o Gerador de Clientes
+
+O código gerado ainda tem algumas **informações duplicadas**.
+
+Nós já sabemos que esse método está relacionado aos **items** porque essa palavra está no `ItemsService` (retirada da tag), mas ainda temos o nome da tag prefixado no nome do método também. 😕
+
+Provavelmente ainda queremos mantê-lo para o OpenAPI em geral, pois isso garantirá que os IDs de operação sejam **únicos**.
+
+Mas para o cliente gerado, poderíamos **modificar** os IDs de operação do OpenAPI logo antes de gerar os clientes, apenas para tornar esses nomes de método mais **simples**.
+
+Poderíamos baixar o JSON do OpenAPI para um arquivo `openapi.json` e então poderíamos **remover essa tag prefixada** com um script como este:
+
+{* ../../docs_src/generate_clients/tutorial004.py *}
+
+//// tab | Node.js
+
+```Javascript
+{!> ../../docs_src/generate_clients/tutorial004.js!}
+```
+
+////
+
+Com isso, os IDs de operação seriam renomeados de coisas como `items-get_items` para apenas `get_items`, dessa forma o gerador de clientes pode gerar nomes de métodos mais simples.
+
+### Gerar um Cliente TypeScript com o OpenAPI Pré-processado
+
+Agora, como o resultado final está em um arquivo `openapi.json`, você modificaria o `package.json` para usar esse arquivo local, por exemplo:
+
+```JSON hl_lines="7"
+{
+ "name": "frontend-app",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios"
+ },
+ "author": "",
+ "license": "",
+ "devDependencies": {
+ "@hey-api/openapi-ts": "^0.27.38",
+ "typescript": "^4.6.2"
+ }
+}
+```
+
+Depois de gerar o novo cliente, você teria agora **nomes de métodos "limpos"**, com todo o **preenchimento automático**, **erros em linha**, etc:
+
+
+
+## Benefícios
+
+Ao usar os clientes gerados automaticamente, você teria **preenchimento automático** para:
+
+* Métodos.
+* Corpo de requisições, parâmetros da query, etc.
+* Corpo de respostas.
+
+Você também teria **erros em linha** para tudo.
+
+E sempre que você atualizar o código do backend, e **regenerar** o frontend, ele teria quaisquer novas *operações de rota* disponíveis como métodos, as antigas removidas, e qualquer outra alteração seria refletida no código gerado. 🤓
+
+Isso também significa que se algo mudar, será **refletido** no código do cliente automaticamente. E se você **construir** o cliente, ele dará erro se houver alguma **incompatibilidade** nos dados usados.
+
+Então, você **detectaria vários erros** muito cedo no ciclo de desenvolvimento, em vez de ter que esperar que os erros apareçam para seus usuários finais em produção e então tentar depurar onde está o problema. ✨
From fbd3ff4a6f3ac1ae5c56c1ba39b722841432c128 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Thu, 12 Dec 2024 22:47:34 +0000
Subject: [PATCH 092/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 8d4454c10..a8a185a69 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/generate-clients.md`. PR [#13030](https://github.com/fastapi/fastapi/pull/13030) by [@vitumenezes](https://github.com/vitumenezes).
* 🌐 Add Indonesian translation for `docs/id/docs/tutorial/first-steps.md`. PR [#13042](https://github.com/fastapi/fastapi/pull/13042) by [@gerry-sabar](https://github.com/gerry-sabar).
* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/cookie-param-models.md`. PR [#13038](https://github.com/fastapi/fastapi/pull/13038) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/request-form-models.md`. PR [#13045](https://github.com/fastapi/fastapi/pull/13045) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
From 627242b8ae88a3a9bb04af3ad096c3182bb129d8 Mon Sep 17 00:00:00 2001
From: Aleksandr Lobanov
Date: Fri, 13 Dec 2024 05:48:28 +0700
Subject: [PATCH 093/106] =?UTF-8?q?=F0=9F=8C=90=20Update=20Russian=20trans?=
=?UTF-8?q?lation=20for=20`docs/ru/docs/deployment/docker.md`=20(#13048)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/ru/docs/deployment/docker.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/ru/docs/deployment/docker.md b/docs/ru/docs/deployment/docker.md
index 31da01b78..c72f67172 100644
--- a/docs/ru/docs/deployment/docker.md
+++ b/docs/ru/docs/deployment/docker.md
@@ -58,7 +58,7 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
## Образы контейнеров
-Docker является одним оз основных инструментов для создания **образов** и **контейнеров** и управления ими.
+Docker является одним из основных инструментов для создания **образов** и **контейнеров** и управления ими.
Существует общедоступный Docker Hub с подготовленными **официальными образами** многих инструментов, окружений, баз данных и приложений.
@@ -87,7 +87,7 @@ Docker является одним оз основных инструменто
Когда **контейнер** запущен, он будет выполнять прописанные в нём команды и программы. Но вы можете изменить его так, чтоб он выполнял другие команды и программы.
-Контейнер буде работать до тех пор, пока выполняется его **главный процесс** (команда или программа).
+Контейнер будет работать до тех пор, пока выполняется его **главный процесс** (команда или программа).
В контейнере обычно выполняется **только один процесс**, но от его имени можно запустить другие процессы, тогда в этом же в контейнере будет выполняться **множество процессов**.
@@ -215,7 +215,7 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
Опция `--upgrade` указывает `pip` обновить библиотеки, емли они уже установлены.
- Ка и в предыдущем шаге с копированием файла, этот шаг также будет использовать **кэш Docker** в случае отсутствия изменений.
+ Как и в предыдущем шаге с копированием файла, этот шаг также будет использовать **кэш Docker** в случае отсутствия изменений.
Использование кэша, особенно на этом шаге, позволит вам **сэкономить** кучу времени при повторной сборке образа, так как зависимости будут сохранены в кеше, а не **загружаться и устанавливаться каждый раз**.
From 6ae85b47429c064e2cf1ea704e202da6bbf1ec18 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Thu, 12 Dec 2024 22:49:43 +0000
Subject: [PATCH 094/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index a8a185a69..5f1b95d85 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Update Russian translation for `docs/ru/docs/deployment/docker.md`. PR [#13048](https://github.com/fastapi/fastapi/pull/13048) by [@anklav24](https://github.com/anklav24).
* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/generate-clients.md`. PR [#13030](https://github.com/fastapi/fastapi/pull/13030) by [@vitumenezes](https://github.com/vitumenezes).
* 🌐 Add Indonesian translation for `docs/id/docs/tutorial/first-steps.md`. PR [#13042](https://github.com/fastapi/fastapi/pull/13042) by [@gerry-sabar](https://github.com/gerry-sabar).
* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/cookie-param-models.md`. PR [#13038](https://github.com/fastapi/fastapi/pull/13038) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
From 0f5146fa5de0eb469a2b4608c235e6f0184b1387 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?=
Date: Sun, 15 Dec 2024 14:35:18 +0100
Subject: [PATCH 095/106] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20ren?=
=?UTF-8?q?ame=20CryptAPI=20to=20BlockBee=20(#13078)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
docs/en/data/sponsors.yml | 6 +++---
docs/en/data/sponsors_badge.yml | 1 +
docs/en/docs/img/sponsors/blockbee-banner.png | Bin 0 -> 11353 bytes
docs/en/docs/img/sponsors/blockbee.png | Bin 0 -> 13006 bytes
docs/en/overrides/main.html | 4 ++--
6 files changed, 7 insertions(+), 6 deletions(-)
create mode 100644 docs/en/docs/img/sponsors/blockbee-banner.png
create mode 100644 docs/en/docs/img/sponsors/blockbee.png
diff --git a/README.md b/README.md
index 66ffd7355..6492ad745 100644
--- a/README.md
+++ b/README.md
@@ -46,7 +46,7 @@ The key features are:
-
+
diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml
index e66d592f5..4231452e4 100644
--- a/docs/en/data/sponsors.yml
+++ b/docs/en/data/sponsors.yml
@@ -1,7 +1,7 @@
gold:
- - url: https://cryptapi.io/
- title: "CryptAPI: Your easy to use, secure and privacy oriented payment gateway."
- img: https://fastapi.tiangolo.com/img/sponsors/cryptapi.svg
+ - url: https://blockbee.io?ref=fastapi
+ title: BlockBee Cryptocurrency Payment Gateway
+ img: https://fastapi.tiangolo.com/img/sponsors/blockbee.png
- url: https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023
title: "Build, run and scale your apps on a modern, reliable, and secure PaaS."
img: https://fastapi.tiangolo.com/img/sponsors/platform-sh.png
diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml
index 7470b0238..3e885a2f7 100644
--- a/docs/en/data/sponsors_badge.yml
+++ b/docs/en/data/sponsors_badge.yml
@@ -32,3 +32,4 @@ logins:
- Kong
- speakeasy-api
- jess-render
+ - blockbee-io
diff --git a/docs/en/docs/img/sponsors/blockbee-banner.png b/docs/en/docs/img/sponsors/blockbee-banner.png
new file mode 100644
index 0000000000000000000000000000000000000000..074b36031244e5b690e377d04ffa3ac98eea42d8
GIT binary patch
literal 11353
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
literal 0
HcmV?d00001
diff --git a/docs/en/docs/img/sponsors/blockbee.png b/docs/en/docs/img/sponsors/blockbee.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d2fcf7019c88d15cd547c870257982d433c67b6
GIT binary patch
literal 13006
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
From d7f88623e1304667c67da17dfd278b5099522ef9 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Sun, 15 Dec 2024 13:35:39 +0000
Subject: [PATCH 096/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 5f1b95d85..623a68303 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -41,6 +41,7 @@ hide:
### Internal
+* 🔧 Update sponsors: rename CryptAPI to BlockBee. PR [#13078](https://github.com/fastapi/fastapi/pull/13078) by [@tiangolo](https://github.com/tiangolo).
* ⬆ Bump pypa/gh-action-pypi-publish from 1.12.2 to 1.12.3. PR [#13055](https://github.com/fastapi/fastapi/pull/13055) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump types-ujson from 5.7.0.1 to 5.10.0.20240515. PR [#13018](https://github.com/fastapi/fastapi/pull/13018) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump black from 24.3.0 to 24.10.0. PR [#13014](https://github.com/fastapi/fastapi/pull/13014) by [@dependabot[bot]](https://github.com/apps/dependabot).
From 97206ee28f015806d851c7eff5cd4761d1a62a81 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8F=B2=E9=9B=B2=E6=98=94=20=28Vincy=20SHI=29?=
Date: Mon, 16 Dec 2024 00:39:22 +0800
Subject: [PATCH 097/106] =?UTF-8?q?=F0=9F=8C=90=20Update=20Chinese=20trans?=
=?UTF-8?q?lation=20for=20`docs/zh/docs/tutorial/first-steps.md`=20(#12923?=
=?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/zh/docs/tutorial/first-steps.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/zh/docs/tutorial/first-steps.md b/docs/zh/docs/tutorial/first-steps.md
index 038e17888..c4ff460e0 100644
--- a/docs/zh/docs/tutorial/first-steps.md
+++ b/docs/zh/docs/tutorial/first-steps.md
@@ -313,7 +313,7 @@ https://example.com/items/foo
/// note
-如果你不知道两者的区别,请查阅 [Async: *"In a hurry?"*](https://fastapi.tiangolo.com/async/#in-a-hurry){.internal-link target=_blank}。
+如果你不知道两者的区别,请查阅 [并发: *赶时间吗?*](../async.md#_1){.internal-link target=_blank}。
///
From f5f0d20af0aba9fb74dc255a5e469f95a1c332da Mon Sep 17 00:00:00 2001
From: github-actions
Date: Sun, 15 Dec 2024 16:39:45 +0000
Subject: [PATCH 098/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 623a68303..1507c62c0 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#12923](https://github.com/fastapi/fastapi/pull/12923) by [@Vincy1230](https://github.com/Vincy1230).
* 🌐 Update Russian translation for `docs/ru/docs/deployment/docker.md`. PR [#13048](https://github.com/fastapi/fastapi/pull/13048) by [@anklav24](https://github.com/anklav24).
* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/generate-clients.md`. PR [#13030](https://github.com/fastapi/fastapi/pull/13030) by [@vitumenezes](https://github.com/vitumenezes).
* 🌐 Add Indonesian translation for `docs/id/docs/tutorial/first-steps.md`. PR [#13042](https://github.com/fastapi/fastapi/pull/13042) by [@gerry-sabar](https://github.com/gerry-sabar).
From 0e5f5d2e93b8d466762fa86a437ec2fae94f4fd6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8F=B2=E9=9B=B2=E6=98=94=20=28Vincy=20SHI=29?=
Date: Mon, 16 Dec 2024 00:43:19 +0800
Subject: [PATCH 099/106] =?UTF-8?q?=F0=9F=8C=90=20Update=20Chinese=20trans?=
=?UTF-8?q?lation=20for=20`docs/zh/docs/tutorial/path-params.md`=20(#12926?=
=?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/zh/docs/tutorial/path-params.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/zh/docs/tutorial/path-params.md b/docs/zh/docs/tutorial/path-params.md
index 692214a4b..ac9df0831 100644
--- a/docs/zh/docs/tutorial/path-params.md
+++ b/docs/zh/docs/tutorial/path-params.md
@@ -137,7 +137,7 @@ FastAPI 充分地利用了 枚举(即 enums)。
+Python 3.4 及之后版本支持枚举(即 enums)。
///
From 488763e9f7cd760b035fc20ab0de746a5e3ce8b0 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Sun, 15 Dec 2024 16:43:41 +0000
Subject: [PATCH 100/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 1507c62c0..5d6d307fe 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/path-params.md`. PR [#12926](https://github.com/fastapi/fastapi/pull/12926) by [@Vincy1230](https://github.com/Vincy1230).
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#12923](https://github.com/fastapi/fastapi/pull/12923) by [@Vincy1230](https://github.com/Vincy1230).
* 🌐 Update Russian translation for `docs/ru/docs/deployment/docker.md`. PR [#13048](https://github.com/fastapi/fastapi/pull/13048) by [@anklav24](https://github.com/anklav24).
* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/generate-clients.md`. PR [#13030](https://github.com/fastapi/fastapi/pull/13030) by [@vitumenezes](https://github.com/vitumenezes).
From c1220535cc95e27b2ef45c64c0d967227b2038b7 Mon Sep 17 00:00:00 2001
From: Zhongheng Cheng
Date: Sun, 15 Dec 2024 11:44:11 -0500
Subject: [PATCH 101/106] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?=
=?UTF-8?q?ion=20for=20`docs/zh/docs/tutorial/header-param-models.md`=20(#?=
=?UTF-8?q?13040)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/zh/docs/tutorial/header-param-models.md | 56 ++++++++++++++++++++
1 file changed, 56 insertions(+)
create mode 100644 docs/zh/docs/tutorial/header-param-models.md
diff --git a/docs/zh/docs/tutorial/header-param-models.md b/docs/zh/docs/tutorial/header-param-models.md
new file mode 100644
index 000000000..13366aebc
--- /dev/null
+++ b/docs/zh/docs/tutorial/header-param-models.md
@@ -0,0 +1,56 @@
+# Header 参数模型
+
+如果您有一组相关的 **header 参数**,您可以创建一个 **Pydantic 模型**来声明它们。
+
+这将允许您在**多个地方**能够**重用模型**,并且可以一次性声明所有参数的验证和元数据。😎
+
+/// note
+
+自 FastAPI 版本 `0.115.0` 起支持此功能。🤓
+
+///
+
+## 使用 Pydantic 模型的 Header 参数
+
+在 **Pydantic 模型**中声明所需的 **header 参数**,然后将参数声明为 `Header` :
+
+{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *}
+
+**FastAPI** 将从请求中接收到的 **headers** 中**提取**出**每个字段**的数据,并提供您定义的 Pydantic 模型。
+
+## 查看文档
+
+您可以在文档 UI 的 `/docs` 中查看所需的 headers:
+
+
+

+
+
+## 禁止额外的 Headers
+
+在某些特殊使用情况下(可能并不常见),您可能希望**限制**您想要接收的 headers。
+
+您可以使用 Pydantic 的模型配置来禁止( `forbid` )任何额外( `extra` )字段:
+
+{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *}
+
+如果客户尝试发送一些**额外的 headers**,他们将收到**错误**响应。
+
+例如,如果客户端尝试发送一个值为 `plumbus` 的 `tool` header,客户端将收到一个**错误**响应,告知他们 header 参数 `tool` 是不允许的:
+
+```json
+{
+ "detail": [
+ {
+ "type": "extra_forbidden",
+ "loc": ["header", "tool"],
+ "msg": "Extra inputs are not permitted",
+ "input": "plumbus",
+ }
+ ]
+}
+```
+
+## 总结
+
+您可以使用 **Pydantic 模型**在 **FastAPI** 中声明 **headers**。😎
From 940c0fb9fb7db850fa12f13d28cd8dbea0e6b5e8 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Sun, 15 Dec 2024 16:45:42 +0000
Subject: [PATCH 102/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 5d6d307fe..4b9c9c053 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/header-param-models.md`. PR [#13040](https://github.com/fastapi/fastapi/pull/13040) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/path-params.md`. PR [#12926](https://github.com/fastapi/fastapi/pull/12926) by [@Vincy1230](https://github.com/Vincy1230).
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#12923](https://github.com/fastapi/fastapi/pull/12923) by [@Vincy1230](https://github.com/Vincy1230).
* 🌐 Update Russian translation for `docs/ru/docs/deployment/docker.md`. PR [#13048](https://github.com/fastapi/fastapi/pull/13048) by [@anklav24](https://github.com/anklav24).
From d3360406c4287f2814b7ffdca6a84fc83e8f74ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8F=B2=E9=9B=B2=E6=98=94=20=28Vincy=20SHI=29?=
Date: Mon, 16 Dec 2024 01:10:14 +0800
Subject: [PATCH 103/106] =?UTF-8?q?=F0=9F=8C=90=20Update=20Chinese=20trans?=
=?UTF-8?q?lation=20for=20`docs/zh/docs/tutorial/query-params-str-validati?=
=?UTF-8?q?ons.md`=20(#12928)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/zh/docs/tutorial/query-params-str-validations.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/zh/docs/tutorial/query-params-str-validations.md b/docs/zh/docs/tutorial/query-params-str-validations.md
index 9b9d1f5fd..2fba671f7 100644
--- a/docs/zh/docs/tutorial/query-params-str-validations.md
+++ b/docs/zh/docs/tutorial/query-params-str-validations.md
@@ -116,7 +116,7 @@ q: Union[str, None] = Query(default=None, min_length=3)
/// info
-如果你之前没见过 `...` 这种用法:它是一个特殊的单独值,它是 Python 的一部分并且被称为「省略号」。
+如果你之前没见过 `...` 这种用法:它是一个特殊的单独值,它是 Python 的一部分并且被称为“Ellipsis”(意为省略号 —— 译者注)。
Pydantic 和 FastAPI 使用它来显式的声明需要一个值。
///
From cfc17e5510c07b78fd627f6f3b2b962ccd0d31f2 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Sun, 15 Dec 2024 17:10:40 +0000
Subject: [PATCH 104/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 4b9c9c053..8b3e4bc1b 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/query-params-str-validations.md`. PR [#12928](https://github.com/fastapi/fastapi/pull/12928) by [@Vincy1230](https://github.com/Vincy1230).
* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/header-param-models.md`. PR [#13040](https://github.com/fastapi/fastapi/pull/13040) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/path-params.md`. PR [#12926](https://github.com/fastapi/fastapi/pull/12926) by [@Vincy1230](https://github.com/Vincy1230).
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#12923](https://github.com/fastapi/fastapi/pull/12923) by [@Vincy1230](https://github.com/Vincy1230).
From 929e844754aa18f7ed05976cd011c73b3c91a63c Mon Sep 17 00:00:00 2001
From: Zhongheng Cheng
Date: Sun, 15 Dec 2024 12:11:14 -0500
Subject: [PATCH 105/106] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?=
=?UTF-8?q?ion=20for=20`docs/zh/docs/tutorial/sql-databases.md`=20(#13051)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/zh/docs/tutorial/sql-databases.md | 360 +++++++++++++++++++++++++
1 file changed, 360 insertions(+)
create mode 100644 docs/zh/docs/tutorial/sql-databases.md
diff --git a/docs/zh/docs/tutorial/sql-databases.md b/docs/zh/docs/tutorial/sql-databases.md
new file mode 100644
index 000000000..fbdf3be6c
--- /dev/null
+++ b/docs/zh/docs/tutorial/sql-databases.md
@@ -0,0 +1,360 @@
+# SQL(关系型)数据库
+
+**FastAPI** 并不要求您使用 SQL(关系型)数据库。您可以使用**任何**想用的数据库。
+
+这里,我们来看一个使用 SQLModel 的示例。
+
+**SQLModel** 是基于 SQLAlchemy 和 Pydantic 构建的。它由 **FastAPI** 的同一作者制作,旨在完美匹配需要使用 **SQL 数据库**的 FastAPI 应用程序。
+
+/// tip
+
+您可以使用任何其他您想要的 SQL 或 NoSQL 数据库(在某些情况下称为 “ORM”),FastAPI 不会强迫您使用任何东西。😎
+
+///
+
+由于 SQLModel 基于 SQLAlchemy,因此您可以轻松使用任何由 SQLAlchemy **支持的数据库**(这也让它们被 SQLModel 支持),例如:
+
+* PostgreSQL
+* MySQL
+* SQLite
+* Oracle
+* Microsoft SQL Server 等.
+
+在这个例子中,我们将使用 **SQLite**,因为它使用单个文件,并且 Python 对其有集成支持。因此,您可以直接复制这个例子并运行。
+
+之后,对于您的生产应用程序,您可能会想要使用像 PostgreSQL 这样的数据库服务器。
+
+/// tip
+
+有一个使用 **FastAPI** 和 **PostgreSQL** 的官方的项目生成器,其中包括了前端和更多工具: https://github.com/fastapi/full-stack-fastapi-template
+
+///
+
+这是一个非常简单和简短的教程。如果您想了解一般的数据库、SQL 或更高级的功能,请查看 SQLModel 文档。
+
+## 安装 `SQLModel`
+
+首先,确保您创建并激活了[虚拟环境](../virtual-environments.md){.internal-link target=_blank},然后安装了 `sqlmodel` :
+
+
+
+```console
+$ pip install sqlmodel
+---> 100%
+```
+
+
+
+## 创建含有单一模型的应用程序
+
+我们首先创建应用程序的最简单的第一个版本,只有一个 **SQLModel** 模型。
+
+稍后我们将通过下面的**多个模型**提高其安全性和多功能性。🤓
+
+### 创建模型
+
+导入 `SQLModel` 并创建一个数据库模型:
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *}
+
+`Hero` 类与 Pydantic 模型非常相似(实际上,从底层来看,它确实*就是一个 Pydantic 模型*)。
+
+有一些区别:
+
+* `table=True` 会告诉 SQLModel 这是一个*表模型*,它应该表示 SQL 数据库中的一个*表*,而不仅仅是一个*数据模型*(就像其他常规的 Pydantic 类一样)。
+
+* `Field(primary_key=True)` 会告诉 SQLModel `id` 是 SQL 数据库中的**主键**(您可以在 SQLModel 文档中了解更多关于 SQL 主键的信息)。
+
+ 把类型设置为 `int | None` ,SQLModel 就能知道该列在 SQL 数据库中应该是 `INTEGER` 类型,并且应该是 `NULLABLE` 。
+
+* `Field(index=True)` 会告诉 SQLModel 应该为此列创建一个 **SQL 索引**,这样在读取按此列过滤的数据时,程序能在数据库中进行更快的查找。
+
+ SQLModel 会知道声明为 `str` 的内容将是类型为 `TEXT` (或 `VARCHAR` ,具体取决于数据库)的 SQL 列。
+
+### 创建引擎(Engine)
+
+SQLModel 的引擎 `engine`(实际上它是一个 SQLAlchemy `engine` )是用来与数据库**保持连接**的。
+
+您只需构建**一个 `engine`**,来让您的所有代码连接到同一个数据库。
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[14:18] hl[14:15,17:18] *}
+
+使用 `check_same_thread=False` 可以让 FastAPI 在不同线程中使用同一个 SQLite 数据库。这很有必要,因为**单个请求**可能会使用**多个线程**(例如在依赖项中)。
+
+不用担心,我们会按照代码结构确保**每个请求使用一个单独的 SQLModel *会话***,这实际上就是 `check_same_thread` 想要实现的。
+
+### 创建表
+
+然后,我们来添加一个函数,使用 `SQLModel.metadata.create_all(engine)` 为所有*表模型***创建表**。
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[21:22] hl[21:22] *}
+
+### 创建会话(Session)依赖项
+
+**`Session`** 会存储**内存中的对象**并跟踪数据中所需更改的内容,然后它**使用 `engine`** 与数据库进行通信。
+
+我们会使用 `yield` 创建一个 FastAPI **依赖项**,为每个请求提供一个新的 `Session` 。这确保我们每个请求使用一个单独的会话。🤓
+
+然后我们创建一个 `Annotated` 的依赖项 `SessionDep` 来简化其他也会用到此依赖的代码。
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[25:30] hl[25:27,30] *}
+
+### 在启动时创建数据库表
+
+我们会在应用程序启动时创建数据库表。
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[32:37] hl[35:37] *}
+
+此处,在应用程序启动事件中,我们创建了表。
+
+而对于生产环境,您可能会用一个能够在启动应用程序之前运行的迁移脚本。🤓
+
+/// tip
+
+SQLModel 将会拥有封装 Alembic 的迁移工具,但目前您可以直接使用 Alembic。
+
+///
+
+### 创建 Hero 类
+
+因为每个 SQLModel 模型同时也是一个 Pydantic 模型,所以您可以在与 Pydantic 模型相同的**类型注释**中使用它。
+
+例如,如果您声明一个类型为 `Hero` 的参数,它将从 **JSON 主体**中读取数据。
+
+同样,您可以将其声明为函数的**返回类型**,然后数据的结构就会显示在自动生成的 API 文档界面中。
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *}
+
+
+
+这里,我们使用 `SessionDep` 依赖项(一个 `Session` )将新的 `Hero` 添加到 `Session` 实例中,提交更改到数据库,刷新 hero 中的数据,并返回它。
+
+### 读取 Hero 类
+
+我们可以使用 `select()` 从数据库中**读取** `Hero` 类,并利用 `limit` 和 `offset` 来对结果进行分页。
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[48:55] hl[51:52,54] *}
+
+### 读取单个 Hero
+
+我们可以**读取**单个 `Hero` 。
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[58:63] hl[60] *}
+
+### 删除单个 Hero
+
+我们也可以**删除**单个 `Hero` 。
+
+{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[66:73] hl[71] *}
+
+### 运行应用程序
+
+您可以运行这个应用程序:
+
+
+
+```console
+$ fastapi dev main.py
+
+INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+
+
+然后在 `/docs` UI 中,您能够看到 **FastAPI** 会用这些**模型**来**记录** API,并且还会用它们来**序列化**和**验证**数据。
+
+
+

+
+
+## 更新应用程序以支持多个模型
+
+现在让我们稍微**重构**一下这个应用,以提高**安全性**和**多功能性**。
+
+如果您查看之前的应用程序,您可以在 UI 界面中看到,到目前为止,由客户端决定要创建的 `Hero` 的 `id` 值。😱
+
+我们不应该允许这样做,因为他们可能会覆盖我们在数据库中已经分配的 `id` 。决定 `id` 的行为应该由**后端**或**数据库**来完成,**而非客户端**。
+
+此外,我们为 hero 创建了一个 `secret_name` ,但到目前为止,我们在各处都返回了它,这就不太**秘密**了……😅
+
+我们将通过添加一些**额外的模型**来解决这些问题,而 SQLModel 将在这里大放异彩。✨
+
+### 创建多个模型
+
+在 **SQLModel** 中,任何含有 `table=True` 属性的模型类都是一个**表模型**。
+
+任何不含有 `table=True` 属性的模型类都是**数据模型**,这些实际上只是 Pydantic 模型(附带一些小的额外功能)。🤓
+
+有了 SQLModel,我们就可以利用**继承**来在所有情况下**避免重复**所有字段。
+
+#### `HeroBase` - 基类
+
+我们从一个 `HeroBase` 模型开始,该模型具有所有模型**共享的字段**:
+
+* `name`
+* `age`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:9] hl[7:9] *}
+
+#### `Hero` - *表模型*
+
+接下来,我们创建 `Hero` ,实际的*表模型*,并添加那些不总是在其他模型中的**额外字段**:
+
+* `id`
+* `secret_name`
+
+因为 `Hero` 继承自 HeroBase ,所以它**也**包含了在 `HeroBase` 中声明过的**字段**。因此 `Hero` 的所有字段为:
+
+* `id`
+* `name`
+* `age`
+* `secret_name`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:14] hl[12:14] *}
+
+#### `HeroPublic` - 公共*数据模型*
+
+接下来,我们创建一个 `HeroPublic` 模型,这是将**返回**给 API 客户端的模型。
+
+它包含与 `HeroBase` 相同的字段,因此不会包括 `secret_name` 。
+
+终于,我们英雄(hero)的身份得到了保护! 🥷
+
+它还重新声明了 `id: int` 。这样我们便与 API 客户端建立了一种**约定**,使他们始终可以期待 `id` 存在并且是一个整数 `int`(永远不会是 `None` )。
+
+/// tip
+
+确保返回模型始终提供一个值并且始终是 `int` (而不是 `None` )对 API 客户端非常有用,他们可以在这种确定性下编写更简单的代码。
+
+此外,**自动生成的客户端**将拥有更简洁的接口,这样与您的 API 交互的开发者就能更轻松地使用您的 API。😎
+
+///
+
+`HeroPublic` 中的所有字段都与 `HeroBase` 中的相同,其中 `id` 声明为 `int` (不是 `None` ):
+
+* `id`
+* `name`
+* `age`
+* `secret_name`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:18] hl[17:18] *}
+
+#### `HeroCreate` - 用于创建 hero 的*数据模型*
+
+现在我们创建一个 `HeroCreate` 模型,这是用于**验证**客户数据的模型。
+
+它不仅拥有与 `HeroBase` 相同的字段,还有 `secret_name` 。
+
+现在,当客户端**创建一个新的 hero** 时,他们会发送 `secret_name` ,它会被存储到数据库中,但这些 `secret_name` 不会通过 API 返回给客户端。
+
+/// tip
+
+这应当是**密码**被处理的方式:接收密码,但不要通过 API 返回它们。
+
+在存储密码之前,您还应该对密码的值进行**哈希**处理,**绝不要以明文形式存储它们**。
+
+///
+
+`HeroCreate` 的字段包括:
+
+* `name`
+* `age`
+* `secret_name`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:22] hl[21:22] *}
+
+#### `HeroUpdate` - 用于更新 hero 的*数据模型*
+
+在之前的应用程序中,我们没有办法**更新 hero**,但现在有了**多个模型**,我们便能做到这一点了。🎉
+
+`HeroUpdate` *数据模型*有些特殊,它包含创建新 hero 所需的**所有相同字段**,但所有字段都是**可选的**(它们都有默认值)。这样,当您更新一个 hero 时,您可以只发送您想要更新的字段。
+
+因为所有**字段实际上**都发生了**变化**(类型现在包括 `None` ,并且它们现在有一个默认值 `None` ),我们需要**重新声明**它们。
+
+我们会重新声明所有字段,因此我们并不是真的需要从 `HeroBase` 继承。我会让它继承只是为了保持一致,但这并不必要。这更多是个人喜好的问题。🤷
+
+`HeroUpdate` 的字段包括:
+
+* `name`
+* `age`
+* `secret_name`
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:28] hl[25:28] *}
+
+### 使用 `HeroCreate` 创建并返回 `HeroPublic`
+
+既然我们有了**多个模型**,我们就可以对使用它们的应用程序部分进行更新。
+
+我们在请求中接收到一个 `HeroCreate` *数据模型*,然后从中创建一个 `Hero` *表模型*。
+
+这个新的*表模型* `Hero` 会包含客户端发送的字段,以及一个由数据库生成的 `id` 。
+
+然后我们将与函数中相同的*表模型* `Hero` 原样返回。但是由于我们使用 `HeroPublic` *数据模型*声明了 `response_model` ,**FastAPI** 会使用 `HeroPublic` 来验证和序列化数据。
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[56:62] hl[56:58] *}
+
+/// tip
+
+现在我们使用 `response_model=HeroPublic` 来代替**返回类型注释** `-> HeroPublic` ,因为我们返回的值实际上**并不是** `HeroPublic` 类型。
+
+如果我们声明了 `-> HeroPublic` ,您的编辑器和代码检查工具会抱怨(但也确实理所应当)您返回了一个 `Hero` 而不是一个 `HeroPublic` 。
+
+通过 `response_model` 的声明,我们让 **FastAPI** 按照它自己的方式处理,而不会干扰类型注解以及编辑器和其他工具提供的帮助。
+
+///
+
+### 用 `HeroPublic` 读取 Hero
+
+我们可以像之前一样**读取** `Hero` 。同样,使用 `response_model=list[HeroPublic]` 确保正确地验证和序列化数据。
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[65:72] hl[65] *}
+
+### 用 `HeroPublic` 读取单个 Hero
+
+我们可以**读取**单个 `hero` 。
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[75:80] hl[77] *}
+
+### 用 `HeroUpdate` 更新单个 Hero
+
+我们可以**更新**单个 `hero` 。为此,我们会使用 HTTP 的 `PATCH` 操作。
+
+在代码中,我们会得到一个 `dict` ,其中包含客户端发送的所有数据,**只有客户端发送的数据**,并排除了任何一个仅仅作为默认值存在的值。为此,我们使用 `exclude_unset=True` 。这是最主要的技巧。🪄
+
+然后我们会使用 `hero_db.sqlmodel_update(hero_data)` ,来利用 `hero_data` 的数据更新 `hero_db` 。
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[83:93] hl[83:84,88:89] *}
+
+### (又一次)删除单个 Hero
+
+**删除**一个 hero 基本保持不变。
+
+我们不会满足在这一部分中重构一切的愿望。😅
+
+{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[96:103] hl[101] *}
+
+### (又一次)运行应用程序
+
+您可以再运行一次应用程序:
+
+
+
+```console
+$ fastapi dev main.py
+
+INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
+```
+
+
+
+您会在 `/docs` API UI 看到它现在已经更新,并且在进行创建 hero 等操作时,它不会再期望从客户端接收 `id` 数据。
+
+
+

+
+
+## 总结
+
+您可以使用 **SQLModel** 与 SQL 数据库进行交互,并通过*数据模型*和*表模型*简化代码。
+
+您可以在 SQLModel 的文档中学习到更多内容,其中有一个更详细的关于如何将 SQLModel 与 FastAPI 一起使用的教程。🚀
From 5fc3e9102039290d918465d6409f731d7679cc02 Mon Sep 17 00:00:00 2001
From: github-actions
Date: Sun, 15 Dec 2024 17:12:47 +0000
Subject: [PATCH 106/106] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[skip ci]
---
docs/en/docs/release-notes.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index 8b3e4bc1b..1d0777803 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -15,6 +15,7 @@ hide:
### Translations
+* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/sql-databases.md`. PR [#13051](https://github.com/fastapi/fastapi/pull/13051) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/query-params-str-validations.md`. PR [#12928](https://github.com/fastapi/fastapi/pull/12928) by [@Vincy1230](https://github.com/Vincy1230).
* 🌐 Add Chinese translation for `docs/zh/docs/tutorial/header-param-models.md`. PR [#13040](https://github.com/fastapi/fastapi/pull/13040) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng).
* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/path-params.md`. PR [#12926](https://github.com/fastapi/fastapi/pull/12926) by [@Vincy1230](https://github.com/Vincy1230).