From c12652b7858e70e57c6e65e264d1547a07ef2769 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 26 Mar 2025 14:18:42 +0100 Subject: [PATCH 001/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#12986)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ⬆ [pre-commit.ci] pre-commit autoupdate updates: - [github.com/astral-sh/ruff-pre-commit: v0.9.4 → v0.11.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.9.4...v0.11.2) * also bump in doc requirements --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: svlandeg Co-authored-by: Sofie Van Landeghem --- .pre-commit-config.yaml | 2 +- requirements-docs-tests.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 05c33a608..6aa7c458d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.4 + rev: v0.11.2 hooks: - id: ruff args: diff --git a/requirements-docs-tests.txt b/requirements-docs-tests.txt index e7718e61d..71f4a7ab9 100644 --- a/requirements-docs-tests.txt +++ b/requirements-docs-tests.txt @@ -1,4 +1,4 @@ # For mkdocstrings and tests httpx >=0.23.0,<0.28.0 # For linting and generating docs versions -ruff ==0.9.4 +ruff ==0.11.2 From c8a7552e29e369e4e52957d72c8dcbde605c56d6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Mar 2025 13:19:03 +0000 Subject: [PATCH 002/138] =?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 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4704bd53f..e3a703ef9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,10 @@ hide: * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#13348](https://github.com/fastapi/fastapi/pull/13348) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). +### Internal + +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#12986](https://github.com/fastapi/fastapi/pull/12986) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). + ## 0.115.12 ### Fixes From 031622a989833e9842d1200ab18088ef61424fc3 Mon Sep 17 00:00:00 2001 From: Sofie Van Landeghem Date: Wed, 26 Mar 2025 15:38:36 +0100 Subject: [PATCH 003/138] =?UTF-8?q?=F0=9F=94=A7=20Clean=20up=20`docs/en/mk?= =?UTF-8?q?docs.yml`=20configuration=20file=20(#13542)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/mkdocs.yml | 76 ++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index e9a639d0b..bfa88c06e 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -6,7 +6,7 @@ theme: name: material custom_dir: ../en/overrides palette: - - media: "(prefers-color-scheme)" + - media: (prefers-color-scheme) toggle: icon: material/lightbulb-auto name: Switch to light mode @@ -27,7 +27,6 @@ theme: features: - content.code.annotate - content.code.copy - # - content.code.select - content.footnote.tooltips - content.tabs.link - content.tooltips @@ -35,7 +34,6 @@ theme: - navigation.indexes - navigation.instant - navigation.instant.prefetch - # - navigation.instant.preview - navigation.instant.progress - navigation.path - navigation.tabs @@ -46,7 +44,6 @@ theme: - search.share - search.suggest - toc.follow - icon: repo: fontawesome/brands/github-alt logo: img/icon-white.svg @@ -55,11 +52,7 @@ theme: repo_name: fastapi/fastapi repo_url: https://github.com/fastapi/fastapi plugins: - # Material for MkDocs - search: - # Configured in mkdocs.insiders.yml - # social: - # Other plugins + search: null macros: include_yaml: - external_links: ../en/data/external_links.yml @@ -103,7 +96,6 @@ plugins: signature_crossrefs: true show_symbol_type_heading: true show_symbol_type_toc: true - nav: - FastAPI: index.md - features.md @@ -258,33 +250,27 @@ nav: - benchmarks.md - management.md - release-notes.md - markdown_extensions: - # Python Markdown - abbr: - attr_list: - footnotes: - md_in_html: - tables: + abbr: null + attr_list: null + footnotes: null + md_in_html: null + tables: null toc: permalink: true - - # Python Markdown Extensions - pymdownx.betterem: - pymdownx.caret: + pymdownx.betterem: null + pymdownx.caret: null pymdownx.highlight: line_spans: __span - pymdownx.inlinehilite: - pymdownx.keys: - pymdownx.mark: + pymdownx.inlinehilite: null + pymdownx.keys: null + pymdownx.mark: null pymdownx.superfences: custom_fences: - name: mermaid class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format - pymdownx.tilde: - - # pymdownx blocks + format: !!python/name:pymdownx.superfences.fence_code_format '' + pymdownx.tilde: null pymdownx.blocks.admonition: types: - note @@ -295,17 +281,13 @@ markdown_extensions: - tip - hint - warning - # Custom types - info - check - pymdownx.blocks.details: + pymdownx.blocks.details: null pymdownx.blocks.tab: - alternate_style: True - - # Other extensions - mdx_include: - markdown_include_variants: - + alternate_style: true + mdx_include: null + markdown_include_variants: null extra: analytics: provider: google @@ -313,16 +295,14 @@ extra: feedback: title: Was this page helpful? ratings: - - icon: material/emoticon-happy-outline - name: This page was helpful - data: 1 - note: >- - Thanks for your feedback! - - icon: material/emoticon-sad-outline - name: This page could be improved - data: 0 - note: >- - Thanks for your feedback! + - icon: material/emoticon-happy-outline + name: This page was helpful + data: 1 + note: Thanks for your feedback! + - icon: material/emoticon-sad-outline + name: This page could be improved + data: 0 + note: Thanks for your feedback! social: - icon: fontawesome/brands/github-alt link: https://github.com/fastapi/fastapi @@ -338,7 +318,6 @@ extra: link: https://medium.com/@tiangolo - icon: fontawesome/solid/globe link: https://tiangolo.com - alternate: - link: / name: en - English @@ -390,14 +369,11 @@ extra: name: zh-hant - 繁體中文 - link: /em/ name: 😉 - extra_css: - css/termynal.css - css/custom.css - extra_javascript: - js/termynal.js - js/custom.js - hooks: - ../../scripts/mkdocs_hooks.py From b5bdc153a12716b45a55ff4b9a298a898d1502e0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Mar 2025 14:39:00 +0000 Subject: [PATCH 004/138] =?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 e3a703ef9..359ec4b49 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -17,6 +17,7 @@ hide: ### Internal +* 🔧 Clean up `docs/en/mkdocs.yml` configuration file. PR [#13542](https://github.com/fastapi/fastapi/pull/13542) by [@svlandeg](https://github.com/svlandeg). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#12986](https://github.com/fastapi/fastapi/pull/12986) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). ## 0.115.12 From a49f69f074e334b0abf8cb4aeded213b9f371b9d Mon Sep 17 00:00:00 2001 From: Blueswen Date: Mon, 31 Mar 2025 03:23:32 +0800 Subject: [PATCH 005/138] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20talk=20infor?= =?UTF-8?q?mation=20typo=20(#13544)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/external_links.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index 00bb55422..50f84ecbf 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -412,7 +412,7 @@ Talks: link: https://www.youtube.com/watch?v=3DLwPcrE5mA title: 'PyCon UK 2019: FastAPI from the ground up' Taiwanese: - - author: Bluewen + - author: Blueswen author_link: https://github.com/blueswen link: https://www.youtube.com/watch?v=y3sumuoDq4w title: 'PyCon TW 2024: 全方位強化 Python 服務可觀測性:以 FastAPI 和 Grafana Stack 為例' From 4db37fdf954f24bf8e91d141a0ad675fdd9c90c8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 30 Mar 2025 19:23:55 +0000 Subject: [PATCH 006/138] =?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 359ec4b49..bc122be5d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Docs +* ✏️ Fix talk information typo. PR [#13544](https://github.com/fastapi/fastapi/pull/13544) by [@blueswen](https://github.com/blueswen). * 📝 Add External Link: Taiwanese talk on FastAPI with observability . PR [#13527](https://github.com/fastapi/fastapi/pull/13527) by [@blueswen](https://github.com/blueswen). ### Translations From 396ca6960300a34e4509f754e8d38be6707f3e49 Mon Sep 17 00:00:00 2001 From: Zhongheng Cheng Date: Mon, 31 Mar 2025 04:13:15 -0400 Subject: [PATCH 007/138] =?UTF-8?q?=F0=9F=8C=90=20Update=20Chinese=20trans?= =?UTF-8?q?lation=20for=20`docs/zh/docs/deployment/server-workers.md`=20(#?= =?UTF-8?q?13292)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/deployment/server-workers.md | 144 ++++++++-------------- 1 file changed, 49 insertions(+), 95 deletions(-) diff --git a/docs/zh/docs/deployment/server-workers.md b/docs/zh/docs/deployment/server-workers.md index eb0252a5c..e46ba7a09 100644 --- a/docs/zh/docs/deployment/server-workers.md +++ b/docs/zh/docs/deployment/server-workers.md @@ -1,4 +1,4 @@ -# Server Workers - Gunicorn with Uvicorn +# 服务器工作进程(Workers) - 使用 Uvicorn 的多工作进程模式 让我们回顾一下之前的部署概念: @@ -9,125 +9,79 @@ * 内存 * 启动前的先前步骤 -到目前为止,通过文档中的所有教程,您可能已经在**单个进程**上运行了像 Uvicorn 这样的**服务器程序**。 +到目前为止,在文档中的所有教程中,您可能一直是在运行一个**服务器程序**,例如使用 `fastapi` 命令来启动 Uvicorn,而它默认运行的是**单进程模式**。 -部署应用程序时,您可能希望进行一些**进程复制**,以利用**多核**并能够处理更多请求。 +部署应用程序时,您可能希望进行一些**进程复制**,以利用**多核** CPU 并能够处理更多请求。 正如您在上一章有关[部署概念](concepts.md){.internal-link target=_blank}中看到的,您可以使用多种策略。 -在这里我将向您展示如何将 **Gunicorn** 与 **Uvicorn worker 进程** 一起使用。 +在本章节中,我将向您展示如何使用 `fastapi` 命令或直接使用 `uvicorn` 命令以**多工作进程模式**运行 **Uvicorn**。 /// info 如果您正在使用容器,例如 Docker 或 Kubernetes,我将在下一章中告诉您更多相关信息:[容器中的 FastAPI - Docker](docker.md){.internal-link target=_blank}。 -特别是,当在 **Kubernetes** 上运行时,您可能**不想**使用 Gunicorn,而是运行 **每个容器一个 Uvicorn 进程**,但我将在本章后面告诉您这一点。 +比较特别的是,在 **Kubernetes** 环境中运行时,您通常**不需要**使用多个工作进程,而是**每个容器运行一个 Uvicorn 进程**。不过,我会在本章节的后续部分详细介绍这一点。 /// -## Gunicorn with Uvicorn Workers +## 多个工作进程 -**Gunicorn**主要是一个使用**WSGI标准**的应用服务器。 这意味着 Gunicorn 可以为 Flask 和 Django 等应用程序提供服务。 Gunicorn 本身与 **FastAPI** 不兼容,因为 FastAPI 使用最新的 **ASGI 标准**。 +您可以使用 `--workers` 命令行选项来启动多个工作进程: -但 Gunicorn 支持充当 **进程管理器** 并允许用户告诉它要使用哪个特定的 **worker类**。 然后 Gunicorn 将使用该类启动一个或多个 **worker进程**。 +//// tab | `fastapi` -**Uvicorn** 有一个 Gunicorn 兼容的worker类。 - -使用这种组合,Gunicorn 将充当 **进程管理器**,监听 **端口** 和 **IP**。 它会将通信**传输**到运行**Uvicorn类**的worker进程。 - -然后与Gunicorn兼容的**Uvicorn worker**类将负责将Gunicorn发送的数据转换为ASGI标准以供FastAPI使用。 - -## 安装 Gunicorn 和 Uvicorn +如果您使用 `fastapi` 命令:
```console -$ pip install "uvicorn[standard]" gunicorn - ----> 100% -``` - -
+$ fastapi run --workers 4 main.py -这将安装带有`standard`扩展包(以获得高性能)的 Uvicorn 和 Gunicorn。 + FastAPI Starting production server 🚀 -## Run Gunicorn with Uvicorn Workers + Searching for package file structure from directories with + __init__.py files + Importing from /home/user/code/awesomeapp -接下来你可以通过以下命令运行Gunicorn: - -
- -```console -$ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80 - -[19499] [INFO] Starting gunicorn 20.1.0 -[19499] [INFO] Listening at: http://0.0.0.0:80 (19499) -[19499] [INFO] Using worker: uvicorn.workers.UvicornWorker -[19511] [INFO] Booting worker with pid: 19511 -[19513] [INFO] Booting worker with pid: 19513 -[19514] [INFO] Booting worker with pid: 19514 -[19515] [INFO] Booting worker with pid: 19515 -[19511] [INFO] Started server process [19511] -[19511] [INFO] Waiting for application startup. -[19511] [INFO] Application startup complete. -[19513] [INFO] Started server process [19513] -[19513] [INFO] Waiting for application startup. -[19513] [INFO] Application startup complete. -[19514] [INFO] Started server process [19514] -[19514] [INFO] Waiting for application startup. -[19514] [INFO] Application startup complete. -[19515] [INFO] Started server process [19515] -[19515] [INFO] Waiting for application startup. -[19515] [INFO] Application startup complete. -``` - -
+ module 🐍 main.py + code Importing the FastAPI app object from the module with the + following code: -让我们看看每个选项的含义: + from main import app -* `main:app`:这与 Uvicorn 使用的语法相同,`main` 表示名为"`main`"的 Python 模块,因此是文件 `main.py`。 `app` 是 **FastAPI** 应用程序的变量名称。 - * 你可以想象 `main:app` 相当于一个 Python `import` 语句,例如: + app Using import string: main:app - ```Python - from main import app - ``` + server Server started at http://0.0.0.0:8000 + server Documentation at http://0.0.0.0:8000/docs - * 因此,`main:app` 中的冒号相当于 `from main import app` 中的 Python `import` 部分。 + Logs: -* `--workers`:要使用的worker进程数量,每个进程将运行一个 Uvicorn worker进程,在本例中为 4 个worker进程。 - -* `--worker-class`:在worker进程中使用的与 Gunicorn 兼容的工作类。 - * 这里我们传递了 Gunicorn 可以导入和使用的类: - - ```Python - import uvicorn.workers.UvicornWorker - ``` - -* `--bind`:这告诉 Gunicorn 要监听的 IP 和端口,使用冒号 (`:`) 分隔 IP 和端口。 - * 如果您直接运行 Uvicorn,则可以使用`--host 0.0.0.0`和`--port 80`,而不是`--bind 0.0.0.0:80`(Gunicorn 选项)。 - - -在输出中,您可以看到它显示了每个进程的 **PID**(进程 ID)(它只是一个数字)。 - -你可以看到: - -* Gunicorn **进程管理器** 以 PID `19499` 开头(在您的情况下,它将是一个不同的数字)。 -* 然后它开始`Listening at: http://0.0.0.0:80`。 -* 然后它检测到它必须使用 `uvicorn.workers.UvicornWorker` 处的worker类。 -* 然后它启动**4个worker**,每个都有自己的PID:`19511`、`19513`、`19514`和`19515`。 - -Gunicorn 还将负责管理**死进程**和**重新启动**新进程(如果需要保持worker数量)。 因此,这在一定程度上有助于上面列表中**重启**的概念。 - -尽管如此,您可能还希望有一些外部的东西,以确保在必要时**重新启动 Gunicorn**,并且**在启动时运行它**等。 + INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to + quit) + INFO Started parent process [27365] + INFO Started server process [27368] + INFO Started server process [27369] + INFO Started server process [27370] + INFO Started server process [27367] + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Application startup complete. + INFO Application startup complete. + INFO Application startup complete. + INFO Application startup complete. +``` -## Uvicorn with Workers + -Uvicorn 也有一个选项可以启动和运行多个 **worker进程**。 +//// -然而,到目前为止,Uvicorn 处理worker进程的能力比 Gunicorn 更有限。 因此,如果您想拥有这个级别(Python 级别)的进程管理器,那么最好尝试使用 Gunicorn 作为进程管理器。 +//// tab | `uvicorn` -无论如何,您都可以像这样运行它: +如果您更想要直接使用 `uvicorn` 命令:
@@ -151,13 +105,15 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
+//// + 这里唯一的新选项是 `--workers` 告诉 Uvicorn 启动 4 个工作进程。 -您还可以看到它显示了每个进程的 **PID**,父进程(这是 **进程管理器**)的 PID 为`27365`,每个工作进程的 PID 为:`27368`、`27369`, `27370`和`27367`。 +您还可以看到它显示了每个进程的 **PID**,父进程(这是**进程管理器**)的 PID 为`27365`,每个工作进程的 PID 为:`27368`、`27369`, `27370`和`27367`。 ## 部署概念 -在这里,您了解了如何使用 **Gunicorn**(或 Uvicorn)管理 **Uvicorn 工作进程**来**并行**应用程序的执行,利用 CPU 中的 **多核**,并 能够满足**更多请求**。 +在这里,您学习了如何使用多个**工作进程(workers)**来让应用程序的执行**并行化**,充分利用 CPU 的**多核性能**,并能够处理**更多的请求**。 从上面的部署概念列表来看,使用worker主要有助于**复制**部分,并对**重新启动**有一点帮助,但您仍然需要照顾其他部分: @@ -170,15 +126,13 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 ## 容器和 Docker -在关于 [容器中的 FastAPI - Docker](docker.md){.internal-link target=_blank} 的下一章中,我将介绍一些可用于处理其他 **部署概念** 的策略。 - -我还将向您展示 **官方 Docker 镜像**,其中包括 **Gunicorn 和 Uvicorn worker** 以及一些对简单情况有用的默认配置。 +在关于 [容器中的 FastAPI - Docker](docker.md){.internal-link target=_blank} 的下一章中,我将介绍一些可用于处理其他**部署概念**的策略。 -在那里,我还将向您展示如何 **从头开始构建自己的镜像** 以运行单个 Uvicorn 进程(没有 Gunicorn)。 这是一个简单的过程,并且可能是您在使用像 **Kubernetes** 这样的分布式容器管理系统时想要做的事情。 +我将向您展示如何**从零开始构建自己的镜像**,以运行一个单独的 Uvicorn 进程。这个过程相对简单,并且在使用 **Kubernetes** 等分布式容器管理系统时,这通常是您需要采取的方法。 ## 回顾 -您可以使用**Gunicorn**(或Uvicorn)作为Uvicorn工作进程的进程管理器,以利用**多核CPU**,**并行运行多个进程**。 +您可以在使用 `fastapi` 或 `uvicorn` 命令时,通过 `--workers` CLI 选项启用多个工作进程(workers),以充分利用**多核 CPU**,以**并行运行多个进程**。 如果您要设置**自己的部署系统**,同时自己处理其他部署概念,则可以使用这些工具和想法。 From c5e2837e461ca037746b577dbc0306f8cb5bd5c6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 31 Mar 2025 08:13:40 +0000 Subject: [PATCH 008/138] =?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 bc122be5d..617758cba 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -14,6 +14,7 @@ hide: ### Translations +* 🌐 Update Chinese translation for `docs/zh/docs/deployment/server-workers.md`. PR [#13292](https://github.com/fastapi/fastapi/pull/13292) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#13348](https://github.com/fastapi/fastapi/pull/13348) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). ### Internal From d0a247fc5a0d8b0edf1b2848396f765c3ffe74b9 Mon Sep 17 00:00:00 2001 From: Zhongheng Cheng Date: Mon, 31 Mar 2025 04:14:47 -0400 Subject: [PATCH 009/138] =?UTF-8?q?=F0=9F=8C=90=20Update=20Chinese=20trans?= =?UTF-8?q?lation=20for=20`docs/zh/docs/deployment/manually.md`=20(#13324)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/deployment/manually.md | 158 ++++++++++++++-------------- 1 file changed, 78 insertions(+), 80 deletions(-) diff --git a/docs/zh/docs/deployment/manually.md b/docs/zh/docs/deployment/manually.md index 30ee7a1e9..3dc5942e3 100644 --- a/docs/zh/docs/deployment/manually.md +++ b/docs/zh/docs/deployment/manually.md @@ -1,159 +1,157 @@ -# 手动运行服务器 - Uvicorn +# 手动运行服务器 -在远程服务器计算机上运行 **FastAPI** 应用程序所需的主要东西是 ASGI 服务器程序,例如 **Uvicorn**。 +## 使用 `fastapi run` 命令 -有 3 个主要可选方案: +简而言之,使用 `fastapi run` 来运行您的 FastAPI 应用程序: -* Uvicorn:高性能 ASGI 服务器。 -* Hypercorn:与 HTTP/2 和 Trio 等兼容的 ASGI 服务器。 -* Daphne:为 Django Channels 构建的 ASGI 服务器。 - -## 服务器主机和服务器程序 - -关于名称,有一个小细节需要记住。 💡 - -“**服务器**”一词通常用于指远程/云计算机(物理机或虚拟机)以及在该计算机上运行的程序(例如 Uvicorn)。 +
-请记住,当您一般读到“服务器”这个名词时,它可能指的是这两者之一。 +```console +$ fastapi run main.py -当提到远程主机时,通常将其称为**服务器**,但也称为**机器**(machine)、**VM**(虚拟机)、**节点**。 这些都是指某种类型的远程计算机,通常运行 Linux,您可以在其中运行程序。 + FastAPI Starting production server 🚀 + Searching for package file structure from directories + with __init__.py files + Importing from /home/user/code/awesomeapp -## 安装服务器程序 + module 🐍 main.py -您可以使用以下命令安装 ASGI 兼容服务器: + code Importing the FastAPI app object from the module with + the following code: -//// tab | Uvicorn + from main import app -* Uvicorn,一个快如闪电 ASGI 服务器,基于 uvloop 和 httptools 构建。 + app Using import string: main:app -
+ server Server started at http://0.0.0.0:8000 + server Documentation at http://0.0.0.0:8000/docs -```console -$ pip install "uvicorn[standard]" + Logs: ----> 100% + INFO Started server process [2306215] + INFO Waiting for application startup. + INFO Application startup complete. + INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C + to quit) ```
-/// tip +这在大多数情况下都能正常运行。😎 -通过添加`standard`,Uvicorn 将安装并使用一些推荐的额外依赖项。 +例如,您可以使用该命令在容器、服务器等环境中启动您的 **FastAPI** 应用。 -其中包括`uvloop`,它是`asyncio`的高性能替代品,它提供了巨大的并发性能提升。 +## ASGI 服务器 -/// +让我们深入了解一些细节。 -//// +FastAPI 使用了一种用于构建 Python Web 框架和服务器的标准,称为 ASGI。FastAPI 本质上是一个 ASGI Web 框架。 -//// tab | Hypercorn +要在远程服务器上运行 **FastAPI** 应用(或任何其他 ASGI 应用),您需要一个 ASGI 服务器程序,例如 **Uvicorn**。它是 `fastapi` 命令默认使用的 ASGI 服务器。 -* Hypercorn,一个也与 HTTP/2 兼容的 ASGI 服务器。 - -
+除此之外,还有其他一些可选的 ASGI 服务器,例如: -```console -$ pip install hypercorn - ----> 100% -``` - -
+* Uvicorn:高性能 ASGI 服务器。 +* Hypercorn:与 HTTP/2 和 Trio 等兼容的 ASGI 服务器。 +* Daphne:为 Django Channels 构建的 ASGI 服务器。 +* Granian:基于 Rust 的 HTTP 服务器,专为 Python 应用设计。 +* NGINX Unit:NGINX Unit 是一个轻量级且灵活的 Web 应用运行时环境。 -...或任何其他 ASGI 服务器。 +## 服务器主机和服务器程序 -//// +关于名称,有一个小细节需要记住。 💡 -## 运行服务器程序 +“**服务器**”一词通常用于指远程/云计算机(物理机或虚拟机)以及在该计算机上运行的程序(例如 Uvicorn)。 -您可以按照之前教程中的相同方式运行应用程序,但不使用`--reload`选项,例如: +请记住,当您一般读到“服务器”这个名词时,它可能指的是这两者之一。 -//// tab | Uvicorn +当提到远程主机时,通常将其称为**服务器**,但也称为**机器**(machine)、**VM**(虚拟机)、**节点**。 这些都是指某种类型的远程计算机,通常运行 Linux,您可以在其中运行程序。 -
-```console -$ uvicorn main:app --host 0.0.0.0 --port 80 +## 安装服务器程序 -INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) -``` +当您安装 FastAPI 时,它自带一个生产环境服务器——Uvicorn,并且您可以使用 `fastapi run` 命令来启动它。 -
+不过,您也可以手动安装 ASGI 服务器。 -//// +请确保您创建并激活一个[虚拟环境](../virtual-environments.md){.internal-link target=_blank},然后再安装服务器应用程序。 -//// tab | Hypercorn +例如,要安装 Uvicorn,可以运行以下命令:
```console -$ hypercorn main:app --bind 0.0.0.0:80 +$ pip install "uvicorn[standard]" -Running on 0.0.0.0:8080 over http (CTRL + C to quit) +---> 100% ```
-//// +类似的流程也适用于任何其他 ASGI 服务器程序。 -/// warning +/// tip -如果您正在使用`--reload`选项,请记住删除它。 +通过添加 `standard` 选项,Uvicorn 将安装并使用一些推荐的额外依赖项。 - `--reload` 选项消耗更多资源,并且更不稳定。 +其中包括 `uvloop`,这是 `asyncio` 的高性能替代方案,能够显著提升并发性能。 - 它在**开发**期间有很大帮助,但您**不应该**在**生产环境**中使用它。 +当您使用 `pip install "fastapi[standard]"` 安装 FastAPI 时,实际上也会安装 `uvicorn[standard]`。 /// -## Hypercorn with Trio - -Starlette 和 **FastAPI** 基于 AnyIO, 所以它们才能同时与 Python 的标准库 asyncioTrio 兼容。 - -尽管如此,Uvicorn 目前仅与 asyncio 兼容,并且通常使用 `uvloop`, 它是`asyncio`的高性能替代品。 - -但如果你想直接使用**Trio**,那么你可以使用**Hypercorn**,因为它支持它。 ✨ - -### 安装具有 Trio 的 Hypercorn +## 运行服务器程序 -首先,您需要安装具有 Trio 支持的 Hypercorn: +如果您手动安装了 ASGI 服务器,通常需要以特定格式传递一个导入字符串,以便服务器能够正确导入您的 FastAPI 应用:
```console -$ pip install "hypercorn[trio]" ----> 100% +$ uvicorn main:app --host 0.0.0.0 --port 80 + +INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) ```
-### Run with Trio +/// note -然后你可以传递值`trio`给命令行选项`--worker-class`: +命令 `uvicorn main:app` 的含义如下: -
+* `main`:指的是 `main.py` 文件(即 Python “模块”)。 +* `app`:指的是 `main.py` 文件中通过 `app = FastAPI()` 创建的对象。 -```console -$ hypercorn main:app --worker-class trio +它等价于以下导入语句: + +```Python +from main import app ``` -
+/// + +每种 ASGI 服务器程序通常都会有类似的命令,您可以在它们的官方文档中找到更多信息。 + +/// warning + +Uvicorn 和其他服务器支持 `--reload` 选项,该选项在开发过程中非常有用。 -这将通过您的应用程序启动 Hypercorn,并使用 Trio 作为后端。 +但 `--reload` 选项会消耗更多资源,且相对不稳定。 -现在您可以在应用程序内部使用 Trio。 或者更好的是,您可以使用 AnyIO,使您的代码与 Trio 和 asyncio 兼容。 🎉 +它对于**开发阶段**非常有帮助,但在**生产环境**中**不应该**使用。 + +/// ## 部署概念 -这些示例运行服务器程序(例如 Uvicorn),启动**单个进程**,在所有 IP(`0.0.0.0`)上监听预定义端口(例如`80`)。 +这些示例运行服务器程序(例如 Uvicorn),启动**单个进程**,在所有 IP(`0.0.0.0`)上监听预定义端口(例如`80`)。 这是基本思路。 但您可能需要处理一些其他事情,例如: * 安全性 - HTTPS * 启动时运行 * 重新启动 -* Replication(运行的进程数) +* 复制(运行的进程数) * 内存 * 开始前的步骤 From 94ae778082ce6d9ce22c0088f234cc19dc012d5a Mon Sep 17 00:00:00 2001 From: Zhongheng Cheng Date: Mon, 31 Mar 2025 04:15:11 -0400 Subject: [PATCH 010/138] =?UTF-8?q?=F0=9F=8C=90=20Update=20Chinese=20trans?= =?UTF-8?q?lation=20for=20`docs/zh/docs/tutorial/index.md`=20(#13374)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/tutorial/index.md | 80 +++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 35 deletions(-) diff --git a/docs/zh/docs/tutorial/index.md b/docs/zh/docs/tutorial/index.md index ab19f02c5..3ca927337 100644 --- a/docs/zh/docs/tutorial/index.md +++ b/docs/zh/docs/tutorial/index.md @@ -1,34 +1,58 @@ # 教程 - 用户指南 -本教程将一步步向你展示如何使用 **FastAPI** 的绝大部分特性。 +本教程将一步步向您展示如何使用 **FastAPI** 的绝大部分特性。 -各个章节的内容循序渐进,但是又围绕着单独的主题,所以你可以直接跳转到某个章节以解决你的特定需求。 +各个章节的内容循序渐进,但是又围绕着单独的主题,所以您可以直接跳转到某个章节以解决您的特定需求。 -本教程同样可以作为将来的参考手册。 - -你可以随时回到本教程并查阅你需要的内容。 +本教程同样可以作为将来的参考手册,所以您可以随时回到本教程并查阅您需要的内容。 ## 运行代码 所有代码片段都可以复制后直接使用(它们实际上是经过测试的 Python 文件)。 -要运行任何示例,请将代码复制到 `main.py` 文件中,然后使用以下命令启动 `uvicorn`: +要运行任何示例,请将代码复制到 `main.py` 文件中,然后使用以下命令启动 `fastapi dev`:
```console -$ uvicorn main:app --reload +$ fastapi dev main.py + + FastAPI Starting development server 🚀 + + Searching for package file structure from directories + with __init__.py files + Importing from /home/user/code/awesomeapp + + module 🐍 main.py + + code Importing the FastAPI app object from the module with + the following code: + + from main import app + + app Using import string: main:app + + server Server started at http://127.0.0.1:8000 + server Documentation at http://127.0.0.1:8000/docs + + tip Running in development mode, for production use: + fastapi run + + Logs: -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) -INFO: Started reloader process [28720] -INFO: Started server process [28722] -INFO: Waiting for application startup. -INFO: Application startup complete. + 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 [383138] using WatchFiles + INFO Started server process [383153] + INFO Waiting for application startup. + INFO Application startup complete. ```
-强烈建议你在本地编写或复制代码,对其进行编辑并运行。 +**强烈建议**您在本地编写或复制代码,对其进行编辑并运行。 在编辑器中使用 FastAPI 会真正地展现出它的优势:只需要编写很少的代码,所有的类型检查,代码补全等等。 @@ -36,48 +60,34 @@ $ uvicorn main:app --reload ## 安装 FastAPI -第一个步骤是安装 FastAPI。 +第一个步骤是安装 FastAPI. -为了使用本教程,你可能需要安装所有的可选依赖及对应功能: +请确保您创建并激活一个[虚拟环境](../virtual-environments.md){.internal-link target=_blank},然后**安装 FastAPI**:
```console -$ pip install "fastapi[all]" +$ pip install "fastapi[standard]" ---> 100% ```
-......以上安装还包括了 `uvicorn`,你可以将其用作运行代码的服务器。 - /// note -你也可以分开来安装。 - -假如你想将应用程序部署到生产环境,你可能要执行以下操作: - -``` -pip install fastapi -``` - -并且安装`uvicorn`来作为服务器: - -``` -pip install "uvicorn[standard]" -``` +当您使用 `pip install "fastapi[standard]"` 进行安装时,它会附带一些默认的可选标准依赖项。 -然后对你想使用的每个可选依赖项也执行相同的操作。 +如果您不想安装这些可选依赖,可以选择安装 `pip install fastapi`。 /// ## 进阶用户指南 -在本**教程-用户指南**之后,你可以阅读**进阶用户指南**。 +在本**教程-用户指南**之后,您可以阅读**进阶用户指南**。 **进阶用户指南**以本教程为基础,使用相同的概念,并教授一些额外的特性。 -但是你应该先阅读**教程-用户指南**(即你现在正在阅读的内容)。 +但是您应该先阅读**教程-用户指南**(即您现在正在阅读的内容)。 -教程经过精心设计,使你可以仅通过**教程-用户指南**来开发一个完整的应用程序,然后根据你的需要,使用**进阶用户指南**中的一些其他概念,以不同的方式来扩展它。 +教程经过精心设计,使您可以仅通过**教程-用户指南**来开发一个完整的应用程序,然后根据您的需要,使用**进阶用户指南**中的一些其他概念,以不同的方式来扩展它。 From 4749ff586c5f4951aec9b3724bbc3fd163e46bdf Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 31 Mar 2025 08:16:12 +0000 Subject: [PATCH 011/138] =?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 617758cba..a869743d4 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -14,6 +14,7 @@ hide: ### Translations +* 🌐 Update Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#13324](https://github.com/fastapi/fastapi/pull/13324) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/deployment/server-workers.md`. PR [#13292](https://github.com/fastapi/fastapi/pull/13292) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#13348](https://github.com/fastapi/fastapi/pull/13348) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). From 921e2e58816bc21555bfe5498912cc5fafe5f168 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 31 Mar 2025 08:16:36 +0000 Subject: [PATCH 012/138] =?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 a869743d4..955bc6467 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -14,6 +14,7 @@ hide: ### Translations +* 🌐 Update Chinese translation for `docs/zh/docs/tutorial/index.md`. PR [#13374](https://github.com/fastapi/fastapi/pull/13374) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#13324](https://github.com/fastapi/fastapi/pull/13324) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/deployment/server-workers.md`. PR [#13292](https://github.com/fastapi/fastapi/pull/13292) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/first-steps.md`. PR [#13348](https://github.com/fastapi/fastapi/pull/13348) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). From cfdcad1dd2ad6821129d8151b7d1171d4efa04aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8?= =?UTF-8?q?=D0=BD=20=D0=A0=D0=BE=D1=89=D1=83=D0=BF=D0=BA=D0=B8=D0=BD?= <53541518+minaton-ru@users.noreply.github.com> Date: Mon, 31 Mar 2025 11:20:29 +0300 Subject: [PATCH 013/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?= =?UTF-8?q?ion=20for=20`docs/ru/docs/tutorial/header-param-models.md`=20(#?= =?UTF-8?q?13526)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/tutorial/header-param-models.md | 72 ++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 docs/ru/docs/tutorial/header-param-models.md diff --git a/docs/ru/docs/tutorial/header-param-models.md b/docs/ru/docs/tutorial/header-param-models.md new file mode 100644 index 000000000..4f54e3e15 --- /dev/null +++ b/docs/ru/docs/tutorial/header-param-models.md @@ -0,0 +1,72 @@ +# Модели Header-параметров + +Если у вас есть группа связанных **header-параметров**, то вы можете объединить их в одну **Pydantic-модель**. + +Это позволит вам **переиспользовать модель** в **разных местах**, а также задать валидацию и метаданные сразу для всех параметров. 😎 + +/// note | Заметка + +Этот функционал доступен в FastAPI начиная с версии `0.115.0`. 🤓 + +/// + +## Header-параметры в виде Pydantic-модели + +Объявите нужные **header-параметры** в **Pydantic-модели** и затем аннотируйте параметр как `Header`: + +{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *} + +**FastAPI** **извлечёт** данные для **каждого поля** из **заголовков** запроса и выдаст заданную вами Pydantic-модель. + +## Проверьте документацию + +Вы можете посмотреть нужные header-параметры в графическом интерфейсе сгенерированной документации по пути `/docs`: + +
+ +
+ +## Как запретить дополнительные заголовки + +В некоторых случаях (не особо часто встречающихся) вам может понадобиться **ограничить** заголовки, которые вы хотите получать. + +Вы можете использовать возможности конфигурации Pydantic-модели для того, чтобы запретить (`forbid`) любые дополнительные (`extra`) поля: + +{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *} + +Если клиент попробует отправить **дополнительные заголовки**, то в ответ он получит **ошибку**. + +Например, если клиент попытается отправить заголовок `tool` со значением `plumbus`, то в ответ он получит ошибку, сообщающую ему, что header-параметр `tool` не разрешен: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["header", "tool"], + "msg": "Extra inputs are not permitted", + "input": "plumbus", + } + ] +} +``` + +## Как отключить автоматическое преобразование подчеркиваний + +Как и в случае с обычными заголовками, если у вас в именах параметров имеются символы подчеркивания, они **автоматически преобразовываются в дефис**. + +Например, если в коде есть header-параметр `save_data`, то ожидаемый HTTP-заголовок будет `save-data` и именно так он будет отображаться в документации. + +Если по каким-то причинам вам нужно отключить данное автоматическое преобразование, это можно сделать и для Pydantic-моделей для header-параметров. + +{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *} + +/// warning | Внимание + +Перед тем как устанавливать для параметра `convert_underscores` значение `False`, имейте в виду, что некоторые HTTP-прокси и серверы не разрешают использовать заголовки с символами подчеркивания. + +/// + +## Резюме + +Вы можете использовать **Pydantic-модели** для объявления **header-параметров** в **FastAPI**. 😎 From 1d434dec47e43e221bc10115bd1f0844956f9437 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 31 Mar 2025 08:21:02 +0000 Subject: [PATCH 014/138] =?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 955bc6467..264dfb2ab 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -14,6 +14,7 @@ hide: ### Translations +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/header-param-models.md`. PR [#13526](https://github.com/fastapi/fastapi/pull/13526) by [@minaton-ru](https://github.com/minaton-ru). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/index.md`. PR [#13374](https://github.com/fastapi/fastapi/pull/13374) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#13324](https://github.com/fastapi/fastapi/pull/13324) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/deployment/server-workers.md`. PR [#13292](https://github.com/fastapi/fastapi/pull/13292) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). From 6fefc17a84bed78378435ba492cde04cf979fc19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Apr 2025 21:33:35 +0200 Subject: [PATCH 015/138] =?UTF-8?q?=E2=AC=86=20Bump=20dirty-equals=20from?= =?UTF-8?q?=200.8.0=20to=200.9.0=20(#13561)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [dirty-equals](https://github.com/samuelcolvin/dirty-equals) from 0.8.0 to 0.9.0. - [Release notes](https://github.com/samuelcolvin/dirty-equals/releases) - [Commits](https://github.com/samuelcolvin/dirty-equals/compare/v0.8.0...v0.9.0) --- updated-dependencies: - dependency-name: dirty-equals dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-tests.txt b/requirements-tests.txt index 6a870add6..013b9a35a 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -3,7 +3,7 @@ pytest >=7.1.3,<9.0.0 coverage[toml] >= 6.5.0,< 8.0 mypy ==1.8.0 -dirty-equals ==0.8.0 +dirty-equals ==0.9.0 sqlmodel==0.0.23 flask >=1.1.2,<4.0.0 anyio[trio] >=3.2.1,<5.0.0 From 77c8b5b3b9c5c1273bcb4b799b24ed2e04fd2c90 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 2 Apr 2025 19:33:56 +0000 Subject: [PATCH 016/138] =?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 264dfb2ab..546e1d717 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Internal +* ⬆ Bump dirty-equals from 0.8.0 to 0.9.0. PR [#13561](https://github.com/fastapi/fastapi/pull/13561) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Clean up `docs/en/mkdocs.yml` configuration file. PR [#13542](https://github.com/fastapi/fastapi/pull/13542) by [@svlandeg](https://github.com/svlandeg). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#12986](https://github.com/fastapi/fastapi/pull/12986) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From 286f5a0c42e1817f0d64564afb4e8051ce85140c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 2 Apr 2025 21:47:36 +0200 Subject: [PATCH 017/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Contributors=20and=20Translators=20(#13558)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/contributors.yml | 21 +-- docs/en/data/translation_reviewers.yml | 178 +++++++++++++++---------- docs/en/data/translators.yml | 49 ++++--- 3 files changed, 144 insertions(+), 104 deletions(-) diff --git a/docs/en/data/contributors.yml b/docs/en/data/contributors.yml index c4364e923..1910854af 100644 --- a/docs/en/data/contributors.yml +++ b/docs/en/data/contributors.yml @@ -1,17 +1,17 @@ tiangolo: login: tiangolo - count: 723 + count: 730 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo dependabot: login: dependabot - count: 94 + count: 98 avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4 url: https://github.com/apps/dependabot alejsdev: login: alejsdev count: 47 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=843355286cea366cbb3a4fc3a14343bd4eceef55&v=4 url: https://github.com/alejsdev github-actions: login: github-actions @@ -25,7 +25,7 @@ Kludex: url: https://github.com/Kludex pre-commit-ci: login: pre-commit-ci - count: 22 + count: 23 avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4 url: https://github.com/apps/pre-commit-ci dmontagu: @@ -70,7 +70,7 @@ vishnuvskvkl: url: https://github.com/vishnuvskvkl svlandeg: login: svlandeg - count: 6 + count: 7 avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 url: https://github.com/svlandeg alissadb: @@ -171,7 +171,7 @@ hukkin: marcosmmb: login: marcosmmb count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/6181089?u=b8567a842b38c5570c315b2b7ca766fa7be6721e&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/6181089?u=03c50eec631857d84df5232890780d00a3f76903&v=4 url: https://github.com/marcosmmb Serrones: login: Serrones @@ -311,7 +311,7 @@ dconathan: Jamim: login: Jamim count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=0cf3027bec78ba4f0b89802430c136bc69847d7a&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=9ce0b6a6d1a5124e28b3c04d8d26827ca328713a&v=4 url: https://github.com/Jamim svalouch: login: svalouch @@ -366,7 +366,7 @@ sattosan: michaeloliverx: login: michaeloliverx count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/55017335?u=e606eb5cc397c07523be47637b1ee796904fbb59&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/55017335?u=efb0cb6e261ff64d862fafb91ee80fc2e1f8a2ed&v=4 url: https://github.com/michaeloliverx voegtlel: login: voegtlel @@ -528,3 +528,8 @@ DanielYang59: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/80093591?u=63873f701c7c74aac83c906800a1dddc0bc8c92f&v=4 url: https://github.com/DanielYang59 +blueswen: + login: blueswen + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/1564148?u=6d6b8cc8f2b5cef715e68d6175154a8a94d518ee&v=4 + url: https://github.com/blueswen diff --git a/docs/en/data/translation_reviewers.yml b/docs/en/data/translation_reviewers.yml index 1a3c12988..5f1a89141 100644 --- a/docs/en/data/translation_reviewers.yml +++ b/docs/en/data/translation_reviewers.yml @@ -8,16 +8,16 @@ Xewus: count: 140 avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4 url: https://github.com/Xewus +sodaMelon: + login: sodaMelon + count: 113 + avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4 + url: https://github.com/sodaMelon ceb10n: login: ceb10n count: 112 avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 url: https://github.com/ceb10n -sodaMelon: - login: sodaMelon - count: 111 - avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4 - url: https://github.com/sodaMelon tokusumi: login: tokusumi count: 104 @@ -33,6 +33,11 @@ hard-coders: count: 92 avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4 url: https://github.com/hard-coders +alv2017: + login: alv2017 + count: 86 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 nazarepiedady: login: nazarepiedady count: 83 @@ -43,11 +48,6 @@ AlertRED: count: 81 avatarUrl: https://avatars.githubusercontent.com/u/15695000?u=f5a4944c6df443030409c88da7d7fa0b7ead985c&v=4 url: https://github.com/AlertRED -alv2017: - login: alv2017 - count: 81 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 Alexandrhub: login: Alexandrhub count: 68 @@ -65,12 +65,12 @@ cassiobotaro: url: https://github.com/cassiobotaro mattwang44: login: mattwang44 - count: 58 + count: 59 avatarUrl: https://avatars.githubusercontent.com/u/24987826?u=58e37fb3927b9124b458945ac4c97aa0f1062d85&v=4 url: https://github.com/mattwang44 tiangolo: login: tiangolo - count: 51 + count: 52 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo Laineyzhang55: @@ -88,16 +88,26 @@ komtaki: count: 45 avatarUrl: https://avatars.githubusercontent.com/u/39375566?u=260ad6b1a4b34c07dbfa728da5e586f16f6d1824&v=4 url: https://github.com/komtaki +rostik1410: + login: rostik1410 + count: 42 + avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4 + url: https://github.com/rostik1410 +svlandeg: + login: svlandeg + count: 42 + avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 + url: https://github.com/svlandeg alperiox: login: alperiox count: 42 avatarUrl: https://avatars.githubusercontent.com/u/34214152?u=2c5acad3461d4dbc2d48371ba86cac56ae9b25cc&v=4 url: https://github.com/alperiox -rostik1410: - login: rostik1410 +Rishat-F: + login: Rishat-F count: 41 - avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4 - url: https://github.com/rostik1410 + avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4 + url: https://github.com/Rishat-F Winand: login: Winand count: 40 @@ -126,7 +136,7 @@ SwftAlpc: alejsdev: login: alejsdev count: 36 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=843355286cea366cbb3a4fc3a14343bd4eceef55&v=4 url: https://github.com/alejsdev timothy-jeong: login: timothy-jeong @@ -138,16 +148,6 @@ nilslindemann: count: 35 avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4 url: https://github.com/nilslindemann -svlandeg: - login: svlandeg - count: 35 - avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 - url: https://github.com/svlandeg -Rishat-F: - login: Rishat-F - count: 35 - avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4 - url: https://github.com/Rishat-F rjNemo: login: rjNemo count: 34 @@ -158,6 +158,11 @@ codingjenny: count: 34 avatarUrl: https://avatars.githubusercontent.com/u/103817302?u=3a042740dc0ff58615da0d8679230966fd7693e8&v=4 url: https://github.com/codingjenny +mezgoodle: + login: mezgoodle + count: 33 + avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=4a9c765af688389d54296845d18b8f6cd6ddf09a&v=4 + url: https://github.com/mezgoodle akarev0: login: akarev0 count: 33 @@ -178,6 +183,11 @@ LorhanSohaky: count: 30 avatarUrl: https://avatars.githubusercontent.com/u/16273730?u=095b66f243a2cd6a0aadba9a095009f8aaf18393&v=4 url: https://github.com/LorhanSohaky +Vincy1230: + login: Vincy1230 + count: 30 + avatarUrl: https://avatars.githubusercontent.com/u/81342412?u=ab5e256a4077a4a91f3f9cd2115ba80780454cbe&v=4 + url: https://github.com/Vincy1230 black-redoc: login: black-redoc count: 29 @@ -201,7 +211,7 @@ dedkot01: hsuanchi: login: hsuanchi count: 28 - avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=0b094ae292292fee093818e37ceb645c114d2bff&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=7d25a398e478b6e63503bf6f26c54efa9e0da07b&v=4 url: https://github.com/hsuanchi dpinezich: login: dpinezich @@ -228,16 +238,6 @@ junah201: count: 26 avatarUrl: https://avatars.githubusercontent.com/u/75025529?u=2451c256e888fa2a06bcfc0646d09b87ddb6a945&v=4 url: https://github.com/junah201 -mezgoodle: - login: mezgoodle - count: 26 - avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=e871bc26734eb2436d98c19c3fb57a4773e13c24&v=4 - url: https://github.com/mezgoodle -Vincy1230: - login: Vincy1230 - count: 26 - avatarUrl: https://avatars.githubusercontent.com/u/81342412?u=ab5e256a4077a4a91f3f9cd2115ba80780454cbe&v=4 - url: https://github.com/Vincy1230 zy7y: login: zy7y count: 25 @@ -376,8 +376,13 @@ Joao-Pedro-P-Holanda: JaeHyuckSa: login: JaeHyuckSa count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/104830931?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/104830931?u=b19b3e24d6030f88d22bd3e953f9525d2f062da3&v=4 url: https://github.com/JaeHyuckSa +SofiiaTrufanova: + login: SofiiaTrufanova + count: 16 + avatarUrl: https://avatars.githubusercontent.com/u/63260929?u=483e0b64fabc76343b3be39b7e1dcb930a95e1bb&v=4 + url: https://github.com/SofiiaTrufanova Jedore: login: Jedore count: 15 @@ -411,8 +416,13 @@ BORA040126: mattkoehne: login: mattkoehne count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/80362153?u=6e1439582715693407b86182eb66263bb578a761&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/80362153?v=4 url: https://github.com/mattkoehne +DianaTrufanova: + login: DianaTrufanova + count: 14 + avatarUrl: https://avatars.githubusercontent.com/u/119067607?u=1cd55f841b68b4a187fa6d06a7dafa5f070195aa&v=4 + url: https://github.com/DianaTrufanova jovicon: login: jovicon count: 13 @@ -706,7 +716,7 @@ KimJoonSeo: MinLee0210: login: MinLee0210 count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=7def7c0654ad82f43b46d6dfc3b51c4d2be15011&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=25f979af418692b95e907df93607a09117e14b53&v=4 url: https://github.com/MinLee0210 camigomezdev: login: camigomezdev @@ -718,6 +728,11 @@ maru0123-2004: count: 8 avatarUrl: https://avatars.githubusercontent.com/u/43961566?u=16ed8603a4d6a4665cb6c53a7aece6f31379b769&v=4 url: https://github.com/maru0123-2004 +minaton-ru: + login: minaton-ru + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/53541518?u=67336ca11a85493f75031508aade588dad3b9910&v=4 + url: https://github.com/minaton-ru Serrones: login: Serrones count: 7 @@ -873,16 +888,11 @@ bankofsardine: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/44944207?u=0368e1b698ffab6bf29e202f9fd2dddd352429f1&v=4 url: https://github.com/bankofsardine -SofiiaTrufanova: - login: SofiiaTrufanova - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/63260929?v=4 - url: https://github.com/SofiiaTrufanova -DianaTrufanova: - login: DianaTrufanova +valentinDruzhinin: + login: valentinDruzhinin count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/119067607?v=4 - url: https://github.com/DianaTrufanova + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin rsip22: login: rsip22 count: 5 @@ -911,7 +921,7 @@ TemaSpb: BugLight: login: BugLight count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/13618366?u=57572e544e40c2a491db5bf7255bd24886d2cb09&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/13618366?u=7d733749f80e5f7e66a434cf42aedcfc60340f43&v=4 url: https://github.com/BugLight 0x4Dark: login: 0x4Dark @@ -998,6 +1008,11 @@ devluisrodrigues: count: 5 avatarUrl: https://avatars.githubusercontent.com/u/103431660?u=d9674a3249edc4601d2c712cdebf899918503c3a&v=4 url: https://github.com/devluisrodrigues +Zerohertz: + login: Zerohertz + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=c6acda352c866b1747921e0ff8782b58571d849e&v=4 + url: https://github.com/Zerohertz 11kkw: login: 11kkw count: 5 @@ -1033,6 +1048,11 @@ FelipeSilva93: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/66804965?u=e7cb4b580e46f2e04ecb4cd4d7a12acdddd3c6c1&v=4 url: https://github.com/FelipeSilva93 +peacekimjapan: + login: peacekimjapan + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/33534175?u=e4219bcebc3773a7068cc34c3eb268ef77cec31b&v=4 + url: https://github.com/peacekimjapan bas-baskara: login: bas-baskara count: 4 @@ -1061,7 +1081,7 @@ aminalaee: erfan-rfmhr: login: erfan-rfmhr count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/98986056?u=6c4f9218fe5bb04780dd92bfced360c55e2009f0&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/98986056?u=b1559d684b1ced11b2204546fa3cf28addf665a8&v=4 url: https://github.com/erfan-rfmhr Scorpionchiques: login: Scorpionchiques @@ -1123,11 +1143,11 @@ gerry-sabar: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/1120123?v=4 url: https://github.com/gerry-sabar -valentinDruzhinin: - login: valentinDruzhinin +cookie-byte217: + login: cookie-byte217 count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 - url: https://github.com/valentinDruzhinin + avatarUrl: https://avatars.githubusercontent.com/u/57880178?v=4 + url: https://github.com/cookie-byte217 tyronedamasceno: login: tyronedamasceno count: 3 @@ -1206,7 +1226,7 @@ RuslanTer: FedorGN: login: FedorGN count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/66411909?u=1c6734e92f50c7d66f130ef7d394e72b53770fe6&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/66411909?u=22382380e7d66ee57ffbfc2ae6bd5efd0cdb672e&v=4 url: https://github.com/FedorGN rafsaf: login: rafsaf @@ -1328,6 +1348,11 @@ kohiry: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/57669492?u=f6ab0a062740261e882879269a41a47788c84043&v=4 url: https://github.com/kohiry +ptt3199: + login: ptt3199 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=2c3d947a80283e32bf616d4c3af139a6be69680f&v=4 + url: https://github.com/ptt3199 arynoot: login: arynoot count: 3 @@ -1353,16 +1378,21 @@ RyaWcksn: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/42831964?u=0cb4265faf3e3425a89e59b6fddd3eb2de180af0&v=4 url: https://github.com/RyaWcksn -Zerohertz: - login: Zerohertz - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=c6acda352c866b1747921e0ff8782b58571d849e&v=4 - url: https://github.com/Zerohertz tienduong-21: login: tienduong-21 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/80129618?v=4 url: https://github.com/tienduong-21 +jameselite: + login: jameselite + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=6964d633449bf7d4a83d0fa0198f81f9ee5cfcd0&v=4 + url: https://github.com/jameselite +zbellos: + login: zbellos + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/204500646?v=4 + url: https://github.com/zbellos blaisep: login: blaisep count: 2 @@ -1468,11 +1498,6 @@ lindsayzhou: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/26602940?u=3c52ce6393bb547c97e6380ccdee03e0c64152c6&v=4 url: https://github.com/0xflotus -peacekimjapan: - login: peacekimjapan - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/33534175?u=e4219bcebc3773a7068cc34c3eb268ef77cec31b&v=4 - url: https://github.com/peacekimjapan jonatasoli: login: jonatasoli count: 2 @@ -1656,7 +1681,7 @@ zhiquanchi: Jamim: login: Jamim count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=0cf3027bec78ba4f0b89802430c136bc69847d7a&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/5607572?u=9ce0b6a6d1a5124e28b3c04d8d26827ca328713a&v=4 url: https://github.com/Jamim alvinkhalil: login: alvinkhalil @@ -1666,7 +1691,7 @@ alvinkhalil: leylaeminova: login: leylaeminova count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/100516839?u=35a9ce14bb86d7d7faa25d432f61dec2984cb818&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/100516839?u=0b0dab9e31742076b22812b14a39b4e6d8f6de4a&v=4 url: https://github.com/leylaeminova UN-9BOT: login: UN-9BOT @@ -1678,11 +1703,6 @@ flasonme: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/30571019?v=4 url: https://github.com/flasonme -ptt3199: - login: ptt3199 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=ccf51f8820787e17983954f26b06acf226cba293&v=4 - url: https://github.com/ptt3199 gustavoprezoto: login: gustavoprezoto count: 2 @@ -1733,3 +1753,13 @@ J-Fuji: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/101452903?v=4 url: https://github.com/J-Fuji +MrL8199: + login: MrL8199 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/39489075?u=3fc4f89c86973e40b5970d838c801bdbc13ac828&v=4 + url: https://github.com/MrL8199 +ivintoiu: + login: ivintoiu + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/1853336?u=5e3d0977f44661fb9712fa297cc8f7608ea6ce48&v=4 + url: https://github.com/ivintoiu diff --git a/docs/en/data/translators.yml b/docs/en/data/translators.yml index 9874afa56..f79bb300a 100644 --- a/docs/en/data/translators.yml +++ b/docs/en/data/translators.yml @@ -33,6 +33,11 @@ waynerv: count: 20 avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4 url: https://github.com/waynerv +valentinDruzhinin: + login: valentinDruzhinin + count: 18 + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin AlertRED: login: AlertRED count: 16 @@ -53,16 +58,16 @@ codingjenny: count: 14 avatarUrl: https://avatars.githubusercontent.com/u/103817302?u=3a042740dc0ff58615da0d8679230966fd7693e8&v=4 url: https://github.com/codingjenny -valentinDruzhinin: - login: valentinDruzhinin - count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 - url: https://github.com/valentinDruzhinin Xewus: login: Xewus count: 13 avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4 url: https://github.com/Xewus +Zhongheng-Cheng: + login: Zhongheng-Cheng + count: 13 + avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4 + url: https://github.com/Zhongheng-Cheng Smlep: login: Smlep count: 11 @@ -83,11 +88,6 @@ Vincy1230: count: 9 avatarUrl: https://avatars.githubusercontent.com/u/81342412?u=ab5e256a4077a4a91f3f9cd2115ba80780454cbe&v=4 url: https://github.com/Vincy1230 -Zhongheng-Cheng: - login: Zhongheng-Cheng - count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/95612344?u=a0f7730a3cc7486827965e01a119ad610bda4b0a&v=4 - url: https://github.com/Zhongheng-Cheng rjNemo: login: rjNemo count: 8 @@ -103,6 +103,11 @@ pablocm83: count: 8 avatarUrl: https://avatars.githubusercontent.com/u/28315068?u=3310fbb05bb8bfc50d2c48b6cb64ac9ee4a14549&v=4 url: https://github.com/pablocm83 +ptt3199: + login: ptt3199 + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=2c3d947a80283e32bf616d4c3af139a6be69680f&v=4 + url: https://github.com/ptt3199 batlopes: login: batlopes count: 6 @@ -118,11 +123,6 @@ Alexandrhub: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/119126536?u=9fc0d48f3307817bafecc5861eb2168401a6cb04&v=4 url: https://github.com/Alexandrhub -ptt3199: - login: ptt3199 - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/51350651?u=ccf51f8820787e17983954f26b06acf226cba293&v=4 - url: https://github.com/ptt3199 Serrones: login: Serrones count: 5 @@ -203,6 +203,11 @@ kwang1215: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/74170199?u=2a63ff6692119dde3f5e5693365b9fcd6f977b08&v=4 url: https://github.com/kwang1215 +k94-ishi: + login: k94-ishi + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/32672580?u=bc7c5c07af0656be9fe4f1784a444af8d81ded89&v=4 + url: https://github.com/k94-ishi jfunez: login: jfunez count: 3 @@ -271,12 +276,12 @@ mojtabapaso: hsuanchi: login: hsuanchi count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=0b094ae292292fee093818e37ceb645c114d2bff&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=7d25a398e478b6e63503bf6f26c54efa9e0da07b&v=4 url: https://github.com/hsuanchi alejsdev: login: alejsdev count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=356f39ff3f0211c720b06d3dbb060e98884085e3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=843355286cea366cbb3a4fc3a14343bd4eceef55&v=4 url: https://github.com/alejsdev riroan: login: riroan @@ -333,11 +338,6 @@ gerry-sabar: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/1120123?v=4 url: https://github.com/gerry-sabar -k94-ishi: - login: k94-ishi - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/32672580?u=bc7c5c07af0656be9fe4f1784a444af8d81ded89&v=4 - url: https://github.com/k94-ishi Rishat-F: login: Rishat-F count: 3 @@ -513,3 +513,8 @@ timothy-jeong: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/21125286?v=4 url: https://github.com/11kkw +yes0ng: + login: yes0ng + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/25501794?u=3aed18b0d491e0220a167a1e9e58bea3638c6707&v=4 + url: https://github.com/yes0ng From 1abef20dbddde878ef6844f219ab6e1d84444248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 2 Apr 2025 21:47:46 +0200 Subject: [PATCH 018/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Sponsors=20(#13559)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/github_sponsors.yml | 109 +++++++++++++++---------------- 1 file changed, 53 insertions(+), 56 deletions(-) diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml index 805d72b73..de6d44f96 100644 --- a/docs/en/data/github_sponsors.yml +++ b/docs/en/data/github_sponsors.yml @@ -9,11 +9,8 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4 url: https://github.com/Nixtla - login: andrew-propelauth - avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=1188c27cb744bbec36447a2cfd4453126b2ddb5c&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=c98993dec8553c09d424ede67bbe86e5c35f48c9&v=4 url: https://github.com/andrew-propelauth - - login: liblaber - avatarUrl: https://avatars.githubusercontent.com/u/100821118?v=4 - url: https://github.com/liblaber - login: zanfaruqui avatarUrl: https://avatars.githubusercontent.com/u/104461687?v=4 url: https://github.com/zanfaruqui @@ -71,7 +68,10 @@ sponsors: - login: acsone avatarUrl: https://avatars.githubusercontent.com/u/7601056?v=4 url: https://github.com/acsone -- - login: Trivie +- - login: ecosyste-ms + avatarUrl: https://avatars.githubusercontent.com/u/98474690?v=4 + url: https://github.com/ecosyste-ms + - login: Trivie avatarUrl: https://avatars.githubusercontent.com/u/8161763?v=4 url: https://github.com/Trivie - - login: takashi-yoneya @@ -86,6 +86,9 @@ sponsors: - login: yasyf avatarUrl: https://avatars.githubusercontent.com/u/709645?u=f36736b3c6a85f578886ecc42a740e7b436e7a01&v=4 url: https://github.com/yasyf +- - login: alixlahuec + avatarUrl: https://avatars.githubusercontent.com/u/29543316?u=44357eb2a93bccf30fb9d389b8befe94a3d00985&v=4 + url: https://github.com/alixlahuec - - login: primer-io avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4 url: https://github.com/primer-io @@ -101,27 +104,27 @@ sponsors: - - login: samuelcolvin avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4 url: https://github.com/samuelcolvin - - login: vincentkoc - avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4 - url: https://github.com/vincentkoc - - login: ddilidili - avatarUrl: https://avatars.githubusercontent.com/u/42176885?u=c0a849dde06987434653197b5f638d3deb55fc6c&v=4 - url: https://github.com/ddilidili + - login: ProteinQure + avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 + url: https://github.com/ProteinQure - login: otosky avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4 url: https://github.com/otosky - login: ramonalmeidam avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4 url: https://github.com/ramonalmeidam + - login: mjohnsey + avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4 + url: https://github.com/mjohnsey + - login: ashi-agrawal + avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4 + url: https://github.com/ashi-agrawal - login: sepsi77 avatarUrl: https://avatars.githubusercontent.com/u/18682303?v=4 url: https://github.com/sepsi77 - login: RaamEEIL avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4 url: https://github.com/RaamEEIL - - login: jhundman - avatarUrl: https://avatars.githubusercontent.com/u/24263908?v=4 - url: https://github.com/jhundman - login: b-rad-c avatarUrl: https://avatars.githubusercontent.com/u/25362581?u=5bb10629f4015b62bec1f9a366675d5085551af9&v=4 url: https://github.com/b-rad-c @@ -137,15 +140,6 @@ sponsors: - login: Leay15 avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4 url: https://github.com/Leay15 - - login: BoYanZh - avatarUrl: https://avatars.githubusercontent.com/u/32470225?u=55b174d080382822759d74307f8a0355fa86e808&v=4 - url: https://github.com/BoYanZh - - login: ygorpontelo - avatarUrl: https://avatars.githubusercontent.com/u/32963605?u=35f7103f9c4c4c2589ae5737ee882e9375ef072e&v=4 - url: https://github.com/ygorpontelo - - login: ProteinQure - avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 - url: https://github.com/ProteinQure - login: chickenandstats avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4 url: https://github.com/chickenandstats @@ -212,12 +206,9 @@ sponsors: - login: gorhack avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4 url: https://github.com/gorhack - - login: Ryandaydev - avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=48f68868db8886fce31a1d802c1003914c6cd7c6&v=4 - url: https://github.com/Ryandaydev - - login: jaredtrog - avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 - url: https://github.com/jaredtrog + - login: vincentkoc + avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4 + url: https://github.com/vincentkoc - login: jstanden avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4 url: https://github.com/jstanden @@ -272,12 +263,12 @@ sponsors: - login: khadrawy avatarUrl: https://avatars.githubusercontent.com/u/13686061?u=59f25ef42ecf04c22657aac4238ce0e2d3d30304&v=4 url: https://github.com/khadrawy - - login: mjohnsey - avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4 - url: https://github.com/mjohnsey - - login: ashi-agrawal - avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4 - url: https://github.com/ashi-agrawal + - login: Ryandaydev + avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4 + url: https://github.com/Ryandaydev + - login: jaredtrog + avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 + url: https://github.com/jaredtrog - login: oliverxchen avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 url: https://github.com/oliverxchen @@ -299,6 +290,9 @@ sponsors: - login: hiancdtrsnm avatarUrl: https://avatars.githubusercontent.com/u/7343177?v=4 url: https://github.com/hiancdtrsnm +- - login: jpizquierdo + avatarUrl: https://avatars.githubusercontent.com/u/6716239?v=4 + url: https://github.com/jpizquierdo - - login: pawamoy avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4 url: https://github.com/pawamoy @@ -308,6 +302,9 @@ sponsors: - login: petercool avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4 url: https://github.com/petercool + - login: diegopenilla + avatarUrl: https://avatars.githubusercontent.com/u/42318333?v=4 + url: https://github.com/diegopenilla - login: siavashyj avatarUrl: https://avatars.githubusercontent.com/u/43583410?u=562005ddc7901cd27a1219a118a2363817b14977&v=4 url: https://github.com/siavashyj @@ -317,9 +314,9 @@ sponsors: - login: ArtyomVancyan avatarUrl: https://avatars.githubusercontent.com/u/44609997?v=4 url: https://github.com/ArtyomVancyan - - login: caviri - avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4 - url: https://github.com/caviri + - login: joshuatz + avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4 + url: https://github.com/joshuatz - login: SebTota avatarUrl: https://avatars.githubusercontent.com/u/25122511?v=4 url: https://github.com/SebTota @@ -341,6 +338,9 @@ sponsors: - login: engineerjoe440 avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4 url: https://github.com/engineerjoe440 + - login: caviri + avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4 + url: https://github.com/caviri - login: hgalytoby avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4 url: https://github.com/hgalytoby @@ -356,6 +356,9 @@ sponsors: - login: PelicanQ avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4 url: https://github.com/PelicanQ + - login: tochikuji + avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 + url: https://github.com/tochikuji - login: browniebroke avatarUrl: https://avatars.githubusercontent.com/u/861044?u=5abfca5588f3e906b31583d7ee62f6de4b68aa24&v=4 url: https://github.com/browniebroke @@ -386,9 +389,9 @@ sponsors: - login: ceb10n avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 url: https://github.com/ceb10n - - login: tochikuji - avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 - url: https://github.com/tochikuji + - login: moonape1226 + avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4 + url: https://github.com/moonape1226 - login: msehnout avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4 url: https://github.com/msehnout @@ -419,9 +422,6 @@ sponsors: - login: TheR1D avatarUrl: https://avatars.githubusercontent.com/u/16740832?u=b0dfdbdb27b79729430c71c6128962f77b7b53f7&v=4 url: https://github.com/TheR1D - - login: joshuatz - avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4 - url: https://github.com/joshuatz - login: danielunderwood avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4 url: https://github.com/danielunderwood @@ -449,9 +449,6 @@ sponsors: - login: hcristea avatarUrl: https://avatars.githubusercontent.com/u/7814406?u=19092923a4ea5b338567961c8270b9206a6d81bb&v=4 url: https://github.com/hcristea - - login: moonape1226 - avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4 - url: https://github.com/moonape1226 - - login: larsyngvelundin avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4 url: https://github.com/larsyngvelundin @@ -461,9 +458,9 @@ sponsors: - login: rwxd avatarUrl: https://avatars.githubusercontent.com/u/40308458?u=cd04a39e3655923be4f25c2ba8a5a07b3da3230a&v=4 url: https://github.com/rwxd - - login: morzan1001 - avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4 - url: https://github.com/morzan1001 + - login: kenkanayama + avatarUrl: https://avatars.githubusercontent.com/u/44771224?u=f68870c20c0f069491411aea8693c4714b40ecf0&v=4 + url: https://github.com/kenkanayama - login: sadikkuzu avatarUrl: https://avatars.githubusercontent.com/u/23168063?u=d179c06bb9f65c4167fcab118526819f8e0dac17&v=4 url: https://github.com/sadikkuzu @@ -473,12 +470,12 @@ sponsors: - login: FabulousCodingFox avatarUrl: https://avatars.githubusercontent.com/u/78906517?u=924a27cbee3db7e0ece5cc1509921402e1445e74&v=4 url: https://github.com/FabulousCodingFox - - login: anqorithm - avatarUrl: https://avatars.githubusercontent.com/u/61029571?u=468256fa4e2d9ce2870b608299724bebb7a33f18&v=4 - url: https://github.com/anqorithm - - login: Materacl - avatarUrl: https://avatars.githubusercontent.com/u/70155818?u=ae11d084518856127cca483816a91a187e3124ee&v=4 - url: https://github.com/Materacl + - login: morzan1001 + avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4 + url: https://github.com/morzan1001 + - login: BrianCurliss + avatarUrl: https://avatars.githubusercontent.com/u/1222949?v=4 + url: https://github.com/BrianCurliss - login: Toothwitch avatarUrl: https://avatars.githubusercontent.com/u/1710406?u=5eebb23b46cd26e48643b9e5179536cad491c17a&v=4 url: https://github.com/Toothwitch From f0576e8ffdc6b6b1b6fdd82b7802797d660deb6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 2 Apr 2025 21:47:54 +0200 Subject: [PATCH 019/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20GitHu?= =?UTF-8?q?b=20topic=20repositories=20(#13565)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/topic_repos.yml | 368 +++++++++++++++++------------------ 1 file changed, 184 insertions(+), 184 deletions(-) diff --git a/docs/en/data/topic_repos.yml b/docs/en/data/topic_repos.yml index 633b0aee3..7452088db 100644 --- a/docs/en/data/topic_repos.yml +++ b/docs/en/data/topic_repos.yml @@ -1,251 +1,251 @@ - name: full-stack-fastapi-template html_url: https://github.com/fastapi/full-stack-fastapi-template - stars: 30645 + stars: 31581 owner_login: fastapi owner_html_url: https://github.com/fastapi - name: Hello-Python html_url: https://github.com/mouredev/Hello-Python - stars: 28690 + stars: 29256 owner_login: mouredev owner_html_url: https://github.com/mouredev - name: serve html_url: https://github.com/jina-ai/serve - stars: 21356 + stars: 21487 owner_login: jina-ai owner_html_url: https://github.com/jina-ai - name: sqlmodel html_url: https://github.com/fastapi/sqlmodel - stars: 15312 + stars: 15521 owner_login: fastapi owner_html_url: https://github.com/fastapi - name: HivisionIDPhotos html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos - stars: 14957 + stars: 15353 owner_login: Zeyi-Lin owner_html_url: https://github.com/Zeyi-Lin - name: Douyin_TikTok_Download_API html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API - stars: 11192 + stars: 11719 owner_login: Evil0ctal owner_html_url: https://github.com/Evil0ctal - name: fastapi-best-practices html_url: https://github.com/zhanymkanov/fastapi-best-practices - stars: 10501 + stars: 11129 owner_login: zhanymkanov owner_html_url: https://github.com/zhanymkanov - name: awesome-fastapi html_url: https://github.com/mjhea0/awesome-fastapi - stars: 9193 + stars: 9387 owner_login: mjhea0 owner_html_url: https://github.com/mjhea0 - name: FastUI html_url: https://github.com/pydantic/FastUI - stars: 8721 + stars: 8787 owner_login: pydantic owner_html_url: https://github.com/pydantic - name: nonebot2 html_url: https://github.com/nonebot/nonebot2 - stars: 6433 + stars: 6596 owner_login: nonebot owner_html_url: https://github.com/nonebot -- name: serge - html_url: https://github.com/serge-chat/serge - stars: 5699 - owner_login: serge-chat - owner_html_url: https://github.com/serge-chat - name: FileCodeBox html_url: https://github.com/vastsa/FileCodeBox - stars: 5534 + stars: 6302 owner_login: vastsa owner_html_url: https://github.com/vastsa +- name: serge + html_url: https://github.com/serge-chat/serge + stars: 5707 + owner_login: serge-chat + owner_html_url: https://github.com/serge-chat - name: fastapi-users html_url: https://github.com/fastapi-users/fastapi-users - stars: 4921 + stars: 5045 owner_login: fastapi-users owner_html_url: https://github.com/fastapi-users - name: polar html_url: https://github.com/polarsource/polar - stars: 4598 + stars: 4870 owner_login: polarsource owner_html_url: https://github.com/polarsource - name: hatchet html_url: https://github.com/hatchet-dev/hatchet - stars: 4585 + stars: 4658 owner_login: hatchet-dev owner_html_url: https://github.com/hatchet-dev - name: chatgpt-web-share html_url: https://github.com/chatpire/chatgpt-web-share - stars: 4318 + stars: 4310 owner_login: chatpire owner_html_url: https://github.com/chatpire - name: strawberry html_url: https://github.com/strawberry-graphql/strawberry - stars: 4180 + stars: 4217 owner_login: strawberry-graphql owner_html_url: https://github.com/strawberry-graphql - name: atrilabs-engine html_url: https://github.com/Atri-Labs/atrilabs-engine - stars: 4114 + stars: 4111 owner_login: Atri-Labs owner_html_url: https://github.com/Atri-Labs - name: dynaconf html_url: https://github.com/dynaconf/dynaconf - stars: 3904 + stars: 3936 owner_login: dynaconf owner_html_url: https://github.com/dynaconf - name: poem html_url: https://github.com/poem-web/poem - stars: 3781 + stars: 3882 owner_login: poem-web owner_html_url: https://github.com/poem-web - name: farfalle html_url: https://github.com/rashadphz/farfalle - stars: 3190 + stars: 3248 owner_login: rashadphz owner_html_url: https://github.com/rashadphz -- name: opyrator - html_url: https://github.com/ml-tooling/opyrator - stars: 3119 - owner_login: ml-tooling - owner_html_url: https://github.com/ml-tooling - name: fastapi-admin html_url: https://github.com/fastapi-admin/fastapi-admin - stars: 3086 + stars: 3130 owner_login: fastapi-admin owner_html_url: https://github.com/fastapi-admin -- name: docarray - html_url: https://github.com/docarray/docarray - stars: 3021 - owner_login: docarray - owner_html_url: https://github.com/docarray +- name: opyrator + html_url: https://github.com/ml-tooling/opyrator + stars: 3116 + owner_login: ml-tooling + owner_html_url: https://github.com/ml-tooling - name: datamodel-code-generator html_url: https://github.com/koxudaxi/datamodel-code-generator - stars: 2988 + stars: 3054 owner_login: koxudaxi owner_html_url: https://github.com/koxudaxi +- name: docarray + html_url: https://github.com/docarray/docarray + stars: 3033 + owner_login: docarray + owner_html_url: https://github.com/docarray - name: LitServe html_url: https://github.com/Lightning-AI/LitServe - stars: 2863 + stars: 3019 owner_login: Lightning-AI owner_html_url: https://github.com/Lightning-AI -- name: fastapi-realworld-example-app - html_url: https://github.com/nsidnev/fastapi-realworld-example-app - stars: 2850 - owner_login: nsidnev - owner_html_url: https://github.com/nsidnev - name: logfire html_url: https://github.com/pydantic/logfire - stars: 2757 + stars: 2909 owner_login: pydantic owner_html_url: https://github.com/pydantic -- name: uvicorn-gunicorn-fastapi-docker - html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker - stars: 2731 - owner_login: tiangolo - owner_html_url: https://github.com/tiangolo +- name: fastapi-realworld-example-app + html_url: https://github.com/nsidnev/fastapi-realworld-example-app + stars: 2863 + owner_login: nsidnev + owner_html_url: https://github.com/nsidnev - name: huma html_url: https://github.com/danielgtaylor/huma - stars: 2700 + stars: 2861 owner_login: danielgtaylor owner_html_url: https://github.com/danielgtaylor +- name: uvicorn-gunicorn-fastapi-docker + html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker + stars: 2736 + owner_login: tiangolo + owner_html_url: https://github.com/tiangolo - name: tracecat html_url: https://github.com/TracecatHQ/tracecat - stars: 2539 + stars: 2556 owner_login: TracecatHQ owner_html_url: https://github.com/TracecatHQ - name: best-of-web-python html_url: https://github.com/ml-tooling/best-of-web-python - stars: 2460 + stars: 2485 owner_login: ml-tooling owner_html_url: https://github.com/ml-tooling - name: RasaGPT html_url: https://github.com/paulpierre/RasaGPT - stars: 2401 + stars: 2409 owner_login: paulpierre owner_html_url: https://github.com/paulpierre - name: fastapi-react html_url: https://github.com/Buuntu/fastapi-react - stars: 2315 + stars: 2337 owner_login: Buuntu owner_html_url: https://github.com/Buuntu - name: nextpy html_url: https://github.com/dot-agent/nextpy - stars: 2266 + stars: 2271 owner_login: dot-agent owner_html_url: https://github.com/dot-agent -- name: 30-Days-of-Python - html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python - stars: 2163 - owner_login: codingforentrepreneurs - owner_html_url: https://github.com/codingforentrepreneurs - name: FastAPI-template html_url: https://github.com/s3rius/FastAPI-template - stars: 2156 + stars: 2223 owner_login: s3rius owner_html_url: https://github.com/s3rius +- name: Kokoro-FastAPI + html_url: https://github.com/remsky/Kokoro-FastAPI + stars: 2191 + owner_login: remsky + owner_html_url: https://github.com/remsky +- name: 30-Days-of-Python + html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python + stars: 2172 + owner_login: codingforentrepreneurs + owner_html_url: https://github.com/codingforentrepreneurs - name: sqladmin html_url: https://github.com/aminalaee/sqladmin - stars: 2051 + stars: 2090 owner_login: aminalaee owner_html_url: https://github.com/aminalaee - name: langserve html_url: https://github.com/langchain-ai/langserve - stars: 2025 + stars: 2055 owner_login: langchain-ai owner_html_url: https://github.com/langchain-ai - name: fastapi-utils html_url: https://github.com/fastapiutils/fastapi-utils - stars: 2021 + stars: 2040 owner_login: fastapiutils owner_html_url: https://github.com/fastapiutils - name: solara html_url: https://github.com/widgetti/solara - stars: 1980 + stars: 2005 owner_login: widgetti owner_html_url: https://github.com/widgetti - name: supabase-py html_url: https://github.com/supabase/supabase-py - stars: 1874 + stars: 1936 owner_login: supabase owner_html_url: https://github.com/supabase -- name: python-week-2022 - html_url: https://github.com/rochacbruno/python-week-2022 - stars: 1829 - owner_login: rochacbruno - owner_html_url: https://github.com/rochacbruno - name: mangum html_url: https://github.com/Kludex/mangum - stars: 1820 + stars: 1852 owner_login: Kludex owner_html_url: https://github.com/Kludex -- name: Kokoro-FastAPI - html_url: https://github.com/remsky/Kokoro-FastAPI - stars: 1771 - owner_login: remsky - owner_html_url: https://github.com/remsky +- name: python-week-2022 + html_url: https://github.com/rochacbruno/python-week-2022 + stars: 1828 + owner_login: rochacbruno + owner_html_url: https://github.com/rochacbruno - name: manage-fastapi html_url: https://github.com/ycd/manage-fastapi - stars: 1719 + stars: 1730 owner_login: ycd owner_html_url: https://github.com/ycd - name: ormar html_url: https://github.com/collerek/ormar - stars: 1710 + stars: 1722 owner_login: collerek owner_html_url: https://github.com/collerek - name: agentkit html_url: https://github.com/BCG-X-Official/agentkit - stars: 1658 + stars: 1715 owner_login: BCG-X-Official owner_html_url: https://github.com/BCG-X-Official - name: langchain-serve html_url: https://github.com/jina-ai/langchain-serve - stars: 1618 + stars: 1625 owner_login: jina-ai owner_html_url: https://github.com/jina-ai - name: termpair html_url: https://github.com/cs01/termpair - stars: 1611 + stars: 1610 owner_login: cs01 owner_html_url: https://github.com/cs01 - name: coronavirus-tracker-api @@ -255,241 +255,241 @@ owner_html_url: https://github.com/ExpDev07 - name: piccolo html_url: https://github.com/piccolo-orm/piccolo - stars: 1546 + stars: 1568 owner_login: piccolo-orm owner_html_url: https://github.com/piccolo-orm - name: fastapi-cache html_url: https://github.com/long2ice/fastapi-cache - stars: 1478 + stars: 1526 owner_login: long2ice owner_html_url: https://github.com/long2ice - name: openapi-python-client html_url: https://github.com/openapi-generators/openapi-python-client - stars: 1467 + stars: 1504 owner_login: openapi-generators owner_html_url: https://github.com/openapi-generators - name: fastapi-crudrouter html_url: https://github.com/awtkns/fastapi-crudrouter - stars: 1462 + stars: 1476 owner_login: awtkns owner_html_url: https://github.com/awtkns - name: awesome-fastapi-projects html_url: https://github.com/Kludex/awesome-fastapi-projects - stars: 1418 + stars: 1433 owner_login: Kludex owner_html_url: https://github.com/Kludex -- name: awesome-python-resources - html_url: https://github.com/DjangoEx/awesome-python-resources - stars: 1383 - owner_login: DjangoEx - owner_html_url: https://github.com/DjangoEx - name: slowapi html_url: https://github.com/laurentS/slowapi - stars: 1363 + stars: 1408 owner_login: laurentS owner_html_url: https://github.com/laurentS +- name: awesome-python-resources + html_url: https://github.com/DjangoEx/awesome-python-resources + stars: 1386 + owner_login: DjangoEx + owner_html_url: https://github.com/DjangoEx - name: budgetml html_url: https://github.com/ebhy/budgetml - stars: 1344 + stars: 1343 owner_login: ebhy owner_html_url: https://github.com/ebhy - name: fastapi-pagination html_url: https://github.com/uriyyo/fastapi-pagination - stars: 1284 + stars: 1309 owner_login: uriyyo owner_html_url: https://github.com/uriyyo - name: fastapi-boilerplate html_url: https://github.com/teamhide/fastapi-boilerplate - stars: 1234 + stars: 1262 owner_login: teamhide owner_html_url: https://github.com/teamhide - name: fastapi-tutorial html_url: https://github.com/liaogx/fastapi-tutorial - stars: 1181 + stars: 1203 owner_login: liaogx owner_html_url: https://github.com/liaogx - name: fastapi-amis-admin html_url: https://github.com/amisadmin/fastapi-amis-admin - stars: 1164 + stars: 1195 owner_login: amisadmin owner_html_url: https://github.com/amisadmin +- name: SurfSense + html_url: https://github.com/MODSetter/SurfSense + stars: 1169 + owner_login: MODSetter + owner_html_url: https://github.com/MODSetter - name: fastapi-code-generator html_url: https://github.com/koxudaxi/fastapi-code-generator - stars: 1132 + stars: 1157 owner_login: koxudaxi owner_html_url: https://github.com/koxudaxi - name: bolt-python html_url: https://github.com/slackapi/bolt-python - stars: 1130 + stars: 1143 owner_login: slackapi owner_html_url: https://github.com/slackapi - name: langchain-extract html_url: https://github.com/langchain-ai/langchain-extract - stars: 1110 + stars: 1122 owner_login: langchain-ai owner_html_url: https://github.com/langchain-ai -- name: odmantic - html_url: https://github.com/art049/odmantic - stars: 1104 - owner_login: art049 - owner_html_url: https://github.com/art049 - name: fastapi_production_template html_url: https://github.com/zhanymkanov/fastapi_production_template - stars: 1093 + stars: 1112 owner_login: zhanymkanov owner_html_url: https://github.com/zhanymkanov -- name: SurfSense - html_url: https://github.com/MODSetter/SurfSense - stars: 1081 - owner_login: MODSetter - owner_html_url: https://github.com/MODSetter -- name: fastapi-alembic-sqlmodel-async - html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async - stars: 1063 - owner_login: jonra1993 - owner_html_url: https://github.com/jonra1993 +- name: odmantic + html_url: https://github.com/art049/odmantic + stars: 1109 + owner_login: art049 + owner_html_url: https://github.com/art049 - name: prometheus-fastapi-instrumentator html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator - stars: 1059 + stars: 1091 owner_login: trallnag owner_html_url: https://github.com/trallnag +- name: vue-fastapi-admin + html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin + stars: 1086 + owner_login: mizhexiaoxiao + owner_html_url: https://github.com/mizhexiaoxiao - name: bedrock-claude-chat html_url: https://github.com/aws-samples/bedrock-claude-chat - stars: 1039 + stars: 1075 owner_login: aws-samples owner_html_url: https://github.com/aws-samples +- name: fastapi-alembic-sqlmodel-async + html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async + stars: 1074 + owner_login: jonra1993 + owner_html_url: https://github.com/jonra1993 - name: runhouse html_url: https://github.com/run-house/runhouse - stars: 1005 + stars: 1016 owner_login: run-house owner_html_url: https://github.com/run-house -- name: vue-fastapi-admin - html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin - stars: 987 - owner_login: mizhexiaoxiao - owner_html_url: https://github.com/mizhexiaoxiao +- name: restish + html_url: https://github.com/danielgtaylor/restish + stars: 1012 + owner_login: danielgtaylor + owner_html_url: https://github.com/danielgtaylor - name: lanarky html_url: https://github.com/ajndkr/lanarky - stars: 986 + stars: 988 owner_login: ajndkr owner_html_url: https://github.com/ajndkr - name: autollm html_url: https://github.com/viddexa/autollm - stars: 986 + stars: 987 owner_login: viddexa owner_html_url: https://github.com/viddexa -- name: restish - html_url: https://github.com/danielgtaylor/restish - stars: 984 - owner_login: danielgtaylor - owner_html_url: https://github.com/danielgtaylor - name: fastcrud html_url: https://github.com/igorbenav/fastcrud - stars: 964 + stars: 985 owner_login: igorbenav owner_html_url: https://github.com/igorbenav - name: secure html_url: https://github.com/TypeError/secure - stars: 928 + stars: 930 owner_login: TypeError owner_html_url: https://github.com/TypeError - name: langcorn html_url: https://github.com/msoedov/langcorn - stars: 916 + stars: 924 owner_login: msoedov owner_html_url: https://github.com/msoedov +- name: fastapi_best_architecture + html_url: https://github.com/fastapi-practices/fastapi_best_architecture + stars: 921 + owner_login: fastapi-practices + owner_html_url: https://github.com/fastapi-practices - name: energy-forecasting html_url: https://github.com/iusztinpaul/energy-forecasting - stars: 898 + stars: 903 owner_login: iusztinpaul owner_html_url: https://github.com/iusztinpaul - name: authx html_url: https://github.com/yezz123/authx - stars: 874 + stars: 900 owner_login: yezz123 owner_html_url: https://github.com/yezz123 -- name: titiler - html_url: https://github.com/developmentseed/titiler - stars: 841 - owner_login: developmentseed - owner_html_url: https://github.com/developmentseed - name: FastAPI-boilerplate html_url: https://github.com/igorbenav/FastAPI-boilerplate - stars: 820 + stars: 877 owner_login: igorbenav owner_html_url: https://github.com/igorbenav +- name: titiler + html_url: https://github.com/developmentseed/titiler + stars: 853 + owner_login: developmentseed + owner_html_url: https://github.com/developmentseed +- name: ludic + html_url: https://github.com/getludic/ludic + stars: 831 + owner_login: getludic + owner_html_url: https://github.com/getludic - name: marker-api html_url: https://github.com/adithya-s-k/marker-api - stars: 813 + stars: 829 owner_login: adithya-s-k owner_html_url: https://github.com/adithya-s-k -- name: fastapi_best_architecture - html_url: https://github.com/fastapi-practices/fastapi_best_architecture - stars: 802 - owner_login: fastapi-practices - owner_html_url: https://github.com/fastapi-practices +- name: fastapi-observability + html_url: https://github.com/blueswen/fastapi-observability + stars: 771 + owner_login: blueswen + owner_html_url: https://github.com/blueswen - name: fastapi-do-zero html_url: https://github.com/dunossauro/fastapi-do-zero - stars: 745 + stars: 767 owner_login: dunossauro owner_html_url: https://github.com/dunossauro - name: fastapi-mail html_url: https://github.com/sabuhish/fastapi-mail - stars: 744 + stars: 759 owner_login: sabuhish owner_html_url: https://github.com/sabuhish -- name: fastapi-observability - html_url: https://github.com/blueswen/fastapi-observability - stars: 743 - owner_login: blueswen - owner_html_url: https://github.com/blueswen - name: lccn_predictor html_url: https://github.com/baoliay2008/lccn_predictor - stars: 741 + stars: 749 owner_login: baoliay2008 owner_html_url: https://github.com/baoliay2008 +- name: flock + html_url: https://github.com/Onelevenvy/flock + stars: 746 + owner_login: Onelevenvy + owner_html_url: https://github.com/Onelevenvy +- name: starlette-admin + html_url: https://github.com/jowilf/starlette-admin + stars: 737 + owner_login: jowilf + owner_html_url: https://github.com/jowilf - name: annotated-py-projects html_url: https://github.com/hhstore/annotated-py-projects - stars: 727 + stars: 729 owner_login: hhstore owner_html_url: https://github.com/hhstore +- name: KonomiTV + html_url: https://github.com/tsukumijima/KonomiTV + stars: 727 + owner_login: tsukumijima + owner_html_url: https://github.com/tsukumijima - name: learn-generative-ai html_url: https://github.com/panaverse/learn-generative-ai - stars: 714 + stars: 725 owner_login: panaverse owner_html_url: https://github.com/panaverse -- name: starlette-admin - html_url: https://github.com/jowilf/starlette-admin - stars: 713 - owner_login: jowilf - owner_html_url: https://github.com/jowilf +- name: FastAPI-Backend-Template + html_url: https://github.com/Aeternalis-Ingenium/FastAPI-Backend-Template + stars: 719 + owner_login: Aeternalis-Ingenium + owner_html_url: https://github.com/Aeternalis-Ingenium - name: chatGPT-web html_url: https://github.com/mic1on/chatGPT-web stars: 712 owner_login: mic1on owner_html_url: https://github.com/mic1on -- name: FastAPI-Backend-Template - html_url: https://github.com/Aeternalis-Ingenium/FastAPI-Backend-Template - stars: 709 - owner_login: Aeternalis-Ingenium - owner_html_url: https://github.com/Aeternalis-Ingenium - name: linbing html_url: https://github.com/taomujian/linbing stars: 698 owner_login: taomujian owner_html_url: https://github.com/taomujian -- name: KonomiTV - html_url: https://github.com/tsukumijima/KonomiTV - stars: 687 - owner_login: tsukumijima - owner_html_url: https://github.com/tsukumijima -- name: fastapi-jwt-auth - html_url: https://github.com/IndominusByte/fastapi-jwt-auth - stars: 685 - owner_login: IndominusByte - owner_html_url: https://github.com/IndominusByte -- name: pity - html_url: https://github.com/wuranxu/pity - stars: 667 - owner_login: wuranxu - owner_html_url: https://github.com/wuranxu From f4583c58b9896135fc10395880d9aadbb10422c1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 2 Apr 2025 19:48:02 +0000 Subject: [PATCH 020/138] =?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 546e1d717..96afc63ea 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Internal +* 👥 Update FastAPI People - Contributors and Translators. PR [#13558](https://github.com/fastapi/fastapi/pull/13558) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump dirty-equals from 0.8.0 to 0.9.0. PR [#13561](https://github.com/fastapi/fastapi/pull/13561) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Clean up `docs/en/mkdocs.yml` configuration file. PR [#13542](https://github.com/fastapi/fastapi/pull/13542) by [@svlandeg](https://github.com/svlandeg). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#12986](https://github.com/fastapi/fastapi/pull/12986) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From 8bf01245b17fac4d93f0022b1ccfb907520e5f1e Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 2 Apr 2025 19:48:09 +0000 Subject: [PATCH 021/138] =?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 96afc63ea..e8ef0999a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Internal +* 👥 Update FastAPI People - Sponsors. PR [#13559](https://github.com/fastapi/fastapi/pull/13559) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13558](https://github.com/fastapi/fastapi/pull/13558) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump dirty-equals from 0.8.0 to 0.9.0. PR [#13561](https://github.com/fastapi/fastapi/pull/13561) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Clean up `docs/en/mkdocs.yml` configuration file. PR [#13542](https://github.com/fastapi/fastapi/pull/13542) by [@svlandeg](https://github.com/svlandeg). From 8032e21418bfa9addfd2e3c14c5b2b7ed6677455 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 2 Apr 2025 19:48:32 +0000 Subject: [PATCH 022/138] =?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 e8ef0999a..9ebed0a24 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Internal +* 👥 Update FastAPI GitHub topic repositories. PR [#13565](https://github.com/fastapi/fastapi/pull/13565) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13559](https://github.com/fastapi/fastapi/pull/13559) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13558](https://github.com/fastapi/fastapi/pull/13558) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump dirty-equals from 0.8.0 to 0.9.0. PR [#13561](https://github.com/fastapi/fastapi/pull/13561) by [@dependabot[bot]](https://github.com/apps/dependabot). From 7b7ec90308d21fd61fd55f0588f2e7a714822052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 3 Apr 2025 21:48:09 +0200 Subject: [PATCH 023/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Experts=20(#13568)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/people.yml | 370 ++++++++++++++++++++-------------------- 1 file changed, 181 insertions(+), 189 deletions(-) diff --git a/docs/en/data/people.yml b/docs/en/data/people.yml index 4afce19b5..02a91ed19 100644 --- a/docs/en/data/people.yml +++ b/docs/en/data/people.yml @@ -13,7 +13,7 @@ experts: avatarUrl: https://avatars.githubusercontent.com/in/15368?v=4 url: https://github.com/apps/github-actions - login: Kludex - count: 654 + count: 655 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex - login: jgould22 @@ -76,6 +76,10 @@ experts: count: 59 avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 url: https://github.com/falkben +- login: luzzodev + count: 54 + avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 + url: https://github.com/luzzodev - login: acidjunk count: 50 avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 @@ -88,10 +92,6 @@ experts: count: 49 avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4 url: https://github.com/sm-Fifteen -- login: luzzodev - count: 48 - avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 - url: https://github.com/luzzodev - login: adriangb count: 46 avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=612704256e38d6ac9cbed24f10e4b6ac2da74ecb&v=4 @@ -104,14 +104,14 @@ experts: count: 45 avatarUrl: https://avatars.githubusercontent.com/u/27180793?u=5cf2877f50b3eb2bc55086089a78a36f07042889&v=4 url: https://github.com/Dustyposa -- login: frankie567 - count: 43 - avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=c159fe047727aedecbbeeaa96a1b03ceb9d39add&v=4 - url: https://github.com/frankie567 - login: odiseo0 count: 43 avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4 url: https://github.com/odiseo0 +- login: frankie567 + count: 43 + avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=c159fe047727aedecbbeeaa96a1b03ceb9d39add&v=4 + url: https://github.com/frankie567 - login: sinisaos count: 40 avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 @@ -156,6 +156,10 @@ experts: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/9435877?u=719327b7d2c4c62212456d771bfa7c6b8dbb9eac&v=4 url: https://github.com/SirTelemak +- login: alv2017 + count: 22 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 - login: nymous count: 22 avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 @@ -216,10 +220,6 @@ experts: count: 17 avatarUrl: https://avatars.githubusercontent.com/u/28262306?u=e19427d8dc296d6950e9c424adacc92d37496fe9&v=4 url: https://github.com/nkhitrov -- login: alv2017 - count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 - login: jonatasoli count: 16 avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=071c062d2861d3dd127f6b4a5258cd8ef55d4c50&v=4 @@ -245,71 +245,79 @@ experts: avatarUrl: https://avatars.githubusercontent.com/u/33907262?u=2721fb37014d50daf473267c808aa678ecaefe09&v=4 url: https://github.com/simondale00 last_month_experts: -- login: jgould22 - count: 13 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 - login: alv2017 - count: 10 + count: 12 avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 url: https://github.com/alv2017 - login: luzzodev - count: 8 + count: 9 avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 url: https://github.com/luzzodev -- login: YuriiMotov - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 - url: https://github.com/YuriiMotov -- login: Kludex - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 - url: https://github.com/Kludex +- login: yauhen-sobaleu + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 + url: https://github.com/yauhen-sobaleu - login: JavierSanchezCastro - count: 4 + count: 3 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro -- login: tiangolo - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 - url: https://github.com/tiangolo +- login: marsboy02 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 + url: https://github.com/marsboy02 - login: Ale-Cas count: 2 avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 url: https://github.com/Ale-Cas -- login: vtgn +- login: EverStarck count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4 - url: https://github.com/vtgn -three_months_experts: + avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 + url: https://github.com/EverStarck +- login: jgould22 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 + url: https://github.com/jgould22 +- login: Kludex + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 + url: https://github.com/Kludex - login: YuriiMotov - count: 31 + count: 2 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov +three_months_experts: - login: Kludex count: 25 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex +- login: YuriiMotov + count: 25 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov - login: luzzodev - count: 19 + count: 22 avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 url: https://github.com/luzzodev - login: alv2017 - count: 16 + count: 22 avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 url: https://github.com/alv2017 - login: jgould22 count: 13 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 -- login: sehraramiz - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 - url: https://github.com/sehraramiz +- login: yauhen-sobaleu + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 + url: https://github.com/yauhen-sobaleu - login: JavierSanchezCastro count: 8 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro +- login: sehraramiz + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 + url: https://github.com/sehraramiz - login: tiangolo count: 4 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 @@ -318,18 +326,30 @@ three_months_experts: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 url: https://github.com/yokwejuste -- login: viniciusCalcantara - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4 - url: https://github.com/viniciusCalcantara - login: SobikXexe count: 3 avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4 url: https://github.com/SobikXexe +- login: PREPONDERANCE + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 + url: https://github.com/PREPONDERANCE +- login: nbx3 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 + url: https://github.com/nbx3 +- login: marsboy02 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 + url: https://github.com/marsboy02 - login: Ale-Cas count: 2 avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 url: https://github.com/Ale-Cas +- login: EverStarck + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 + url: https://github.com/EverStarck - login: vtgn count: 2 avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4 @@ -338,14 +358,6 @@ three_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 url: https://github.com/Trinkes -- login: PREPONDERANCE - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 - url: https://github.com/PREPONDERANCE -- login: nbx3 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 - url: https://github.com/nbx3 - login: XiaoXinYo count: 2 avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=1eebf5ce25a8067f7bfa6251a24f667be492d9d6&v=4 @@ -356,45 +368,49 @@ three_months_experts: url: https://github.com/iloveitaly six_months_experts: - login: YuriiMotov - count: 63 + count: 61 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: luzzodev - count: 48 + count: 54 avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 url: https://github.com/luzzodev - login: Kludex - count: 48 + count: 40 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex -- login: sinisaos - count: 23 - avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 - url: https://github.com/sinisaos +- login: alv2017 + count: 22 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 - login: jgould22 count: 17 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: JavierSanchezCastro - count: 17 + count: 13 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro -- login: alv2017 - count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 -- login: Kfir-G - count: 13 - avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 - url: https://github.com/Kfir-G +- login: sinisaos + count: 11 + avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 + url: https://github.com/sinisaos - login: sehraramiz count: 11 avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 url: https://github.com/sehraramiz -- login: ceb10n +- login: Kfir-G + count: 11 + avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 + url: https://github.com/Kfir-G +- login: yauhen-sobaleu + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 + url: https://github.com/yauhen-sobaleu +- login: yvallois count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 - url: https://github.com/ceb10n + avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 + url: https://github.com/yvallois - login: estebanx64 count: 7 avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 @@ -403,18 +419,10 @@ six_months_experts: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo -- login: yvallois - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 - url: https://github.com/yvallois - login: yokwejuste count: 4 avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 url: https://github.com/yokwejuste -- login: n8sty - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 - url: https://github.com/n8sty - login: viniciusCalcantara count: 3 avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4 @@ -431,18 +439,30 @@ six_months_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4 url: https://github.com/dbfreem -- login: Isuxiz - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4 - url: https://github.com/Isuxiz -- login: Minibrams - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/8108085?u=b028dbc308fa8485e0e2e9402b3d03d8deb22bf9&v=4 - url: https://github.com/Minibrams +- login: PREPONDERANCE + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 + url: https://github.com/PREPONDERANCE +- login: nbx3 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 + url: https://github.com/nbx3 +- login: marsboy02 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 + url: https://github.com/marsboy02 - login: Ale-Cas count: 2 avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 url: https://github.com/Ale-Cas +- login: EverStarck + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 + url: https://github.com/EverStarck +- login: n8sty + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 + url: https://github.com/n8sty - login: vtgn count: 2 avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4 @@ -451,14 +471,6 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 url: https://github.com/Trinkes -- login: PREPONDERANCE - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 - url: https://github.com/PREPONDERANCE -- login: nbx3 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 - url: https://github.com/nbx3 - login: XiaoXinYo count: 2 avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=1eebf5ce25a8067f7bfa6251a24f667be492d9d6&v=4 @@ -479,10 +491,6 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/40732698?u=611f39d3c1d2f4207a590937a78c1f10eed6232c&v=4 url: https://github.com/gelezo43 -- login: christiansicari - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/29756552?v=4 - url: https://github.com/christiansicari - login: 1001pepi count: 2 avatarUrl: https://avatars.githubusercontent.com/u/82064861?u=8c6ffdf2275d6970a07294752c545cd2702c57d3&v=4 @@ -503,14 +511,10 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/131771119?u=bcaf2559ef6266af70b151b7fda31a1ee3dbecb3&v=4 url: https://github.com/iiotsrc -- login: simondale00 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/33907262?u=2721fb37014d50daf473267c808aa678ecaefe09&v=4 - url: https://github.com/simondale00 -- login: jd-solanki +- login: Isuxiz count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/47495003?u=6e225cb42c688d0cd70e65c6baedb9f5922b1178&v=4 - url: https://github.com/jd-solanki + avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4 + url: https://github.com/Isuxiz - login: Reemyos count: 2 avatarUrl: https://avatars.githubusercontent.com/u/44867003?v=4 @@ -519,33 +523,21 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4 url: https://github.com/deight93 -- login: PhysicallyActive - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 - url: https://github.com/PhysicallyActive - login: Jkrox count: 2 avatarUrl: https://avatars.githubusercontent.com/u/83181939?u=d6a922d97129f7f3916d6a1c166bc011b3a72b7f&v=4 url: https://github.com/Jkrox -- login: jfeaver - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1091338?u=0bcba366447d8fadad63f6705a52d128da4c7ec2&v=4 - url: https://github.com/jfeaver -- login: tristan - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1412?u=aab8aaa4cc0f1210ac45fc93873a5909d314c965&v=4 - url: https://github.com/tristan one_year_experts: - login: YuriiMotov - count: 214 + count: 196 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: Kludex - count: 66 + count: 65 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex - login: luzzodev - count: 48 + count: 54 avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 url: https://github.com/luzzodev - login: sinisaos @@ -553,11 +545,11 @@ one_year_experts: avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 url: https://github.com/sinisaos - login: JavierSanchezCastro - count: 39 + count: 37 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: jgould22 - count: 35 + count: 32 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: tiangolo @@ -565,7 +557,7 @@ one_year_experts: avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo - login: alv2017 - count: 16 + count: 22 avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 url: https://github.com/alv2017 - login: n8sty @@ -584,38 +576,38 @@ one_year_experts: count: 15 avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 url: https://github.com/sehraramiz -- login: PhysicallyActive - count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 - url: https://github.com/PhysicallyActive - login: Kfir-G count: 13 avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 url: https://github.com/Kfir-G +- login: PhysicallyActive + count: 12 + avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 + url: https://github.com/PhysicallyActive - login: mattmess1221 count: 11 avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=d22ea18aa8ea688af25a45df306134d593621a44&v=4 url: https://github.com/mattmess1221 -- login: hasansezertasan +- login: yauhen-sobaleu count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 - url: https://github.com/hasansezertasan + avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 + url: https://github.com/yauhen-sobaleu - login: AIdjis count: 8 avatarUrl: https://avatars.githubusercontent.com/u/88404339?u=2a80d80b054e9228391e32fb9bb39571509dab6a&v=4 url: https://github.com/AIdjis - login: yvallois - count: 6 + count: 7 avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 url: https://github.com/yvallois +- login: hasansezertasan + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 + url: https://github.com/hasansezertasan - login: PREPONDERANCE count: 5 avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 url: https://github.com/PREPONDERANCE -- login: pythonweb2 - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 - url: https://github.com/pythonweb2 - login: gustavosett count: 5 avatarUrl: https://avatars.githubusercontent.com/u/99373133?u=1382fe27034a0179f07cf989f63c4f23017f043c&v=4 @@ -624,6 +616,10 @@ one_year_experts: count: 5 avatarUrl: https://avatars.githubusercontent.com/u/32629225?u=3b7c30e8a09426a1b9284f6e8a0ae53a525596bf&v=4 url: https://github.com/chyok +- login: acidjunk + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 + url: https://github.com/acidjunk - login: svlandeg count: 4 avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 @@ -636,10 +632,6 @@ one_year_experts: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 url: https://github.com/yokwejuste -- login: acidjunk - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk - login: bertomaniac count: 4 avatarUrl: https://avatars.githubusercontent.com/u/10235051?u=14484a96833228a7b29fee4a7916d411c242c4f6&v=4 @@ -648,6 +640,14 @@ one_year_experts: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4 url: https://github.com/binbjz +- login: CharlesPerrotMinotHCHB + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/112571330?u=a9628848d6096b491135727435a2a253152995a1&v=4 + url: https://github.com/CharlesPerrotMinotHCHB +- login: ryanisn + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4 + url: https://github.com/ryanisn - login: viniciusCalcantara count: 3 avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4 @@ -656,6 +656,10 @@ one_year_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4 url: https://github.com/SobikXexe +- login: pythonweb2 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 + url: https://github.com/pythonweb2 - login: DeoLeung count: 3 avatarUrl: https://avatars.githubusercontent.com/u/3764720?u=4c222ef513814de4c7fb3736d0a7adf11d953d43&v=4 @@ -684,34 +688,54 @@ one_year_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/8108085?u=b028dbc308fa8485e0e2e9402b3d03d8deb22bf9&v=4 url: https://github.com/Minibrams -- login: ryanisn - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4 - url: https://github.com/ryanisn - login: alexandercronin count: 3 avatarUrl: https://avatars.githubusercontent.com/u/8014288?u=69580504c51a0cdd756fc47b23bb7f404bd694e7&v=4 url: https://github.com/alexandercronin -- login: omarcruzpantoja - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4 - url: https://github.com/omarcruzpantoja -- login: Wyko +- login: nbx3 count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/467094?v=4 - url: https://github.com/Wyko -- login: ddahan + avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 + url: https://github.com/nbx3 +- login: marsboy02 count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1933516?u=1d200a620e8d6841df017e9f2bb7efb58b580f40&v=4 - url: https://github.com/ddahan + avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 + url: https://github.com/marsboy02 - login: Ale-Cas count: 2 avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 url: https://github.com/Ale-Cas +- login: patrick91 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/667029?u=e35958a75ac1f99c81b4bc99e22db8cd665ae7f0&v=4 + url: https://github.com/patrick91 +- login: EverStarck + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 + url: https://github.com/EverStarck +- login: rustonaut + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/7632017?u=652bb86c1399727082c929fd4666fd7fa65923b1&v=4 + url: https://github.com/rustonaut - login: Trolldemorted count: 2 avatarUrl: https://avatars.githubusercontent.com/u/10261186?v=4 url: https://github.com/Trolldemorted +- login: anantgupta129 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/66518357?u=6e25dcd84638f17d2c6df5dc26f07fd7c6dc118e&v=4 + url: https://github.com/anantgupta129 +- login: slafs + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4 + url: https://github.com/slafs +- login: Wyko + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/467094?v=4 + url: https://github.com/Wyko +- login: ddahan + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/1933516?u=1d200a620e8d6841df017e9f2bb7efb58b580f40&v=4 + url: https://github.com/ddahan - login: vtgn count: 2 avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4 @@ -720,10 +744,6 @@ one_year_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/72403396?v=4 url: https://github.com/SDAravind -- login: slafs - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4 - url: https://github.com/slafs - login: redb0 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/30475117?v=4 @@ -748,31 +768,3 @@ one_year_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 url: https://github.com/Trinkes -- login: anantgupta129 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/66518357?u=6e25dcd84638f17d2c6df5dc26f07fd7c6dc118e&v=4 - url: https://github.com/anantgupta129 -- login: nbx3 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 - url: https://github.com/nbx3 -- login: yanggeorge - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/2434407?v=4 - url: https://github.com/yanggeorge -- login: XiaoXinYo - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=1eebf5ce25a8067f7bfa6251a24f667be492d9d6&v=4 - url: https://github.com/XiaoXinYo -- login: monchin - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18521800?v=4 - url: https://github.com/monchin -- login: AmirHmZz - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/38752106?u=07f80e451bda00a9492bbc764e49d24ad3ada8cc&v=4 - url: https://github.com/AmirHmZz -- login: iloveitaly - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4 - url: https://github.com/iloveitaly From 76b324d95bc033740217ba913ae2bbaf95ec1d78 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 3 Apr 2025 19:48:31 +0000 Subject: [PATCH 024/138] =?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 9ebed0a24..04ea50593 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -22,6 +22,7 @@ hide: ### Internal +* 👥 Update FastAPI People - Experts. PR [#13568](https://github.com/fastapi/fastapi/pull/13568) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI GitHub topic repositories. PR [#13565](https://github.com/fastapi/fastapi/pull/13565) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13559](https://github.com/fastapi/fastapi/pull/13559) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13558](https://github.com/fastapi/fastapi/pull/13558) by [@tiangolo](https://github.com/tiangolo). From 5f9c7a31852315b3f8f3287424cde16842c515e3 Mon Sep 17 00:00:00 2001 From: Elliot Ford Date: Sun, 6 Apr 2025 17:33:24 +0100 Subject: [PATCH 025/138] =?UTF-8?q?=F0=9F=93=9D=20Fix=20liblab=20client=20?= =?UTF-8?q?generation=20doc=20link=20(#13571)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/advanced/generate-clients.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md index 3b9dc83f0..b2aef5037 100644 --- a/docs/en/docs/advanced/generate-clients.md +++ b/docs/en/docs/advanced/generate-clients.md @@ -24,7 +24,7 @@ For example, you might want to try: * Speakeasy * Stainless -* liblab +* liblab There are also several other companies offering similar services that you can search and find online. 🤓 From bd3e47ec592b3fe3b01ab2087d790bccd07cb5ed Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 6 Apr 2025 16:33:45 +0000 Subject: [PATCH 026/138] =?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 04ea50593..339b33581 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Docs +* 📝 Fix liblab client generation doc link. PR [#13571](https://github.com/fastapi/fastapi/pull/13571) by [@EFord36](https://github.com/EFord36). * ✏️ Fix talk information typo. PR [#13544](https://github.com/fastapi/fastapi/pull/13544) by [@blueswen](https://github.com/blueswen). * 📝 Add External Link: Taiwanese talk on FastAPI with observability . PR [#13527](https://github.com/fastapi/fastapi/pull/13527) by [@blueswen](https://github.com/blueswen). From d1962bb22ff3c3b55bd7d09dd82ef62b72e3217d Mon Sep 17 00:00:00 2001 From: Hotah Ma Date: Fri, 11 Apr 2025 23:58:47 +0800 Subject: [PATCH 027/138] =?UTF-8?q?=F0=9F=93=9D=20Fix=20typo=20in=20docume?= =?UTF-8?q?ntation=20(#13599)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/deployment/concepts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/deployment/concepts.md b/docs/en/docs/deployment/concepts.md index e71a7487a..ed13bc28d 100644 --- a/docs/en/docs/deployment/concepts.md +++ b/docs/en/docs/deployment/concepts.md @@ -65,7 +65,7 @@ The word **program** is commonly used to describe many things: * The **code** that you write, the **Python files**. * The **file** that can be **executed** by the operating system, for example: `python`, `python.exe` or `uvicorn`. -* A particular program while it is **running** on the operating system, using the CPU, and storing things on memory. This is also called a **process**. +* A particular program while it is **running** on the operating system, using the CPU, and storing things in memory. This is also called a **process**. ### What is a Process From a8c1333b4dedcdffd1b146bd047f5deaee6cf689 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 11 Apr 2025 15:59:09 +0000 Subject: [PATCH 028/138] =?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 339b33581..797619354 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Docs +* 📝 Fix typo in documentation. PR [#13599](https://github.com/fastapi/fastapi/pull/13599) by [@Taoup](https://github.com/Taoup). * 📝 Fix liblab client generation doc link. PR [#13571](https://github.com/fastapi/fastapi/pull/13571) by [@EFord36](https://github.com/EFord36). * ✏️ Fix talk information typo. PR [#13544](https://github.com/fastapi/fastapi/pull/13544) by [@blueswen](https://github.com/blueswen). * 📝 Add External Link: Taiwanese talk on FastAPI with observability . PR [#13527](https://github.com/fastapi/fastapi/pull/13527) by [@blueswen](https://github.com/blueswen). From 024d5d33183e54fa1133bda2bb23f479a63cda96 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 11 Apr 2025 18:02:43 +0200 Subject: [PATCH 029/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13594)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.2 → v0.11.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.2...v0.11.4) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6aa7c458d..41ca9aa99 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.2 + rev: v0.11.4 hooks: - id: ruff args: From 4ec5e0a90a15490bd8d5b47850a83ed2dbe7d5f3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 11 Apr 2025 16:03:08 +0000 Subject: [PATCH 030/138] =?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 797619354..3819e8857 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13594](https://github.com/fastapi/fastapi/pull/13594) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 👥 Update FastAPI People - Experts. PR [#13568](https://github.com/fastapi/fastapi/pull/13568) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI GitHub topic repositories. PR [#13565](https://github.com/fastapi/fastapi/pull/13565) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13559](https://github.com/fastapi/fastapi/pull/13559) by [@tiangolo](https://github.com/tiangolo). From 9d937964ba250fd1231f188cafa189195881656c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 15 Apr 2025 10:03:45 +0200 Subject: [PATCH 031/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13619)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.4 → v0.11.5](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.4...v0.11.5) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 41ca9aa99..58b0080a5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.4 + rev: v0.11.5 hooks: - id: ruff args: From 7c75b555804388e885d991497942be777fa8af3a Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 15 Apr 2025 08:04:06 +0000 Subject: [PATCH 032/138] =?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 3819e8857..fd43585c2 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13619](https://github.com/fastapi/fastapi/pull/13619) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13594](https://github.com/fastapi/fastapi/pull/13594) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 👥 Update FastAPI People - Experts. PR [#13568](https://github.com/fastapi/fastapi/pull/13568) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI GitHub topic repositories. PR [#13565](https://github.com/fastapi/fastapi/pull/13565) by [@tiangolo](https://github.com/tiangolo). From 1d21c7f74833e68a2a75c9ef43b09103f54210ea Mon Sep 17 00:00:00 2001 From: Gaurav Sheni Date: Mon, 21 Apr 2025 09:30:38 -0400 Subject: [PATCH 033/138] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20syntax=20err?= =?UTF-8?q?or=20in=20`docs/en/docs/tutorial/handling-errors.md`=20(#13623)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/tutorial/handling-errors.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/docs/tutorial/handling-errors.md b/docs/en/docs/tutorial/handling-errors.md index 4d969747f..5b8e677e4 100644 --- a/docs/en/docs/tutorial/handling-errors.md +++ b/docs/en/docs/tutorial/handling-errors.md @@ -35,7 +35,7 @@ Because it's a Python exception, you don't `return` it, you `raise` it. This also means that if you are inside a utility function that you are calling inside of your *path operation function*, and you raise the `HTTPException` from inside of that utility function, it won't run the rest of the code in the *path operation function*, it will terminate that request right away and send the HTTP error from the `HTTPException` to the client. -The benefit of raising an exception over `return`ing a value will be more evident in the section about Dependencies and Security. +The benefit of raising an exception over returning a value will be more evident in the section about Dependencies and Security. In this example, when the client requests an item by an ID that doesn't exist, raise an exception with a status code of `404`: @@ -252,4 +252,4 @@ If you want to use the exception along with the same default exception handlers {* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *} -In this example you are just `print`ing the error with a very expressive message, but you get the idea. You can use the exception and then just reuse the default exception handlers. +In this example you are just printing the error with a very expressive message, but you get the idea. You can use the exception and then just reuse the default exception handlers. From 601d678e0757c13187051eaa1f037e76951a2e86 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 21 Apr 2025 13:30:58 +0000 Subject: [PATCH 034/138] =?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 fd43585c2..10255fe0f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Docs +* ✏️ Fix syntax error in `docs/en/docs/tutorial/handling-errors.md`. PR [#13623](https://github.com/fastapi/fastapi/pull/13623) by [@gsheni](https://github.com/gsheni). * 📝 Fix typo in documentation. PR [#13599](https://github.com/fastapi/fastapi/pull/13599) by [@Taoup](https://github.com/Taoup). * 📝 Fix liblab client generation doc link. PR [#13571](https://github.com/fastapi/fastapi/pull/13571) by [@EFord36](https://github.com/EFord36). * ✏️ Fix talk information typo. PR [#13544](https://github.com/fastapi/fastapi/pull/13544) by [@blueswen](https://github.com/blueswen). From 9c03b8fd64d52aec575069094244456c92728128 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 20:09:18 +0200 Subject: [PATCH 035/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13634)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.5 → v0.11.6](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.5...v0.11.6) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 58b0080a5..51ca24ba5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.5 + rev: v0.11.6 hooks: - id: ruff args: From fe0c643e90543455ed62ce5ecdef1cce939db6b0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 21 Apr 2025 18:09:43 +0000 Subject: [PATCH 036/138] =?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 10255fe0f..688c6f434 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -25,6 +25,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13634](https://github.com/fastapi/fastapi/pull/13634) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13619](https://github.com/fastapi/fastapi/pull/13619) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13594](https://github.com/fastapi/fastapi/pull/13594) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 👥 Update FastAPI People - Experts. PR [#13568](https://github.com/fastapi/fastapi/pull/13568) by [@tiangolo](https://github.com/tiangolo). From c2fb5cc109ebb06ff56cb1a8732c8d9bff3111ac Mon Sep 17 00:00:00 2001 From: OA Date: Sat, 26 Apr 2025 18:00:32 +0200 Subject: [PATCH 037/138] =?UTF-8?q?=F0=9F=93=9D=20Remove=20unnecessary=20b?= =?UTF-8?q?ullet=20from=20docs=20(#13641)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/en/docs/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9a1260b90..a7a069cce 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,7 @@ $ pip install "fastapi[standard]" ### Create it -* Create a file `main.py` with: +Create a file `main.py` with: ```Python from typing import Union diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md index 4a2777f25..0f3623ed5 100644 --- a/docs/en/docs/index.md +++ b/docs/en/docs/index.md @@ -146,7 +146,7 @@ $ pip install "fastapi[standard]" ### Create it -* Create a file `main.py` with: +Create a file `main.py` with: ```Python from typing import Union From ba8d85fbe8787be7f4cb8ff619ab411be0d0674d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 26 Apr 2025 18:00:46 +0200 Subject: [PATCH 038/138] =?UTF-8?q?=E2=AC=86=20Bump=20astral-sh/setup-uv?= =?UTF-8?q?=20from=205=20to=206=20(#13648)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 5 to 6. - [Release notes](https://github.com/astral-sh/setup-uv/releases) - [Commits](https://github.com/astral-sh/setup-uv/compare/v5...v6) --- updated-dependencies: - dependency-name: astral-sh/setup-uv dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-docs.yml | 4 ++-- .github/workflows/contributors.yml | 2 +- .github/workflows/deploy-docs.yml | 2 +- .github/workflows/label-approved.yml | 2 +- .github/workflows/notify-translations.yml | 2 +- .github/workflows/people.yml | 2 +- .github/workflows/smokeshow.yml | 2 +- .github/workflows/sponsors.yml | 2 +- .github/workflows/test.yml | 6 +++--- .github/workflows/topic-repos.yml | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 6ecdf487c..e84e4e4ab 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -53,7 +53,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true @@ -95,7 +95,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml index 87abfe3a1..34b54b452 100644 --- a/.github/workflows/contributors.yml +++ b/.github/workflows/contributors.yml @@ -30,7 +30,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index aec327f48..9ca69b208 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -29,7 +29,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/label-approved.yml b/.github/workflows/label-approved.yml index 02070146c..908a9453d 100644 --- a/.github/workflows/label-approved.yml +++ b/.github/workflows/label-approved.yml @@ -26,7 +26,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/notify-translations.yml b/.github/workflows/notify-translations.yml index c96992689..621d1253a 100644 --- a/.github/workflows/notify-translations.yml +++ b/.github/workflows/notify-translations.yml @@ -34,7 +34,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/people.yml b/.github/workflows/people.yml index 6ec3c1ad2..11931a05a 100644 --- a/.github/workflows/people.yml +++ b/.github/workflows/people.yml @@ -30,7 +30,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml index a0ffd55e6..d8a5dfb30 100644 --- a/.github/workflows/smokeshow.yml +++ b/.github/workflows/smokeshow.yml @@ -26,7 +26,7 @@ jobs: with: python-version: '3.9' - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml index a5230c834..6da4d90e1 100644 --- a/.github/workflows/sponsors.yml +++ b/.github/workflows/sponsors.yml @@ -30,7 +30,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5e8092641..c3940be01 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,7 +29,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true @@ -67,7 +67,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true @@ -112,7 +112,7 @@ jobs: with: python-version: '3.8' - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true diff --git a/.github/workflows/topic-repos.yml b/.github/workflows/topic-repos.yml index 3c5c881f1..433aeb00b 100644 --- a/.github/workflows/topic-repos.yml +++ b/.github/workflows/topic-repos.yml @@ -25,7 +25,7 @@ jobs: with: python-version: "3.11" - name: Setup uv - uses: astral-sh/setup-uv@v5 + uses: astral-sh/setup-uv@v6 with: version: "0.4.15" enable-cache: true From 9fa8050e01b26f58f5789375e9eb5e96e3bd3cfc Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 26 Apr 2025 16:00:54 +0000 Subject: [PATCH 039/138] =?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 688c6f434..16375c04a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Docs +* 📝 Remove unnecessary bullet from docs. PR [#13641](https://github.com/fastapi/fastapi/pull/13641) by [@Adamowoc](https://github.com/Adamowoc). * ✏️ Fix syntax error in `docs/en/docs/tutorial/handling-errors.md`. PR [#13623](https://github.com/fastapi/fastapi/pull/13623) by [@gsheni](https://github.com/gsheni). * 📝 Fix typo in documentation. PR [#13599](https://github.com/fastapi/fastapi/pull/13599) by [@Taoup](https://github.com/Taoup). * 📝 Fix liblab client generation doc link. PR [#13571](https://github.com/fastapi/fastapi/pull/13571) by [@EFord36](https://github.com/EFord36). From 79bc96647bf53b2e969233122e5ad3c9ed896a61 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 26 Apr 2025 16:01:11 +0000 Subject: [PATCH 040/138] =?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 16375c04a..553546258 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -26,6 +26,7 @@ hide: ### Internal +* ⬆ Bump astral-sh/setup-uv from 5 to 6. PR [#13648](https://github.com/fastapi/fastapi/pull/13648) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13634](https://github.com/fastapi/fastapi/pull/13634) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13619](https://github.com/fastapi/fastapi/pull/13619) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13594](https://github.com/fastapi/fastapi/pull/13594) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From ea42ebda809a06108115dbed1c010ac7e5e7ef1d Mon Sep 17 00:00:00 2001 From: Frank Hoffmann Date: Mon, 28 Apr 2025 09:13:56 +0200 Subject: [PATCH 041/138] =?UTF-8?q?=E2=9C=85=20Use=20`inline-snapshot`=20t?= =?UTF-8?q?o=20support=20different=20Pydantic=20versions=20in=20the=20test?= =?UTF-8?q?=20suite=20(#12534)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: svlandeg Co-authored-by: Sofie Van Landeghem --- requirements-tests.txt | 2 +- .../test_tutorial002.py | 48 +++++++++++-------- .../test_sql_databases/test_tutorial002.py | 6 +-- tests/utils.py | 23 +++++++++ 4 files changed, 56 insertions(+), 23 deletions(-) diff --git a/requirements-tests.txt b/requirements-tests.txt index 013b9a35a..f722825dd 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -10,7 +10,7 @@ anyio[trio] >=3.2.1,<5.0.0 PyJWT==2.8.0 pyyaml >=5.3.1,<7.0.0 passlib[bcrypt] >=1.7.2,<2.0.0 -inline-snapshot==0.19.3 +inline-snapshot>=0.21.1 # types types-ujson ==5.10.0.20240515 types-orjson ==3.6.2 diff --git a/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py b/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py index 30adadc8a..cef6f6630 100644 --- a/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py +++ b/tests/test_tutorial/test_cookie_param_models/test_tutorial002.py @@ -5,7 +5,13 @@ from dirty_equals import IsDict from fastapi.testclient import TestClient from inline_snapshot import snapshot -from tests.utils import needs_py39, needs_py310, needs_pydanticv1, needs_pydanticv2 +from tests.utils import ( + needs_py39, + needs_py310, + needs_pydanticv1, + needs_pydanticv2, + pydantic_snapshot, +) @pytest.fixture( @@ -59,8 +65,8 @@ def test_cookie_param_model_defaults(client: TestClient): def test_cookie_param_model_invalid(client: TestClient): response = client.get("/items/") assert response.status_code == 422 - assert response.json() == snapshot( - IsDict( + assert response.json() == pydantic_snapshot( + v2=snapshot( { "detail": [ { @@ -71,9 +77,8 @@ def test_cookie_param_model_invalid(client: TestClient): } ] } - ) - | IsDict( - # TODO: remove when deprecating Pydantic v1 + ), + v1=snapshot( { "detail": [ { @@ -83,7 +88,7 @@ def test_cookie_param_model_invalid(client: TestClient): } ] } - ) + ), ) @@ -144,18 +149,23 @@ def test_openapi_schema(client: TestClient): "name": "fatebook_tracker", "in": "cookie", "required": False, - "schema": IsDict( - { - "anyOf": [{"type": "string"}, {"type": "null"}], - "title": "Fatebook Tracker", - } - ) - | IsDict( - # TODO: remove when deprecating Pydantic v1 - { - "type": "string", - "title": "Fatebook Tracker", - } + "schema": pydantic_snapshot( + v2=snapshot( + { + "anyOf": [ + {"type": "string"}, + {"type": "null"}, + ], + "title": "Fatebook Tracker", + } + ), + v1=snapshot( + # TODO: remove when deprecating Pydantic v1 + { + "type": "string", + "title": "Fatebook Tracker", + } + ), ), }, { diff --git a/tests/test_tutorial/test_sql_databases/test_tutorial002.py b/tests/test_tutorial/test_sql_databases/test_tutorial002.py index 79e48c1c3..8a98f9a2d 100644 --- a/tests/test_tutorial/test_sql_databases/test_tutorial002.py +++ b/tests/test_tutorial/test_sql_databases/test_tutorial002.py @@ -4,7 +4,7 @@ import warnings import pytest from dirty_equals import IsDict, IsInt from fastapi.testclient import TestClient -from inline_snapshot import snapshot +from inline_snapshot import Is, snapshot from sqlalchemy import StaticPool from sqlmodel import SQLModel, create_engine from sqlmodel.main import default_registry @@ -117,14 +117,14 @@ def test_crud_app(client: TestClient): ) assert response.status_code == 200, response.text assert response.json() == snapshot( - {"name": "Dog Pond", "age": None, "id": hero_id} + {"name": "Dog Pond", "age": None, "id": Is(hero_id)} ) # Get updated hero response = client.get(f"/heroes/{hero_id}") assert response.status_code == 200, response.text assert response.json() == snapshot( - {"name": "Dog Pond", "age": None, "id": hero_id} + {"name": "Dog Pond", "age": None, "id": Is(hero_id)} ) # Delete a hero diff --git a/tests/utils.py b/tests/utils.py index 460c028f7..ae9543e3b 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -2,6 +2,7 @@ import sys import pytest from fastapi._compat import PYDANTIC_V2 +from inline_snapshot import Snapshot needs_py39 = pytest.mark.skipif(sys.version_info < (3, 9), reason="requires python3.9+") needs_py310 = pytest.mark.skipif( @@ -9,3 +10,25 @@ needs_py310 = pytest.mark.skipif( ) needs_pydanticv2 = pytest.mark.skipif(not PYDANTIC_V2, reason="requires Pydantic v2") needs_pydanticv1 = pytest.mark.skipif(PYDANTIC_V2, reason="requires Pydantic v1") + + +def pydantic_snapshot( + *, + v2: Snapshot, + v1: Snapshot, # TODO: remove v1 argument when deprecating Pydantic v1 +): + """ + This function should be used like this: + + >>> assert value == pydantic_snapshot(v2=snapshot(),v1=snapshot()) + + inline-snapshot will create the snapshots when pytest is executed for each versions of pydantic. + + It is also possible to use the function inside snapshots for version-specific values. + + >>> assert value == snapshot({ + "data": "some data", + "version_specific": pydantic_snapshot(v2=snapshot(),v1=snapshot()), + }) + """ + return v2 if PYDANTIC_V2 else v1 From 419917297738c6ee2cb68ddf9f9cb2f5ec61df2c Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 28 Apr 2025 07:14:30 +0000 Subject: [PATCH 042/138] =?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 553546258..d606d2eef 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -26,6 +26,7 @@ hide: ### Internal +* ✅ Use `inline-snapshot` to support different Pydantic versions in the test suite. PR [#12534](https://github.com/fastapi/fastapi/pull/12534) by [@15r10nk](https://github.com/15r10nk). * ⬆ Bump astral-sh/setup-uv from 5 to 6. PR [#13648](https://github.com/fastapi/fastapi/pull/13648) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13634](https://github.com/fastapi/fastapi/pull/13634) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13619](https://github.com/fastapi/fastapi/pull/13619) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From 8fa56b46a16859aaa6dd9d3eef140ef0682253f4 Mon Sep 17 00:00:00 2001 From: Joakim Nordling Date: Mon, 28 Apr 2025 21:31:44 +0300 Subject: [PATCH 043/138] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Update=20ReDoc=20t?= =?UTF-8?q?o=20version=202.x=20(#9700)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: svlandeg Co-authored-by: Sebastián Ramírez Co-authored-by: Sofie Van Landeghem --- docs/de/docs/how-to/custom-docs-ui-assets.md | 12 +++--------- docs/en/docs/how-to/custom-docs-ui-assets.md | 12 +++--------- docs/es/docs/how-to/custom-docs-ui-assets.md | 12 +++--------- docs/pt/docs/how-to/custom-docs-ui-assets.md | 12 +++--------- docs_src/custom_docs_ui/tutorial001.py | 2 +- fastapi/openapi/docs.py | 2 +- tests/test_application.py | 2 +- .../test_custom_docs_ui/test_tutorial001.py | 2 +- 8 files changed, 16 insertions(+), 40 deletions(-) diff --git a/docs/de/docs/how-to/custom-docs-ui-assets.md b/docs/de/docs/how-to/custom-docs-ui-assets.md index ab8cd9f6b..f68902b99 100644 --- a/docs/de/docs/how-to/custom-docs-ui-assets.md +++ b/docs/de/docs/how-to/custom-docs-ui-assets.md @@ -98,7 +98,7 @@ Sie können wahrscheinlich mit der rechten Maustaste auf jeden Link klicken und Und **ReDoc** verwendet diese Datei: -* `redoc.standalone.js` +* `redoc.standalone.js` Danach könnte Ihre Dateistruktur wie folgt aussehen: @@ -129,14 +129,8 @@ Sie sollten eine sehr lange JavaScript-Datei für **ReDoc** sehen. Sie könnte beginnen mit etwas wie: ```JavaScript -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof m - +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): ... ``` diff --git a/docs/en/docs/how-to/custom-docs-ui-assets.md b/docs/en/docs/how-to/custom-docs-ui-assets.md index f717c98fa..9d2238e4f 100644 --- a/docs/en/docs/how-to/custom-docs-ui-assets.md +++ b/docs/en/docs/how-to/custom-docs-ui-assets.md @@ -98,7 +98,7 @@ You can probably right-click each link and select an option similar to `Save lin And **ReDoc** uses the file: -* `redoc.standalone.js` +* `redoc.standalone.js` After that, your file structure could look like: @@ -129,14 +129,8 @@ You should see a very long JavaScript file for **ReDoc**. It could start with something like: ```JavaScript -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof m - +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): ... ``` diff --git a/docs/es/docs/how-to/custom-docs-ui-assets.md b/docs/es/docs/how-to/custom-docs-ui-assets.md index 444cf167e..0a03ff330 100644 --- a/docs/es/docs/how-to/custom-docs-ui-assets.md +++ b/docs/es/docs/how-to/custom-docs-ui-assets.md @@ -98,7 +98,7 @@ Probablemente puedas hacer clic derecho en cada enlace y seleccionar una opción Y **ReDoc** utiliza el archivo: -* `redoc.standalone.js` +* `redoc.standalone.js` Después de eso, tu estructura de archivos podría verse así: @@ -129,14 +129,8 @@ Deberías ver un archivo JavaScript muy largo de **ReDoc**. Podría comenzar con algo como: ```JavaScript -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof m - +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): ... ``` diff --git a/docs/pt/docs/how-to/custom-docs-ui-assets.md b/docs/pt/docs/how-to/custom-docs-ui-assets.md index 3adc7529e..b7de6c8bd 100644 --- a/docs/pt/docs/how-to/custom-docs-ui-assets.md +++ b/docs/pt/docs/how-to/custom-docs-ui-assets.md @@ -98,7 +98,7 @@ Você provavelmente pode clicar com o botão direito em cada link e selecionar u E o **ReDoc** usa os arquivos: -* `redoc.standalone.js` +* `redoc.standalone.js` Depois disso, sua estrutura de arquivos deve se parecer com: @@ -129,14 +129,8 @@ Você deverá ver um arquivo JavaScript muito longo para o **ReDoc**. Esse arquivo pode começar com algo como: ```JavaScript -/*! - * ReDoc - OpenAPI/Swagger-generated API Reference Documentation - * ------------------------------------------------------------- - * Version: "2.0.0-rc.18" - * Repo: https://github.com/Redocly/redoc - */ -!function(e,t){"object"==typeof exports&&"object"==typeof m - +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): ... ``` diff --git a/docs_src/custom_docs_ui/tutorial001.py b/docs_src/custom_docs_ui/tutorial001.py index f7ceb0c2f..1cfcce19a 100644 --- a/docs_src/custom_docs_ui/tutorial001.py +++ b/docs_src/custom_docs_ui/tutorial001.py @@ -29,7 +29,7 @@ async def redoc_html(): return get_redoc_html( openapi_url=app.openapi_url, title=app.title + " - ReDoc", - redoc_js_url="https://unpkg.com/redoc@next/bundles/redoc.standalone.js", + redoc_js_url="https://unpkg.com/redoc@2/bundles/redoc.standalone.js", ) diff --git a/fastapi/openapi/docs.py b/fastapi/openapi/docs.py index c2ec358d2..f181b43c1 100644 --- a/fastapi/openapi/docs.py +++ b/fastapi/openapi/docs.py @@ -188,7 +188,7 @@ def get_redoc_html( It is normally set to a CDN URL. """ ), - ] = "https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js", + ] = "https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js", redoc_favicon_url: Annotated[ str, Doc( diff --git a/tests/test_application.py b/tests/test_application.py index 5c62f5f6e..a7d50ea72 100644 --- a/tests/test_application.py +++ b/tests/test_application.py @@ -43,7 +43,7 @@ def test_redoc(): response = client.get("/redoc") assert response.status_code == 200, response.text assert response.headers["content-type"] == "text/html; charset=utf-8" - assert "redoc@next" in response.text + assert "redoc@2" in response.text def test_enum_status_code_response(): diff --git a/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py b/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py index aff070d74..cb8e8c224 100644 --- a/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py +++ b/tests/test_tutorial/test_custom_docs_ui/test_tutorial001.py @@ -33,7 +33,7 @@ def test_swagger_ui_oauth2_redirect_html(client: TestClient): def test_redoc_html(client: TestClient): response = client.get("/redoc") assert response.status_code == 200, response.text - assert "https://unpkg.com/redoc@next/bundles/redoc.standalone.js" in response.text + assert "https://unpkg.com/redoc@2/bundles/redoc.standalone.js" in response.text def test_api(client: TestClient): From 4025751afb7e5403cbc944a49b2fdc8a02cee2bd Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 28 Apr 2025 18:32:06 +0000 Subject: [PATCH 044/138] =?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 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d606d2eef..31f35431f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Upgrades + +* ⬆️ Update ReDoc to version 2.x. PR [#9700](https://github.com/fastapi/fastapi/pull/9700) by [@joakimnordling](https://github.com/joakimnordling). + ### Docs * 📝 Remove unnecessary bullet from docs. PR [#13641](https://github.com/fastapi/fastapi/pull/13641) by [@Adamowoc](https://github.com/Adamowoc). From 26dc148cb91f9ec679b7cf1a74f5a6d6747e7e00 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 28 Apr 2025 20:37:31 +0200 Subject: [PATCH 045/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13656)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.6 → v0.11.7](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.6...v0.11.7) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 51ca24ba5..b1429a562 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.6 + rev: v0.11.7 hooks: - id: ruff args: From 699717cf7fa51f7f9555efec82cae040020c8cb1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 28 Apr 2025 18:37:55 +0000 Subject: [PATCH 046/138] =?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 31f35431f..08f8ecbbc 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -30,6 +30,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13656](https://github.com/fastapi/fastapi/pull/13656) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ✅ Use `inline-snapshot` to support different Pydantic versions in the test suite. PR [#12534](https://github.com/fastapi/fastapi/pull/12534) by [@15r10nk](https://github.com/15r10nk). * ⬆ Bump astral-sh/setup-uv from 5 to 6. PR [#13648](https://github.com/fastapi/fastapi/pull/13648) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13634](https://github.com/fastapi/fastapi/pull/13634) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From 9b5b2dd7a241bbfaaf85e16ae35a48b3257c4ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 1 May 2025 13:32:33 +0200 Subject: [PATCH 047/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Contributors=20and=20Translators=20(#13662)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/contributors.yml | 32 +++-- docs/en/data/translation_reviewers.yml | 158 +++++++++++++------------ docs/en/data/translators.yml | 9 +- 3 files changed, 107 insertions(+), 92 deletions(-) diff --git a/docs/en/data/contributors.yml b/docs/en/data/contributors.yml index 1910854af..7da07d8a1 100644 --- a/docs/en/data/contributors.yml +++ b/docs/en/data/contributors.yml @@ -1,18 +1,23 @@ tiangolo: login: tiangolo - count: 730 + count: 734 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo dependabot: login: dependabot - count: 98 + count: 100 avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4 url: https://github.com/apps/dependabot alejsdev: login: alejsdev count: 47 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=843355286cea366cbb3a4fc3a14343bd4eceef55&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4 url: https://github.com/alejsdev +pre-commit-ci: + login: pre-commit-ci + count: 27 + avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4 + url: https://github.com/apps/pre-commit-ci github-actions: login: github-actions count: 26 @@ -23,11 +28,6 @@ Kludex: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex -pre-commit-ci: - login: pre-commit-ci - count: 23 - avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4 - url: https://github.com/apps/pre-commit-ci dmontagu: login: dmontagu count: 17 @@ -183,11 +183,11 @@ uriyyo: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/32038156?u=a27b65a9ec3420586a827a0facccbb8b6df1ffb3&v=4 url: https://github.com/uriyyo -amacfie: - login: amacfie +andrew222651: + login: andrew222651 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4 - url: https://github.com/amacfie + url: https://github.com/andrew222651 rkbeatss: login: rkbeatss count: 3 @@ -488,6 +488,11 @@ Lancetnik: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/44573917?u=f9a18be7324333daf9cc314c35c3051f0a20a7a6&v=4 url: https://github.com/Lancetnik +joakimnordling: + login: joakimnordling + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/6637576?u=df5d99db9b899b399effd429f4358baaa6f7199c&v=4 + url: https://github.com/joakimnordling yogabonito: login: yogabonito count: 2 @@ -518,6 +523,11 @@ AyushSinghal1794: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/89984761?v=4 url: https://github.com/AyushSinghal1794 +gsheni: + login: gsheni + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/8726321?u=ee3bd9ff6320f4715d1dd9671a3d55cccb65b984&v=4 + url: https://github.com/gsheni DanielKusyDev: login: DanielKusyDev count: 2 diff --git a/docs/en/data/translation_reviewers.yml b/docs/en/data/translation_reviewers.yml index 5f1a89141..b544633fd 100644 --- a/docs/en/data/translation_reviewers.yml +++ b/docs/en/data/translation_reviewers.yml @@ -10,7 +10,7 @@ Xewus: url: https://github.com/Xewus sodaMelon: login: sodaMelon - count: 113 + count: 124 avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4 url: https://github.com/sodaMelon ceb10n: @@ -35,7 +35,7 @@ hard-coders: url: https://github.com/hard-coders alv2017: login: alv2017 - count: 86 + count: 88 avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 url: https://github.com/alv2017 nazarepiedady: @@ -105,7 +105,7 @@ alperiox: url: https://github.com/alperiox Rishat-F: login: Rishat-F - count: 41 + count: 42 avatarUrl: https://avatars.githubusercontent.com/u/66554797?v=4 url: https://github.com/Rishat-F Winand: @@ -136,7 +136,7 @@ SwftAlpc: alejsdev: login: alejsdev count: 36 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=843355286cea366cbb3a4fc3a14343bd4eceef55&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4 url: https://github.com/alejsdev timothy-jeong: login: timothy-jeong @@ -173,11 +173,6 @@ romashevchenko: count: 32 avatarUrl: https://avatars.githubusercontent.com/u/132477732?v=4 url: https://github.com/romashevchenko -wdh99: - login: wdh99 - count: 31 - avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 - url: https://github.com/wdh99 LorhanSohaky: login: LorhanSohaky count: 30 @@ -253,6 +248,11 @@ Aruelius: count: 24 avatarUrl: https://avatars.githubusercontent.com/u/25380989?u=574f8cfcda3ea77a3f81884f6b26a97068e36a9d&v=4 url: https://github.com/Aruelius +wisderfin: + login: wisderfin + count: 24 + avatarUrl: https://avatars.githubusercontent.com/u/77553770?u=9a23740d520d65dc0051cdc1ecd87f31cb900313&v=4 + url: https://github.com/wisderfin OzgunCaglarArslan: login: OzgunCaglarArslan count: 24 @@ -268,11 +268,6 @@ axel584: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/1334088?u=9667041f5b15dc002b6f9665fda8c0412933ac04&v=4 url: https://github.com/axel584 -wisderfin: - login: wisderfin - count: 23 - avatarUrl: https://avatars.githubusercontent.com/u/77553770?u=f3b00a26736ba664e9927a1116c6e8088295e073&v=4 - url: https://github.com/wisderfin AGolicyn: login: AGolicyn count: 21 @@ -328,6 +323,11 @@ ivan-abc: count: 18 avatarUrl: https://avatars.githubusercontent.com/u/36765187?u=c6e0ba571c1ccb6db9d94e62e4b8b5eda811a870&v=4 url: https://github.com/ivan-abc +Limsunoh: + login: Limsunoh + count: 18 + avatarUrl: https://avatars.githubusercontent.com/u/90311848?u=f456e0c5709fd50c8cd2898b551558eda14e5f21&v=4 + url: https://github.com/Limsunoh bezaca: login: bezaca count: 17 @@ -353,11 +353,6 @@ jeison-araya: count: 17 avatarUrl: https://avatars.githubusercontent.com/u/57369279?u=17001e68af7d8e5b8c343e5e9df4050f419998d5&v=4 url: https://github.com/jeison-araya -Limsunoh: - login: Limsunoh - count: 17 - avatarUrl: https://avatars.githubusercontent.com/u/90311848?u=f456e0c5709fd50c8cd2898b551558eda14e5f21&v=4 - url: https://github.com/Limsunoh yanever: login: yanever count: 16 @@ -376,7 +371,7 @@ Joao-Pedro-P-Holanda: JaeHyuckSa: login: JaeHyuckSa count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/104830931?u=b19b3e24d6030f88d22bd3e953f9525d2f062da3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/104830931?u=6e352201714a05154e5d0ccf91b4715a951c622e&v=4 url: https://github.com/JaeHyuckSa SofiiaTrufanova: login: SofiiaTrufanova @@ -393,6 +388,11 @@ kim-sangah: count: 15 avatarUrl: https://avatars.githubusercontent.com/u/173775778?v=4 url: https://github.com/kim-sangah +DianaTrufanova: + login: DianaTrufanova + count: 15 + avatarUrl: https://avatars.githubusercontent.com/u/119067607?u=1cd55f841b68b4a187fa6d06a7dafa5f070195aa&v=4 + url: https://github.com/DianaTrufanova PandaHun: login: PandaHun count: 14 @@ -403,11 +403,6 @@ dukkee: count: 14 avatarUrl: https://avatars.githubusercontent.com/u/36825394?u=ccfd86e6a4f2d093dad6f7544cc875af67fa2df8&v=4 url: https://github.com/dukkee -mkdir700: - login: mkdir700 - count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/56359329?u=3d6ea8714f5000829b60dcf7b13a75b1e73aaf47&v=4 - url: https://github.com/mkdir700 BORA040126: login: BORA040126 count: 14 @@ -418,11 +413,6 @@ mattkoehne: count: 14 avatarUrl: https://avatars.githubusercontent.com/u/80362153?v=4 url: https://github.com/mattkoehne -DianaTrufanova: - login: DianaTrufanova - count: 14 - avatarUrl: https://avatars.githubusercontent.com/u/119067607?u=1cd55f841b68b4a187fa6d06a7dafa5f070195aa&v=4 - url: https://github.com/DianaTrufanova jovicon: login: jovicon count: 13 @@ -463,16 +453,16 @@ oandersonmagalhaes: count: 12 avatarUrl: https://avatars.githubusercontent.com/u/83456692?v=4 url: https://github.com/oandersonmagalhaes +mkdir700: + login: mkdir700 + count: 12 + avatarUrl: https://avatars.githubusercontent.com/u/56359329?u=3d6ea8714f5000829b60dcf7b13a75b1e73aaf47&v=4 + url: https://github.com/mkdir700 batlopes: login: batlopes count: 12 avatarUrl: https://avatars.githubusercontent.com/u/33462923?u=0fb3d7acb316764616f11e4947faf080e49ad8d9&v=4 url: https://github.com/batlopes -Lenclove: - login: Lenclove - count: 12 - avatarUrl: https://avatars.githubusercontent.com/u/32355298?u=d0065e01650c63c2b2413f42d983634b2ea85481&v=4 - url: https://github.com/Lenclove joonas-yoon: login: joonas-yoon count: 12 @@ -493,6 +483,11 @@ andersonrocha0: count: 12 avatarUrl: https://avatars.githubusercontent.com/u/22346169?u=93a1359c8c5461d894802c0cc65bcd09217e7a02&v=4 url: https://github.com/andersonrocha0 +gitgernit: + login: gitgernit + count: 12 + avatarUrl: https://avatars.githubusercontent.com/u/129539613?u=d04f10143ab32c93f563ea14bf242d1d2bc991b0&v=4 + url: https://github.com/gitgernit kwang1215: login: kwang1215 count: 12 @@ -543,11 +538,6 @@ KNChiu: count: 11 avatarUrl: https://avatars.githubusercontent.com/u/36751646?v=4 url: https://github.com/KNChiu -gitgernit: - login: gitgernit - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/129539613?u=d04f10143ab32c93f563ea14bf242d1d2bc991b0&v=4 - url: https://github.com/gitgernit mariacamilagl: login: mariacamilagl count: 10 @@ -626,18 +616,18 @@ JulianMaurin: JeongHyeongKim: login: JeongHyeongKim count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/26577800?u=fe653349051c0acf62cd984e74c4ff60ca8d2cb6&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/26577800?u=77f060f4686f32c248907b81b16ee2b3177ca44c&v=4 url: https://github.com/JeongHyeongKim arthurio: login: arthurio count: 9 avatarUrl: https://avatars.githubusercontent.com/u/950449?u=76b997138273ce5e1990b971c4f27c9aff979fd5&v=4 url: https://github.com/arthurio -mahone3297: - login: mahone3297 +Lenclove: + login: Lenclove count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/1701379?u=20588ff0e456d13e8017333eb237595d11410234&v=4 - url: https://github.com/mahone3297 + avatarUrl: https://avatars.githubusercontent.com/u/32355298?u=d0065e01650c63c2b2413f42d983634b2ea85481&v=4 + url: https://github.com/Lenclove eVery1337: login: eVery1337 count: 9 @@ -653,6 +643,11 @@ riroan: count: 9 avatarUrl: https://avatars.githubusercontent.com/u/33053284?u=2d18e3771506ee874b66d6aa2b3b1107fd95c38f&v=4 url: https://github.com/riroan +MinLee0210: + login: MinLee0210 + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=175010b24bc3a15a5705424badf9b18823bfd67d&v=4 + url: https://github.com/MinLee0210 yodai-yodai: login: yodai-yodai count: 9 @@ -693,11 +688,6 @@ bnzone: count: 8 avatarUrl: https://avatars.githubusercontent.com/u/39371503?u=c16f00c41d88479fa2d57b0d7d233b758eacce2d&v=4 url: https://github.com/bnzone -ChuyuChoyeon: - login: ChuyuChoyeon - count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/129537877?u=f0c76f3327817a8b86b422d62e04a34bf2827f2b&v=4 - url: https://github.com/ChuyuChoyeon shamosishen: login: shamosishen count: 8 @@ -708,16 +698,16 @@ mertssmnoglu: count: 8 avatarUrl: https://avatars.githubusercontent.com/u/61623638?u=59dd885b68ff1832f9ab3b4a4446896358c23442&v=4 url: https://github.com/mertssmnoglu +mahone3297: + login: mahone3297 + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/1701379?u=20588ff0e456d13e8017333eb237595d11410234&v=4 + url: https://github.com/mahone3297 KimJoonSeo: login: KimJoonSeo count: 8 avatarUrl: https://avatars.githubusercontent.com/u/17760162?u=a58cdc77ae1c069a64166f7ecc4d42eecfd9a468&v=4 url: https://github.com/KimJoonSeo -MinLee0210: - login: MinLee0210 - count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=25f979af418692b95e907df93607a09117e14b53&v=4 - url: https://github.com/MinLee0210 camigomezdev: login: camigomezdev count: 8 @@ -778,6 +768,11 @@ d2a-raudenaerde: count: 7 avatarUrl: https://avatars.githubusercontent.com/u/5213150?v=4 url: https://github.com/d2a-raudenaerde +sungchan1: + login: sungchan1 + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/28076127?u=a816d86ef3e60450a7225f128caf9a394c9320f9&v=4 + url: https://github.com/sungchan1 deniscapeto: login: deniscapeto count: 6 @@ -853,11 +848,6 @@ Kirilex: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/100281552?v=4 url: https://github.com/Kirilex -Mordson: - login: Mordson - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/39025897?u=b94ea96ef35bbe43bc85359cfb31d28ac16d470c&v=4 - url: https://github.com/Mordson arunppsg: login: arunppsg count: 6 @@ -868,11 +858,6 @@ dimastbk: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/3132181?u=66587398d43466a1dc75c238df5f048e0afc77ed&v=4 url: https://github.com/dimastbk -lordqyxz: - login: lordqyxz - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/31722468?u=974553c0ba53526d9be7e9876544283291be3b0d&v=4 - url: https://github.com/lordqyxz dudyaosuplayer: login: dudyaosuplayer count: 6 @@ -941,8 +926,13 @@ jvmazagao: cun3yt: login: cun3yt count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/24409240?u=39f651cdcc4991fb9fef5bbd9e9503db2174ac13&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/24409240?u=06abfd77786db859b0602d5369d2ae18c932c17c&v=4 url: https://github.com/cun3yt +Mordson: + login: Mordson + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/39025897?u=b94ea96ef35bbe43bc85359cfb31d28ac16d470c&v=4 + url: https://github.com/Mordson aminkhani: login: aminkhani count: 5 @@ -963,6 +953,11 @@ Chushine: count: 5 avatarUrl: https://avatars.githubusercontent.com/u/135534400?v=4 url: https://github.com/Chushine +ChuyuChoyeon: + login: ChuyuChoyeon + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/129537877?u=f0c76f3327817a8b86b422d62e04a34bf2827f2b&v=4 + url: https://github.com/ChuyuChoyeon frwl404: login: frwl404 count: 5 @@ -1081,13 +1076,18 @@ aminalaee: erfan-rfmhr: login: erfan-rfmhr count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/98986056?u=b1559d684b1ced11b2204546fa3cf28addf665a8&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/98986056?u=0acda1ff1df0989f3f3eb79977baa35da4cb6c8c&v=4 url: https://github.com/erfan-rfmhr Scorpionchiques: login: Scorpionchiques count: 4 avatarUrl: https://avatars.githubusercontent.com/u/15703294?v=4 url: https://github.com/Scorpionchiques +lordqyxz: + login: lordqyxz + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/31722468?u=974553c0ba53526d9be7e9876544283291be3b0d&v=4 + url: https://github.com/lordqyxz heysaeid: login: heysaeid count: 4 @@ -1383,11 +1383,11 @@ tienduong-21: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/80129618?v=4 url: https://github.com/tienduong-21 -jameselite: - login: jameselite +soroushgh1: + login: soroushgh1 count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=6964d633449bf7d4a83d0fa0198f81f9ee5cfcd0&v=4 - url: https://github.com/jameselite + avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=e4d791c982cf7899c69f6baeebc4d7bbe86635d1&v=4 + url: https://github.com/soroushgh1 zbellos: login: zbellos count: 3 @@ -1466,7 +1466,7 @@ TimorChow: ataberkciftlikli: login: ataberkciftlikli count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/64265169?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/64265169?u=ca7c1348242559f70bc1dc027a4be277c464676f&v=4 url: https://github.com/ataberkciftlikli leandrodesouzadev: login: leandrodesouzadev @@ -1501,7 +1501,7 @@ lindsayzhou: jonatasoli: login: jonatasoli count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=071c062d2861d3dd127f6b4a5258cd8ef55d4c50&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=f601c3f111f2148bd9244c2cb3ebbd57b592e674&v=4 url: https://github.com/jonatasoli tyzh-dev: login: tyzh-dev @@ -1726,7 +1726,7 @@ ZhibangYue: saeye: login: saeye count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/62229734?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4 url: https://github.com/saeye Heumhub: login: Heumhub @@ -1763,3 +1763,13 @@ ivintoiu: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1853336?u=5e3d0977f44661fb9712fa297cc8f7608ea6ce48&v=4 url: https://github.com/ivintoiu +EgorOnishchuk: + login: EgorOnishchuk + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4 + url: https://github.com/EgorOnishchuk +Azazul123: + login: Azazul123 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/102759111?u=b48ce6e30a81a23467cc30e0c011bcc57f0326ab&v=4 + url: https://github.com/Azazul123 diff --git a/docs/en/data/translators.yml b/docs/en/data/translators.yml index f79bb300a..d8593f53f 100644 --- a/docs/en/data/translators.yml +++ b/docs/en/data/translators.yml @@ -253,11 +253,6 @@ Zssaer: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/45691504?u=4c0c195f25cb5ac6af32acfb0ab35427682938d2&v=4 url: https://github.com/Zssaer -wdh99: - login: wdh99 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 - url: https://github.com/wdh99 ChuyuChoyeon: login: ChuyuChoyeon count: 3 @@ -281,7 +276,7 @@ hsuanchi: alejsdev: login: alejsdev count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=843355286cea366cbb3a4fc3a14343bd4eceef55&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=638c65283ac9e9e2c3a0f9d1e3370db4b8a2c58d&v=4 url: https://github.com/alejsdev riroan: login: riroan @@ -501,7 +496,7 @@ andersonrocha0: saeye: login: saeye count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/62229734?v=4 + avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4 url: https://github.com/saeye timothy-jeong: login: timothy-jeong From a748e7336b4a1799acccf36d8fc5d738649101c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 1 May 2025 13:32:46 +0200 Subject: [PATCH 048/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Sponsors=20(#13664)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/github_sponsors.yml | 131 ++++++++++++++----------------- 1 file changed, 58 insertions(+), 73 deletions(-) diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml index de6d44f96..e24f64edc 100644 --- a/docs/en/data/github_sponsors.yml +++ b/docs/en/data/github_sponsors.yml @@ -2,18 +2,9 @@ sponsors: - - login: renderinc avatarUrl: https://avatars.githubusercontent.com/u/36424661?v=4 url: https://github.com/renderinc - - login: bump-sh - avatarUrl: https://avatars.githubusercontent.com/u/33217836?v=4 - url: https://github.com/bump-sh - - login: Nixtla - avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4 - url: https://github.com/Nixtla - login: andrew-propelauth avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=c98993dec8553c09d424ede67bbe86e5c35f48c9&v=4 url: https://github.com/andrew-propelauth - - login: zanfaruqui - avatarUrl: https://avatars.githubusercontent.com/u/104461687?v=4 - url: https://github.com/zanfaruqui - login: blockbee-io avatarUrl: https://avatars.githubusercontent.com/u/115143449?u=1b8620c2d6567c4df2111a371b85a51f448f9b85&v=4 url: https://github.com/blockbee-io @@ -26,6 +17,9 @@ sponsors: - login: porter-dev avatarUrl: https://avatars.githubusercontent.com/u/62078005?v=4 url: https://github.com/porter-dev + - login: Nixtla + avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4 + url: https://github.com/Nixtla - login: scalar avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4 url: https://github.com/scalar @@ -68,10 +62,7 @@ sponsors: - login: acsone avatarUrl: https://avatars.githubusercontent.com/u/7601056?v=4 url: https://github.com/acsone -- - login: ecosyste-ms - avatarUrl: https://avatars.githubusercontent.com/u/98474690?v=4 - url: https://github.com/ecosyste-ms - - login: Trivie +- - login: Trivie avatarUrl: https://avatars.githubusercontent.com/u/8161763?v=4 url: https://github.com/Trivie - - login: takashi-yoneya @@ -80,9 +71,6 @@ sponsors: - - login: mainframeindustries avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4 url: https://github.com/mainframeindustries - - login: CanoaPBC - avatarUrl: https://avatars.githubusercontent.com/u/64223768?v=4 - url: https://github.com/CanoaPBC - login: yasyf avatarUrl: https://avatars.githubusercontent.com/u/709645?u=f36736b3c6a85f578886ecc42a740e7b436e7a01&v=4 url: https://github.com/yasyf @@ -92,30 +80,27 @@ sponsors: - - login: primer-io avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4 url: https://github.com/primer-io - - login: povilasb - avatarUrl: https://avatars.githubusercontent.com/u/1213442?u=b11f58ed6ceea6e8297c9b310030478ebdac894d&v=4 - url: https://github.com/povilasb - - login: upciti avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4 url: https://github.com/upciti + - login: f4rk4sh + avatarUrl: https://avatars.githubusercontent.com/u/90454259?v=4 + url: https://github.com/f4rk4sh - login: freddiev4 avatarUrl: https://avatars.githubusercontent.com/u/8339018?u=1aad5b4f5a04cb750852b843d5e1d8f4ce339c2e&v=4 url: https://github.com/freddiev4 - - login: samuelcolvin avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4 url: https://github.com/samuelcolvin - - login: ProteinQure - avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 - url: https://github.com/ProteinQure + - login: vincentkoc + avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4 + url: https://github.com/vincentkoc - login: otosky avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4 url: https://github.com/otosky - login: ramonalmeidam avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4 url: https://github.com/ramonalmeidam - - login: mjohnsey - avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4 - url: https://github.com/mjohnsey - login: ashi-agrawal avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4 url: https://github.com/ashi-agrawal @@ -125,14 +110,11 @@ sponsors: - login: RaamEEIL avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4 url: https://github.com/RaamEEIL - - login: b-rad-c - avatarUrl: https://avatars.githubusercontent.com/u/25362581?u=5bb10629f4015b62bec1f9a366675d5085551af9&v=4 - url: https://github.com/b-rad-c - login: ehaca avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4 url: https://github.com/ehaca - login: raphaellaude - avatarUrl: https://avatars.githubusercontent.com/u/28026311?u=28faad3e62250ef91a0c3c5d0faba39592d9ab39&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/28026311?u=91e1c00d9ac4f8045527e13de8050d504531cbc0&v=4 url: https://github.com/raphaellaude - login: timlrx avatarUrl: https://avatars.githubusercontent.com/u/28362229?u=9a745ca31372ee324af682715ae88ce8522f9094&v=4 @@ -140,9 +122,12 @@ sponsors: - login: Leay15 avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4 url: https://github.com/Leay15 - - login: chickenandstats - avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4 - url: https://github.com/chickenandstats + - login: ProteinQure + avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 + url: https://github.com/ProteinQure + - login: roboflow + avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4 + url: https://github.com/roboflow - login: kaoru0310 avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4 url: https://github.com/kaoru0310 @@ -161,9 +146,6 @@ sponsors: - login: logic-automation avatarUrl: https://avatars.githubusercontent.com/u/144732884?v=4 url: https://github.com/logic-automation - - login: roboflow - avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4 - url: https://github.com/roboflow - login: dudikbender avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4 url: https://github.com/dudikbender @@ -176,6 +158,9 @@ sponsors: - login: patricioperezv avatarUrl: https://avatars.githubusercontent.com/u/73832292?u=5f471f156e19ee7920e62ae0f4a47b95580e61cf&v=4 url: https://github.com/patricioperezv + - login: chickenandstats + avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4 + url: https://github.com/chickenandstats - login: dodo5522 avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4 url: https://github.com/dodo5522 @@ -185,9 +170,6 @@ sponsors: - login: knallgelb avatarUrl: https://avatars.githubusercontent.com/u/2358812?u=c48cb6362b309d74cbf144bd6ad3aed3eb443e82&v=4 url: https://github.com/knallgelb - - login: Shark009 - avatarUrl: https://avatars.githubusercontent.com/u/3163309?u=0c6f4091b0eda05c44c390466199826e6dc6e431&v=4 - url: https://github.com/Shark009 - login: dblackrun avatarUrl: https://avatars.githubusercontent.com/u/3528486?v=4 url: https://github.com/dblackrun @@ -206,9 +188,12 @@ sponsors: - login: gorhack avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4 url: https://github.com/gorhack - - login: vincentkoc - avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4 - url: https://github.com/vincentkoc + - login: Ryandaydev + avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4 + url: https://github.com/Ryandaydev + - login: jaredtrog + avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 + url: https://github.com/jaredtrog - login: jstanden avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4 url: https://github.com/jstanden @@ -242,6 +227,9 @@ sponsors: - login: mintuhouse avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4 url: https://github.com/mintuhouse + - login: oliverxchen + avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 + url: https://github.com/oliverxchen - login: TrevorBenson avatarUrl: https://avatars.githubusercontent.com/u/9167887?u=dccbea3327a57750923333d8ebf1a0b3f1948949&v=4 url: https://github.com/TrevorBenson @@ -263,15 +251,9 @@ sponsors: - login: khadrawy avatarUrl: https://avatars.githubusercontent.com/u/13686061?u=59f25ef42ecf04c22657aac4238ce0e2d3d30304&v=4 url: https://github.com/khadrawy - - login: Ryandaydev - avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4 - url: https://github.com/Ryandaydev - - login: jaredtrog - avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 - url: https://github.com/jaredtrog - - login: oliverxchen - avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 - url: https://github.com/oliverxchen + - login: mjohnsey + avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4 + url: https://github.com/mjohnsey - login: ternaus avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4 url: https://github.com/ternaus @@ -279,7 +261,7 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/5920492?u=208d419cf667b8ac594c82a8db01932c7e50d057&v=4 url: https://github.com/eseglem - login: FernandoCelmer - avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=d29fff3fd862fda4ca752079f13f32e84c762ea4&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=58ba6d5888fa7f355934e52db19f950e20b38162&v=4 url: https://github.com/FernandoCelmer - login: simw avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4 @@ -302,9 +284,6 @@ sponsors: - login: petercool avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4 url: https://github.com/petercool - - login: diegopenilla - avatarUrl: https://avatars.githubusercontent.com/u/42318333?v=4 - url: https://github.com/diegopenilla - login: siavashyj avatarUrl: https://avatars.githubusercontent.com/u/43583410?u=562005ddc7901cd27a1219a118a2363817b14977&v=4 url: https://github.com/siavashyj @@ -314,6 +293,12 @@ sponsors: - login: ArtyomVancyan avatarUrl: https://avatars.githubusercontent.com/u/44609997?v=4 url: https://github.com/ArtyomVancyan + - login: caviri + avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4 + url: https://github.com/caviri + - login: hgalytoby + avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4 + url: https://github.com/hgalytoby - login: joshuatz avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4 url: https://github.com/joshuatz @@ -338,12 +323,6 @@ sponsors: - login: engineerjoe440 avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4 url: https://github.com/engineerjoe440 - - login: caviri - avatarUrl: https://avatars.githubusercontent.com/u/45425937?u=4e14bd64282bad8f385eafbdb004b5a279366d6e&v=4 - url: https://github.com/caviri - - login: hgalytoby - avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4 - url: https://github.com/hgalytoby - login: conservative-dude avatarUrl: https://avatars.githubusercontent.com/u/55538308?u=f250c44942ea6e73a6bd90739b381c470c192c11&v=4 url: https://github.com/conservative-dude @@ -366,7 +345,7 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/1484589?u=54556072b8136efa12ae3b6902032ea2a39ace4b&v=4 url: https://github.com/miguelgr - login: WillHogan - avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=7036c064cf29781470573865264ec8e60b6b809f&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=8a80356e3e7d5a417157aba7ea565dabc8678327&v=4 url: https://github.com/WillHogan - login: my3 avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4 @@ -458,24 +437,30 @@ sponsors: - login: rwxd avatarUrl: https://avatars.githubusercontent.com/u/40308458?u=cd04a39e3655923be4f25c2ba8a5a07b3da3230a&v=4 url: https://github.com/rwxd - - login: kenkanayama - avatarUrl: https://avatars.githubusercontent.com/u/44771224?u=f68870c20c0f069491411aea8693c4714b40ecf0&v=4 - url: https://github.com/kenkanayama + - login: morzan1001 + avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4 + url: https://github.com/morzan1001 - login: sadikkuzu avatarUrl: https://avatars.githubusercontent.com/u/23168063?u=d179c06bb9f65c4167fcab118526819f8e0dac17&v=4 url: https://github.com/sadikkuzu - login: Olegt0rr avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4 url: https://github.com/Olegt0rr - - login: FabulousCodingFox - avatarUrl: https://avatars.githubusercontent.com/u/78906517?u=924a27cbee3db7e0ece5cc1509921402e1445e74&v=4 - url: https://github.com/FabulousCodingFox - - login: morzan1001 - avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4 - url: https://github.com/morzan1001 - - login: BrianCurliss - avatarUrl: https://avatars.githubusercontent.com/u/1222949?v=4 - url: https://github.com/BrianCurliss + - login: Miles-Arts + avatarUrl: https://avatars.githubusercontent.com/u/82297475?u=c41881e4b386d9dbf737218542b120336b5731a1&v=4 + url: https://github.com/Miles-Arts + - login: sandeepsalwan1 + avatarUrl: https://avatars.githubusercontent.com/u/118837112?u=fc9b0330fa4791950661b7decd9bf56f07599b43&v=4 + url: https://github.com/sandeepsalwan1 + - login: fabioantonioastore + avatarUrl: https://avatars.githubusercontent.com/u/132024075?u=b3a267f2e2c7ce2379f82163f88111bd2a2a2f1e&v=4 + url: https://github.com/fabioantonioastore + - login: zhandos256 + avatarUrl: https://avatars.githubusercontent.com/u/60260671?u=aa9ed698bc3cd06fb553d2ef91d3895bbb00cce1&v=4 + url: https://github.com/zhandos256 + - login: one-st-one + avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4 + url: https://github.com/one-st-one - login: Toothwitch avatarUrl: https://avatars.githubusercontent.com/u/1710406?u=5eebb23b46cd26e48643b9e5179536cad491c17a&v=4 url: https://github.com/Toothwitch From ed88e250987d075a0b4df7a784ebf607b3ad7e87 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 11:32:57 +0000 Subject: [PATCH 049/138] =?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 08f8ecbbc..c6cbd4413 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -30,6 +30,7 @@ hide: ### Internal +* 👥 Update FastAPI People - Contributors and Translators. PR [#13662](https://github.com/fastapi/fastapi/pull/13662) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13656](https://github.com/fastapi/fastapi/pull/13656) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ✅ Use `inline-snapshot` to support different Pydantic versions in the test suite. PR [#12534](https://github.com/fastapi/fastapi/pull/12534) by [@15r10nk](https://github.com/15r10nk). * ⬆ Bump astral-sh/setup-uv from 5 to 6. PR [#13648](https://github.com/fastapi/fastapi/pull/13648) by [@dependabot[bot]](https://github.com/apps/dependabot). From 663aae13b219a9cb30bf95ca11def18d39e97ba2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 11:33:13 +0000 Subject: [PATCH 050/138] =?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 c6cbd4413..bf5c5d2ab 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -30,6 +30,7 @@ hide: ### Internal +* 👥 Update FastAPI People - Sponsors. PR [#13664](https://github.com/fastapi/fastapi/pull/13664) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13662](https://github.com/fastapi/fastapi/pull/13662) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13656](https://github.com/fastapi/fastapi/pull/13656) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ✅ Use `inline-snapshot` to support different Pydantic versions in the test suite. PR [#12534](https://github.com/fastapi/fastapi/pull/12534) by [@15r10nk](https://github.com/15r10nk). From 418c3c8d2b00dbee8eaa63bb9265b5a660a85121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 1 May 2025 14:58:00 +0200 Subject: [PATCH 051/138] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20rem?= =?UTF-8?q?ove=20Bump.sh=20and=20Coherence=20(#13668)?= 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/docs/deployment/cloud.md | 1 - docs/en/overrides/main.html | 12 ------------ 4 files changed, 21 deletions(-) diff --git a/README.md b/README.md index a7a069cce..4d6dcc325 100644 --- a/README.md +++ b/README.md @@ -49,10 +49,8 @@ The key features are: - - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 5cbf05f9d..22e262951 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -8,18 +8,12 @@ gold: - url: https://www.porter.run title: Deploy FastAPI on AWS with a few clicks img: https://fastapi.tiangolo.com/img/sponsors/porter.png - - url: https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor - title: Automate FastAPI documentation generation with Bump.sh - img: https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg - url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files" img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg - url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge title: Auth, user management and more for your B2B product img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png - - url: https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=website - title: Coherence - img: https://fastapi.tiangolo.com/img/sponsors/coherence.png - url: https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral title: Simplify Full Stack Development with FastAPI & MongoDB img: https://fastapi.tiangolo.com/img/sponsors/mongodb.png diff --git a/docs/en/docs/deployment/cloud.md b/docs/en/docs/deployment/cloud.md index 471808851..d713379c3 100644 --- a/docs/en/docs/deployment/cloud.md +++ b/docs/en/docs/deployment/cloud.md @@ -14,5 +14,4 @@ You might want to try their services and follow their guides: * Platform.sh * Porter -* Coherence * Render diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 30973bfcb..eef505184 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -40,12 +40,6 @@
- - + -
From 48c0d3405da78709d4ff00efdee863e7f2664e19 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 12:58:22 +0000 Subject: [PATCH 053/138] =?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 bf5c5d2ab..90b22fd87 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -30,6 +30,7 @@ hide: ### Internal +* 🔧 Update sponsors: remove Bump.sh and Coherence. PR [#13668](https://github.com/fastapi/fastapi/pull/13668) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13664](https://github.com/fastapi/fastapi/pull/13664) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13662](https://github.com/fastapi/fastapi/pull/13662) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13656](https://github.com/fastapi/fastapi/pull/13656) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From cae8f976d85531f4e9ec5c04d7b2d649221b2bb9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 12:59:02 +0000 Subject: [PATCH 054/138] =?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 90b22fd87..9f06dd0e8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -30,6 +30,7 @@ hide: ### Internal +* 🔧 Update links for LinkedIn and bottom. PR [#13669](https://github.com/fastapi/fastapi/pull/13669) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove Bump.sh and Coherence. PR [#13668](https://github.com/fastapi/fastapi/pull/13668) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13664](https://github.com/fastapi/fastapi/pull/13664) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13662](https://github.com/fastapi/fastapi/pull/13662) by [@tiangolo](https://github.com/tiangolo). From f512b17992c34ecab6267ea49336771e2be34f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 1 May 2025 14:59:46 +0200 Subject: [PATCH 055/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20GitHu?= =?UTF-8?q?b=20topic=20repositories=20(#13667)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/topic_repos.yml | 390 +++++++++++++++++------------------ 1 file changed, 195 insertions(+), 195 deletions(-) diff --git a/docs/en/data/topic_repos.yml b/docs/en/data/topic_repos.yml index 7452088db..169b62694 100644 --- a/docs/en/data/topic_repos.yml +++ b/docs/en/data/topic_repos.yml @@ -1,246 +1,256 @@ - name: full-stack-fastapi-template html_url: https://github.com/fastapi/full-stack-fastapi-template - stars: 31581 + stars: 32337 owner_login: fastapi owner_html_url: https://github.com/fastapi - name: Hello-Python html_url: https://github.com/mouredev/Hello-Python - stars: 29256 + stars: 29833 owner_login: mouredev owner_html_url: https://github.com/mouredev - name: serve html_url: https://github.com/jina-ai/serve - stars: 21487 + stars: 21544 owner_login: jina-ai owner_html_url: https://github.com/jina-ai - name: sqlmodel html_url: https://github.com/fastapi/sqlmodel - stars: 15521 + stars: 15799 owner_login: fastapi owner_html_url: https://github.com/fastapi - name: HivisionIDPhotos html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos - stars: 15353 + stars: 15676 owner_login: Zeyi-Lin owner_html_url: https://github.com/Zeyi-Lin - name: Douyin_TikTok_Download_API html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API - stars: 11719 + stars: 12183 owner_login: Evil0ctal owner_html_url: https://github.com/Evil0ctal - name: fastapi-best-practices html_url: https://github.com/zhanymkanov/fastapi-best-practices - stars: 11129 + stars: 11594 owner_login: zhanymkanov owner_html_url: https://github.com/zhanymkanov - name: awesome-fastapi html_url: https://github.com/mjhea0/awesome-fastapi - stars: 9387 + stars: 9586 owner_login: mjhea0 owner_html_url: https://github.com/mjhea0 - name: FastUI html_url: https://github.com/pydantic/FastUI - stars: 8787 + stars: 8804 owner_login: pydantic owner_html_url: https://github.com/pydantic - name: nonebot2 html_url: https://github.com/nonebot/nonebot2 - stars: 6596 + stars: 6688 owner_login: nonebot owner_html_url: https://github.com/nonebot - name: FileCodeBox html_url: https://github.com/vastsa/FileCodeBox - stars: 6302 + stars: 6502 owner_login: vastsa owner_html_url: https://github.com/vastsa - name: serge html_url: https://github.com/serge-chat/serge - stars: 5707 + stars: 5720 owner_login: serge-chat owner_html_url: https://github.com/serge-chat +- name: hatchet + html_url: https://github.com/hatchet-dev/hatchet + stars: 5515 + owner_login: hatchet-dev + owner_html_url: https://github.com/hatchet-dev - name: fastapi-users html_url: https://github.com/fastapi-users/fastapi-users - stars: 5045 + stars: 5162 owner_login: fastapi-users owner_html_url: https://github.com/fastapi-users - name: polar html_url: https://github.com/polarsource/polar - stars: 4870 + stars: 5119 owner_login: polarsource owner_html_url: https://github.com/polarsource -- name: hatchet - html_url: https://github.com/hatchet-dev/hatchet - stars: 4658 - owner_login: hatchet-dev - owner_html_url: https://github.com/hatchet-dev - name: chatgpt-web-share html_url: https://github.com/chatpire/chatgpt-web-share - stars: 4310 + stars: 4302 owner_login: chatpire owner_html_url: https://github.com/chatpire - name: strawberry html_url: https://github.com/strawberry-graphql/strawberry - stars: 4217 + stars: 4244 owner_login: strawberry-graphql owner_html_url: https://github.com/strawberry-graphql +- name: fastapi_mcp + html_url: https://github.com/tadata-org/fastapi_mcp + stars: 4178 + owner_login: tadata-org + owner_html_url: https://github.com/tadata-org - name: atrilabs-engine html_url: https://github.com/Atri-Labs/atrilabs-engine - stars: 4111 + stars: 4112 owner_login: Atri-Labs owner_html_url: https://github.com/Atri-Labs - name: dynaconf html_url: https://github.com/dynaconf/dynaconf - stars: 3936 + stars: 3985 owner_login: dynaconf owner_html_url: https://github.com/dynaconf - name: poem html_url: https://github.com/poem-web/poem - stars: 3882 + stars: 3918 owner_login: poem-web owner_html_url: https://github.com/poem-web - name: farfalle html_url: https://github.com/rashadphz/farfalle - stars: 3248 + stars: 3287 owner_login: rashadphz owner_html_url: https://github.com/rashadphz - name: fastapi-admin html_url: https://github.com/fastapi-admin/fastapi-admin - stars: 3130 + stars: 3192 owner_login: fastapi-admin owner_html_url: https://github.com/fastapi-admin +- name: datamodel-code-generator + html_url: https://github.com/koxudaxi/datamodel-code-generator + stars: 3141 + owner_login: koxudaxi + owner_html_url: https://github.com/koxudaxi - name: opyrator html_url: https://github.com/ml-tooling/opyrator stars: 3116 owner_login: ml-tooling owner_html_url: https://github.com/ml-tooling -- name: datamodel-code-generator - html_url: https://github.com/koxudaxi/datamodel-code-generator - stars: 3054 - owner_login: koxudaxi - owner_html_url: https://github.com/koxudaxi -- name: docarray - html_url: https://github.com/docarray/docarray - stars: 3033 - owner_login: docarray - owner_html_url: https://github.com/docarray - name: LitServe html_url: https://github.com/Lightning-AI/LitServe - stars: 3019 + stars: 3088 owner_login: Lightning-AI owner_html_url: https://github.com/Lightning-AI - name: logfire html_url: https://github.com/pydantic/logfire - stars: 2909 + stars: 3059 owner_login: pydantic owner_html_url: https://github.com/pydantic -- name: fastapi-realworld-example-app - html_url: https://github.com/nsidnev/fastapi-realworld-example-app - stars: 2863 - owner_login: nsidnev - owner_html_url: https://github.com/nsidnev +- name: docarray + html_url: https://github.com/docarray/docarray + stars: 3052 + owner_login: docarray + owner_html_url: https://github.com/docarray - name: huma html_url: https://github.com/danielgtaylor/huma - stars: 2861 + stars: 3025 owner_login: danielgtaylor owner_html_url: https://github.com/danielgtaylor +- name: fastapi-realworld-example-app + html_url: https://github.com/nsidnev/fastapi-realworld-example-app + stars: 2883 + owner_login: nsidnev + owner_html_url: https://github.com/nsidnev - name: uvicorn-gunicorn-fastapi-docker html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker - stars: 2736 + stars: 2756 owner_login: tiangolo owner_html_url: https://github.com/tiangolo - name: tracecat html_url: https://github.com/TracecatHQ/tracecat - stars: 2556 + stars: 2587 owner_login: TracecatHQ owner_html_url: https://github.com/TracecatHQ - name: best-of-web-python html_url: https://github.com/ml-tooling/best-of-web-python - stars: 2485 + stars: 2502 owner_login: ml-tooling owner_html_url: https://github.com/ml-tooling +- name: Kokoro-FastAPI + html_url: https://github.com/remsky/Kokoro-FastAPI + stars: 2500 + owner_login: remsky + owner_html_url: https://github.com/remsky - name: RasaGPT html_url: https://github.com/paulpierre/RasaGPT - stars: 2409 + stars: 2419 owner_login: paulpierre owner_html_url: https://github.com/paulpierre - name: fastapi-react html_url: https://github.com/Buuntu/fastapi-react - stars: 2337 + stars: 2350 owner_login: Buuntu owner_html_url: https://github.com/Buuntu - name: nextpy html_url: https://github.com/dot-agent/nextpy - stars: 2271 + stars: 2277 owner_login: dot-agent owner_html_url: https://github.com/dot-agent - name: FastAPI-template html_url: https://github.com/s3rius/FastAPI-template - stars: 2223 + stars: 2273 owner_login: s3rius owner_html_url: https://github.com/s3rius -- name: Kokoro-FastAPI - html_url: https://github.com/remsky/Kokoro-FastAPI - stars: 2191 - owner_login: remsky - owner_html_url: https://github.com/remsky - name: 30-Days-of-Python html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python - stars: 2172 + stars: 2183 owner_login: codingforentrepreneurs owner_html_url: https://github.com/codingforentrepreneurs - name: sqladmin html_url: https://github.com/aminalaee/sqladmin - stars: 2090 + stars: 2141 owner_login: aminalaee owner_html_url: https://github.com/aminalaee - name: langserve html_url: https://github.com/langchain-ai/langserve - stars: 2055 + stars: 2070 owner_login: langchain-ai owner_html_url: https://github.com/langchain-ai - name: fastapi-utils html_url: https://github.com/fastapiutils/fastapi-utils - stars: 2040 + stars: 2063 owner_login: fastapiutils owner_html_url: https://github.com/fastapiutils - name: solara html_url: https://github.com/widgetti/solara - stars: 2005 + stars: 2028 owner_login: widgetti owner_html_url: https://github.com/widgetti - name: supabase-py html_url: https://github.com/supabase/supabase-py - stars: 1936 + stars: 1996 owner_login: supabase owner_html_url: https://github.com/supabase - name: mangum html_url: https://github.com/Kludex/mangum - stars: 1852 + stars: 1870 owner_login: Kludex owner_html_url: https://github.com/Kludex - name: python-week-2022 html_url: https://github.com/rochacbruno/python-week-2022 - stars: 1828 + stars: 1827 owner_login: rochacbruno owner_html_url: https://github.com/rochacbruno +- name: SurfSense + html_url: https://github.com/MODSetter/SurfSense + stars: 1763 + owner_login: MODSetter + owner_html_url: https://github.com/MODSetter - name: manage-fastapi html_url: https://github.com/ycd/manage-fastapi - stars: 1730 + stars: 1743 owner_login: ycd owner_html_url: https://github.com/ycd -- name: ormar - html_url: https://github.com/collerek/ormar - stars: 1722 - owner_login: collerek - owner_html_url: https://github.com/collerek - name: agentkit html_url: https://github.com/BCG-X-Official/agentkit - stars: 1715 + stars: 1741 owner_login: BCG-X-Official owner_html_url: https://github.com/BCG-X-Official +- name: ormar + html_url: https://github.com/collerek/ormar + stars: 1730 + owner_login: collerek + owner_html_url: https://github.com/collerek - name: langchain-serve html_url: https://github.com/jina-ai/langchain-serve - stars: 1625 + stars: 1631 owner_login: jina-ai owner_html_url: https://github.com/jina-ai - name: termpair @@ -248,248 +258,238 @@ stars: 1610 owner_login: cs01 owner_html_url: https://github.com/cs01 -- name: coronavirus-tracker-api - html_url: https://github.com/ExpDev07/coronavirus-tracker-api - stars: 1588 - owner_login: ExpDev07 - owner_html_url: https://github.com/ExpDev07 - name: piccolo html_url: https://github.com/piccolo-orm/piccolo - stars: 1568 + stars: 1588 owner_login: piccolo-orm owner_html_url: https://github.com/piccolo-orm +- name: coronavirus-tracker-api + html_url: https://github.com/ExpDev07/coronavirus-tracker-api + stars: 1587 + owner_login: ExpDev07 + owner_html_url: https://github.com/ExpDev07 - name: fastapi-cache html_url: https://github.com/long2ice/fastapi-cache - stars: 1526 + stars: 1552 owner_login: long2ice owner_html_url: https://github.com/long2ice - name: openapi-python-client html_url: https://github.com/openapi-generators/openapi-python-client - stars: 1504 + stars: 1536 owner_login: openapi-generators owner_html_url: https://github.com/openapi-generators - name: fastapi-crudrouter html_url: https://github.com/awtkns/fastapi-crudrouter - stars: 1476 + stars: 1491 owner_login: awtkns owner_html_url: https://github.com/awtkns -- name: awesome-fastapi-projects - html_url: https://github.com/Kludex/awesome-fastapi-projects - stars: 1433 - owner_login: Kludex - owner_html_url: https://github.com/Kludex - name: slowapi html_url: https://github.com/laurentS/slowapi - stars: 1408 + stars: 1450 owner_login: laurentS owner_html_url: https://github.com/laurentS +- name: awesome-fastapi-projects + html_url: https://github.com/Kludex/awesome-fastapi-projects + stars: 1443 + owner_login: Kludex + owner_html_url: https://github.com/Kludex - name: awesome-python-resources html_url: https://github.com/DjangoEx/awesome-python-resources - stars: 1386 + stars: 1387 owner_login: DjangoEx owner_html_url: https://github.com/DjangoEx - name: budgetml html_url: https://github.com/ebhy/budgetml - stars: 1343 + stars: 1341 owner_login: ebhy owner_html_url: https://github.com/ebhy - name: fastapi-pagination html_url: https://github.com/uriyyo/fastapi-pagination - stars: 1309 + stars: 1331 owner_login: uriyyo owner_html_url: https://github.com/uriyyo - name: fastapi-boilerplate html_url: https://github.com/teamhide/fastapi-boilerplate - stars: 1262 + stars: 1299 owner_login: teamhide owner_html_url: https://github.com/teamhide -- name: fastapi-tutorial - html_url: https://github.com/liaogx/fastapi-tutorial - stars: 1203 - owner_login: liaogx - owner_html_url: https://github.com/liaogx - name: fastapi-amis-admin html_url: https://github.com/amisadmin/fastapi-amis-admin - stars: 1195 + stars: 1235 owner_login: amisadmin owner_html_url: https://github.com/amisadmin -- name: SurfSense - html_url: https://github.com/MODSetter/SurfSense - stars: 1169 - owner_login: MODSetter - owner_html_url: https://github.com/MODSetter +- name: fastapi-tutorial + html_url: https://github.com/liaogx/fastapi-tutorial + stars: 1222 + owner_login: liaogx + owner_html_url: https://github.com/liaogx +- name: vue-fastapi-admin + html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin + stars: 1190 + owner_login: mizhexiaoxiao + owner_html_url: https://github.com/mizhexiaoxiao - name: fastapi-code-generator html_url: https://github.com/koxudaxi/fastapi-code-generator - stars: 1157 + stars: 1180 owner_login: koxudaxi owner_html_url: https://github.com/koxudaxi - name: bolt-python html_url: https://github.com/slackapi/bolt-python - stars: 1143 + stars: 1166 owner_login: slackapi owner_html_url: https://github.com/slackapi -- name: langchain-extract - html_url: https://github.com/langchain-ai/langchain-extract - stars: 1122 - owner_login: langchain-ai - owner_html_url: https://github.com/langchain-ai - name: fastapi_production_template html_url: https://github.com/zhanymkanov/fastapi_production_template - stars: 1112 + stars: 1134 owner_login: zhanymkanov owner_html_url: https://github.com/zhanymkanov +- name: langchain-extract + html_url: https://github.com/langchain-ai/langchain-extract + stars: 1127 + owner_login: langchain-ai + owner_html_url: https://github.com/langchain-ai - name: odmantic html_url: https://github.com/art049/odmantic - stars: 1109 + stars: 1115 owner_login: art049 owner_html_url: https://github.com/art049 - name: prometheus-fastapi-instrumentator html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator - stars: 1091 + stars: 1112 owner_login: trallnag owner_html_url: https://github.com/trallnag -- name: vue-fastapi-admin - html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin - stars: 1086 - owner_login: mizhexiaoxiao - owner_html_url: https://github.com/mizhexiaoxiao -- name: bedrock-claude-chat - html_url: https://github.com/aws-samples/bedrock-claude-chat - stars: 1075 +- name: bedrock-chat + html_url: https://github.com/aws-samples/bedrock-chat + stars: 1107 owner_login: aws-samples owner_html_url: https://github.com/aws-samples - name: fastapi-alembic-sqlmodel-async html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async - stars: 1074 + stars: 1094 owner_login: jonra1993 owner_html_url: https://github.com/jonra1993 +- name: restish + html_url: https://github.com/rest-sh/restish + stars: 1041 + owner_login: rest-sh + owner_html_url: https://github.com/rest-sh +- name: fastcrud + html_url: https://github.com/igorbenav/fastcrud + stars: 1036 + owner_login: igorbenav + owner_html_url: https://github.com/igorbenav - name: runhouse html_url: https://github.com/run-house/runhouse - stars: 1016 + stars: 1022 owner_login: run-house owner_html_url: https://github.com/run-house -- name: restish - html_url: https://github.com/danielgtaylor/restish - stars: 1012 - owner_login: danielgtaylor - owner_html_url: https://github.com/danielgtaylor +- name: fastapi_best_architecture + html_url: https://github.com/fastapi-practices/fastapi_best_architecture + stars: 997 + owner_login: fastapi-practices + owner_html_url: https://github.com/fastapi-practices - name: lanarky html_url: https://github.com/ajndkr/lanarky - stars: 988 + stars: 990 owner_login: ajndkr owner_html_url: https://github.com/ajndkr - name: autollm html_url: https://github.com/viddexa/autollm - stars: 987 + stars: 990 owner_login: viddexa owner_html_url: https://github.com/viddexa -- name: fastcrud - html_url: https://github.com/igorbenav/fastcrud - stars: 985 - owner_login: igorbenav - owner_html_url: https://github.com/igorbenav - name: secure html_url: https://github.com/TypeError/secure - stars: 930 + stars: 932 owner_login: TypeError owner_html_url: https://github.com/TypeError - name: langcorn html_url: https://github.com/msoedov/langcorn - stars: 924 + stars: 925 owner_login: msoedov owner_html_url: https://github.com/msoedov -- name: fastapi_best_architecture - html_url: https://github.com/fastapi-practices/fastapi_best_architecture - stars: 921 - owner_login: fastapi-practices - owner_html_url: https://github.com/fastapi-practices -- name: energy-forecasting - html_url: https://github.com/iusztinpaul/energy-forecasting - stars: 903 - owner_login: iusztinpaul - owner_html_url: https://github.com/iusztinpaul -- name: authx - html_url: https://github.com/yezz123/authx - stars: 900 - owner_login: yezz123 - owner_html_url: https://github.com/yezz123 - name: FastAPI-boilerplate html_url: https://github.com/igorbenav/FastAPI-boilerplate - stars: 877 + stars: 925 owner_login: igorbenav owner_html_url: https://github.com/igorbenav +- name: authx + html_url: https://github.com/yezz123/authx + stars: 913 + owner_login: yezz123 + owner_html_url: https://github.com/yezz123 +- name: energy-forecasting + html_url: https://github.com/iusztinpaul/energy-forecasting + stars: 907 + owner_login: iusztinpaul + owner_html_url: https://github.com/iusztinpaul - name: titiler html_url: https://github.com/developmentseed/titiler - stars: 853 + stars: 873 owner_login: developmentseed owner_html_url: https://github.com/developmentseed -- name: ludic - html_url: https://github.com/getludic/ludic - stars: 831 - owner_login: getludic - owner_html_url: https://github.com/getludic +- name: httpdbg + html_url: https://github.com/cle-b/httpdbg + stars: 850 + owner_login: cle-b + owner_html_url: https://github.com/cle-b - name: marker-api html_url: https://github.com/adithya-s-k/marker-api - stars: 829 + stars: 844 owner_login: adithya-s-k owner_html_url: https://github.com/adithya-s-k +- name: ludic + html_url: https://github.com/getludic/ludic + stars: 842 + owner_login: getludic + owner_html_url: https://github.com/getludic +- name: flock + html_url: https://github.com/Onelevenvy/flock + stars: 805 + owner_login: Onelevenvy + owner_html_url: https://github.com/Onelevenvy - name: fastapi-observability html_url: https://github.com/blueswen/fastapi-observability - stars: 771 + stars: 797 owner_login: blueswen owner_html_url: https://github.com/blueswen - name: fastapi-do-zero html_url: https://github.com/dunossauro/fastapi-do-zero - stars: 767 + stars: 786 owner_login: dunossauro owner_html_url: https://github.com/dunossauro - name: fastapi-mail html_url: https://github.com/sabuhish/fastapi-mail - stars: 759 + stars: 781 owner_login: sabuhish owner_html_url: https://github.com/sabuhish -- name: lccn_predictor - html_url: https://github.com/baoliay2008/lccn_predictor - stars: 749 - owner_login: baoliay2008 - owner_html_url: https://github.com/baoliay2008 -- name: flock - html_url: https://github.com/Onelevenvy/flock - stars: 746 - owner_login: Onelevenvy - owner_html_url: https://github.com/Onelevenvy - name: starlette-admin html_url: https://github.com/jowilf/starlette-admin - stars: 737 + stars: 764 owner_login: jowilf owner_html_url: https://github.com/jowilf -- name: annotated-py-projects - html_url: https://github.com/hhstore/annotated-py-projects - stars: 729 - owner_login: hhstore - owner_html_url: https://github.com/hhstore +- name: lccn_predictor + html_url: https://github.com/baoliay2008/lccn_predictor + stars: 759 + owner_login: baoliay2008 + owner_html_url: https://github.com/baoliay2008 - name: KonomiTV html_url: https://github.com/tsukumijima/KonomiTV - stars: 727 + stars: 741 owner_login: tsukumijima owner_html_url: https://github.com/tsukumijima -- name: learn-generative-ai - html_url: https://github.com/panaverse/learn-generative-ai - stars: 725 - owner_login: panaverse - owner_html_url: https://github.com/panaverse - name: FastAPI-Backend-Template html_url: https://github.com/Aeternalis-Ingenium/FastAPI-Backend-Template - stars: 719 + stars: 734 owner_login: Aeternalis-Ingenium owner_html_url: https://github.com/Aeternalis-Ingenium -- name: chatGPT-web - html_url: https://github.com/mic1on/chatGPT-web - stars: 712 - owner_login: mic1on - owner_html_url: https://github.com/mic1on -- name: linbing - html_url: https://github.com/taomujian/linbing - stars: 698 - owner_login: taomujian - owner_html_url: https://github.com/taomujian +- name: learn-generative-ai + html_url: https://github.com/panaverse/learn-generative-ai + stars: 731 + owner_login: panaverse + owner_html_url: https://github.com/panaverse +- name: annotated-py-projects + html_url: https://github.com/hhstore/annotated-py-projects + stars: 730 + owner_login: hhstore + owner_html_url: https://github.com/hhstore From 6eb31132e5c530e91573a8496c7e75856fc1cf2c Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 13:00:17 +0000 Subject: [PATCH 056/138] =?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 9f06dd0e8..e916ca42d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -30,6 +30,7 @@ hide: ### Internal +* 👥 Update FastAPI GitHub topic repositories. PR [#13667](https://github.com/fastapi/fastapi/pull/13667) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update links for LinkedIn and bottom. PR [#13669](https://github.com/fastapi/fastapi/pull/13669) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove Bump.sh and Coherence. PR [#13668](https://github.com/fastapi/fastapi/pull/13668) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13664](https://github.com/fastapi/fastapi/pull/13664) by [@tiangolo](https://github.com/tiangolo). From 16234a3f4fcc323d4aad92c3a4fd0201770b077b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 1 May 2025 15:13:51 +0200 Subject: [PATCH 057/138] =?UTF-8?q?=F0=9F=93=9D=20Update=20docs=20for=20"H?= =?UTF-8?q?elp=20FastAPI",=20simplify=20and=20reduce=20"sponsor"=20section?= =?UTF-8?q?=20(#13670)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/help-fastapi.md | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/docs/en/docs/help-fastapi.md b/docs/en/docs/help-fastapi.md index 81151032f..35d2e7b84 100644 --- a/docs/en/docs/help-fastapi.md +++ b/docs/en/docs/help-fastapi.md @@ -249,20 +249,7 @@ On the other side, there are thousands of users in the chat systems, so there's ## Sponsor the author -You can also financially support the author (me) through GitHub sponsors. - -There you could buy me a coffee ☕️ to say thanks. 😄 - -And you can also become a Silver or Gold sponsor for FastAPI. 🏅🎉 - -## Sponsor the tools that power FastAPI - -As you have seen in the documentation, FastAPI stands on the shoulders of giants, Starlette and Pydantic. - -You can also sponsor: - -* Samuel Colvin (Pydantic) -* Encode (Starlette, Uvicorn) +If your **product/company** depends on or is related to **FastAPI** and you want to reach its users, you can sponsor the author (me) through GitHub sponsors. Depending on the tier, you could get some extra benefits, like a badge in the docs. 🎁 --- From 7fdc4952bdd1b32fbb96bffc86e30d001962d442 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 13:14:19 +0000 Subject: [PATCH 058/138] =?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 e916ca42d..5884c6129 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,6 +13,7 @@ hide: ### Docs +* 📝 Update docs for "Help FastAPI", simplify and reduce "sponsor" section. PR [#13670](https://github.com/fastapi/fastapi/pull/13670) by [@tiangolo](https://github.com/tiangolo). * 📝 Remove unnecessary bullet from docs. PR [#13641](https://github.com/fastapi/fastapi/pull/13641) by [@Adamowoc](https://github.com/Adamowoc). * ✏️ Fix syntax error in `docs/en/docs/tutorial/handling-errors.md`. PR [#13623](https://github.com/fastapi/fastapi/pull/13623) by [@gsheni](https://github.com/gsheni). * 📝 Fix typo in documentation. PR [#13599](https://github.com/fastapi/fastapi/pull/13599) by [@Taoup](https://github.com/Taoup). From bc56c74d6b21300feaae66d27790c8e1c254928a Mon Sep 17 00:00:00 2001 From: Martyn Davies Date: Thu, 1 May 2025 15:15:38 +0200 Subject: [PATCH 059/138] =?UTF-8?q?=F0=9F=94=A7=20Update=20Sponsors:=20Zup?= =?UTF-8?q?lo=20logo=20and=20alt=20text=20(#13645)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- README.md | 2 +- docs/en/data/sponsors.yml | 2 +- docs/en/docs/img/sponsors/zuplo.png | Bin 18891 -> 7551 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4d6dcc325..40d0cdf6c 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ The key features are: - + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 22e262951..f42f67ada 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -18,7 +18,7 @@ gold: title: Simplify Full Stack Development with FastAPI & MongoDB img: https://fastapi.tiangolo.com/img/sponsors/mongodb.png - url: https://zuplo.link/fastapi-gh - title: 'Zuplo: Scale, Protect, Document, and Monetize your FastAPI' + title: 'Zuplo: Deploy, Secure, Document, and Monetize your FastAPI' img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png - url: https://liblab.com?utm_source=fastapi title: liblab - Generate SDKs from FastAPI diff --git a/docs/en/docs/img/sponsors/zuplo.png b/docs/en/docs/img/sponsors/zuplo.png index 7a7c16862983be77faf22ac937c1917fad0b812b..6a4ed233e9edcb50286bdf4d735458a20b3f13cc 100644 GIT binary patch literal 7551 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 VEU6WA8oB@g002ovPDHLkV1j!%^=tqD literal 18891 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 Date: Thu, 1 May 2025 15:15:45 +0200 Subject: [PATCH 060/138] =?UTF-8?q?=E2=AC=86=20Bump=20typer=20from=200.12.?= =?UTF-8?q?5=20to=200.15.3=20(#13666)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [typer](https://github.com/fastapi/typer) from 0.12.5 to 0.15.3. - [Release notes](https://github.com/fastapi/typer/releases) - [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md) - [Commits](https://github.com/fastapi/typer/compare/0.12.5...0.15.3) --- updated-dependencies: - dependency-name: typer dependency-version: 0.15.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-docs.txt b/requirements-docs.txt index 8812e27f9..bd0082304 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -3,7 +3,7 @@ mkdocs-material==9.6.1 mdx-include >=1.4.1,<2.0.0 mkdocs-redirects>=1.2.1,<1.3.0 -typer == 0.12.5 +typer == 0.15.3 pyyaml >=5.3.1,<7.0.0 # For Material for MkDocs, Chinese search jieba==0.42.1 From b57b8e7ad2cec74939331bb610344666eb1175d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 15:15:54 +0200 Subject: [PATCH 061/138] =?UTF-8?q?=E2=AC=86=20Bump=20sqlmodel=20from=200.?= =?UTF-8?q?0.23=20to=200.0.24=20(#13665)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [sqlmodel](https://github.com/fastapi/sqlmodel) from 0.0.23 to 0.0.24. - [Release notes](https://github.com/fastapi/sqlmodel/releases) - [Changelog](https://github.com/fastapi/sqlmodel/blob/main/docs/release-notes.md) - [Commits](https://github.com/fastapi/sqlmodel/compare/0.0.23...0.0.24) --- updated-dependencies: - dependency-name: sqlmodel dependency-version: 0.0.24 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> --- requirements-tests.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-tests.txt b/requirements-tests.txt index f722825dd..b9f2b2b66 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -4,7 +4,7 @@ pytest >=7.1.3,<9.0.0 coverage[toml] >= 6.5.0,< 8.0 mypy ==1.8.0 dirty-equals ==0.9.0 -sqlmodel==0.0.23 +sqlmodel==0.0.24 flask >=1.1.2,<4.0.0 anyio[trio] >=3.2.1,<5.0.0 PyJWT==2.8.0 From 581e3a0051d96a346f8f573c4e52e48a115328f7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 13:16:30 +0000 Subject: [PATCH 062/138] =?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 5884c6129..f93cf505c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -31,6 +31,7 @@ hide: ### Internal +* 🔧 Update Sponsors: Zuplo logo and alt text. PR [#13645](https://github.com/fastapi/fastapi/pull/13645) by [@martyndavies](https://github.com/martyndavies). * 👥 Update FastAPI GitHub topic repositories. PR [#13667](https://github.com/fastapi/fastapi/pull/13667) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update links for LinkedIn and bottom. PR [#13669](https://github.com/fastapi/fastapi/pull/13669) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove Bump.sh and Coherence. PR [#13668](https://github.com/fastapi/fastapi/pull/13668) by [@tiangolo](https://github.com/tiangolo). From fb1affca1b86565a7fe1b4661032fd4ec5cc7428 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 13:16:45 +0000 Subject: [PATCH 063/138] =?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 f93cf505c..88fe8fdec 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -31,6 +31,7 @@ hide: ### Internal +* ⬆ Bump sqlmodel from 0.0.23 to 0.0.24. PR [#13665](https://github.com/fastapi/fastapi/pull/13665) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Update Sponsors: Zuplo logo and alt text. PR [#13645](https://github.com/fastapi/fastapi/pull/13645) by [@martyndavies](https://github.com/martyndavies). * 👥 Update FastAPI GitHub topic repositories. PR [#13667](https://github.com/fastapi/fastapi/pull/13667) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update links for LinkedIn and bottom. PR [#13669](https://github.com/fastapi/fastapi/pull/13669) by [@tiangolo](https://github.com/tiangolo). From 6df106b8772306d60bab4b273b888f2103f8be79 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 13:16:47 +0000 Subject: [PATCH 064/138] =?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 88fe8fdec..30127af56 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -31,6 +31,7 @@ hide: ### Internal +* ⬆ Bump typer from 0.12.5 to 0.15.3. PR [#13666](https://github.com/fastapi/fastapi/pull/13666) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump sqlmodel from 0.0.23 to 0.0.24. PR [#13665](https://github.com/fastapi/fastapi/pull/13665) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Update Sponsors: Zuplo logo and alt text. PR [#13645](https://github.com/fastapi/fastapi/pull/13645) by [@martyndavies](https://github.com/martyndavies). * 👥 Update FastAPI GitHub topic repositories. PR [#13667](https://github.com/fastapi/fastapi/pull/13667) by [@tiangolo](https://github.com/tiangolo). From 3620a2b213a16eefe6b6bc9cfc90b33bfedacd92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 1 May 2025 16:42:39 +0200 Subject: [PATCH 065/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Experts=20(#13671)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/people.yml | 420 ++++++++++++++++++---------------------- 1 file changed, 188 insertions(+), 232 deletions(-) diff --git a/docs/en/data/people.yml b/docs/en/data/people.yml index 02a91ed19..a94c7c63c 100644 --- a/docs/en/data/people.yml +++ b/docs/en/data/people.yml @@ -1,11 +1,11 @@ maintainers: - login: tiangolo - answers: 1897 + answers: 1898 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo experts: - login: tiangolo - count: 1897 + count: 1898 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo - login: github-actions @@ -20,14 +20,14 @@ experts: count: 263 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 +- login: YuriiMotov + count: 247 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov - login: dmontagu count: 240 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 url: https://github.com/dmontagu -- login: YuriiMotov - count: 238 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 - url: https://github.com/YuriiMotov - login: Mause count: 219 avatarUrl: https://avatars.githubusercontent.com/u/1405026?v=4 @@ -72,14 +72,14 @@ experts: count: 67 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty +- login: luzzodev + count: 61 + avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 + url: https://github.com/luzzodev - login: falkben count: 59 avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 url: https://github.com/falkben -- login: luzzodev - count: 54 - avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 - url: https://github.com/luzzodev - login: acidjunk count: 50 avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 @@ -113,7 +113,7 @@ experts: avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=c159fe047727aedecbbeeaa96a1b03ceb9d39add&v=4 url: https://github.com/frankie567 - login: sinisaos - count: 40 + count: 41 avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 url: https://github.com/sinisaos - login: includeamin @@ -146,8 +146,12 @@ experts: url: https://github.com/hasansezertasan - login: dbanty count: 26 - avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9bcce836bbce55835291c5b2ac93a4e311f4b3c3&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9d726785d08e50b1e1cd96505800c8ea8405bce2&v=4 url: https://github.com/dbanty +- login: alv2017 + count: 25 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 - login: wshayes count: 25 avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 @@ -156,18 +160,14 @@ experts: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/9435877?u=719327b7d2c4c62212456d771bfa7c6b8dbb9eac&v=4 url: https://github.com/SirTelemak -- login: alv2017 +- login: connebs count: 22 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 + avatarUrl: https://avatars.githubusercontent.com/u/9054108?u=e151d5f545a3395136d711c227c22032fda67cfa&v=4 + url: https://github.com/connebs - login: nymous count: 22 avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 url: https://github.com/nymous -- login: connebs - count: 22 - avatarUrl: https://avatars.githubusercontent.com/u/9054108?u=e151d5f545a3395136d711c227c22032fda67cfa&v=4 - url: https://github.com/connebs - login: chrisK824 count: 22 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 @@ -222,7 +222,7 @@ experts: url: https://github.com/nkhitrov - login: jonatasoli count: 16 - avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=071c062d2861d3dd127f6b4a5258cd8ef55d4c50&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=f601c3f111f2148bd9244c2cb3ebbd57b592e674&v=4 url: https://github.com/jonatasoli - login: dstlny count: 16 @@ -245,59 +245,39 @@ experts: avatarUrl: https://avatars.githubusercontent.com/u/33907262?u=2721fb37014d50daf473267c808aa678ecaefe09&v=4 url: https://github.com/simondale00 last_month_experts: -- login: alv2017 - count: 12 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 -- login: luzzodev +- login: YuriiMotov count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov +- login: luzzodev + count: 8 avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 url: https://github.com/luzzodev -- login: yauhen-sobaleu - count: 8 - avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 - url: https://github.com/yauhen-sobaleu -- login: JavierSanchezCastro +- login: alv2017 count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 - url: https://github.com/JavierSanchezCastro -- login: marsboy02 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 - url: https://github.com/marsboy02 -- login: Ale-Cas - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 - url: https://github.com/Ale-Cas -- login: EverStarck - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 - url: https://github.com/EverStarck -- login: jgould22 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 +- login: sachinh35 count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 -- login: Kludex + avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4 + url: https://github.com/sachinh35 +- login: KianAnbarestani count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 - url: https://github.com/Kludex -- login: YuriiMotov + avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4 + url: https://github.com/KianAnbarestani +- login: tiangolo count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 - url: https://github.com/YuriiMotov + avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 + url: https://github.com/tiangolo three_months_experts: -- login: Kludex +- login: luzzodev count: 25 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 - url: https://github.com/Kludex + avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 + url: https://github.com/luzzodev - login: YuriiMotov - count: 25 + count: 24 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov -- login: luzzodev - count: 22 - avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 - url: https://github.com/luzzodev - login: alv2017 count: 22 avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 @@ -306,46 +286,50 @@ three_months_experts: count: 13 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 +- login: Kludex + count: 10 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 + url: https://github.com/Kludex - login: yauhen-sobaleu - count: 8 + count: 9 avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 url: https://github.com/yauhen-sobaleu - login: JavierSanchezCastro - count: 8 + count: 7 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro -- login: sehraramiz - count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 - url: https://github.com/sehraramiz - login: tiangolo - count: 4 + count: 6 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo -- login: yokwejuste - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 - url: https://github.com/yokwejuste +- login: sachinh35 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4 + url: https://github.com/sachinh35 - login: SobikXexe count: 3 avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4 url: https://github.com/SobikXexe -- login: PREPONDERANCE - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 - url: https://github.com/PREPONDERANCE -- login: nbx3 +- login: KianAnbarestani count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 - url: https://github.com/nbx3 -- login: marsboy02 + avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4 + url: https://github.com/KianAnbarestani +- login: sinisaos count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 - url: https://github.com/marsboy02 + avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 + url: https://github.com/sinisaos - login: Ale-Cas count: 2 avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 url: https://github.com/Ale-Cas +- login: adsouza + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/275832?v=4 + url: https://github.com/adsouza +- login: marsboy02 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 + url: https://github.com/marsboy02 - login: EverStarck count: 2 avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 @@ -354,67 +338,47 @@ three_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4 url: https://github.com/vtgn -- login: Trinkes - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/9466879?v=4 - url: https://github.com/Trinkes -- login: XiaoXinYo - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/56395004?u=1eebf5ce25a8067f7bfa6251a24f667be492d9d6&v=4 - url: https://github.com/XiaoXinYo -- login: iloveitaly - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/150855?v=4 - url: https://github.com/iloveitaly six_months_experts: -- login: YuriiMotov - count: 61 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 - url: https://github.com/YuriiMotov - login: luzzodev - count: 54 + count: 57 avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 url: https://github.com/luzzodev +- login: YuriiMotov + count: 56 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov - login: Kludex - count: 40 + count: 34 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex - login: alv2017 - count: 22 + count: 25 avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 url: https://github.com/alv2017 - login: jgould22 count: 17 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 -- login: JavierSanchezCastro - count: 13 - avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 - url: https://github.com/JavierSanchezCastro -- login: sinisaos - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 - url: https://github.com/sinisaos - login: sehraramiz count: 11 avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 url: https://github.com/sehraramiz -- login: Kfir-G - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 - url: https://github.com/Kfir-G +- login: JavierSanchezCastro + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 + url: https://github.com/JavierSanchezCastro - login: yauhen-sobaleu - count: 8 + count: 9 avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 url: https://github.com/yauhen-sobaleu -- login: yvallois - count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 - url: https://github.com/yvallois - login: estebanx64 count: 7 avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 url: https://github.com/estebanx64 +- login: yvallois + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 + url: https://github.com/yvallois - login: tiangolo count: 6 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 @@ -423,6 +387,10 @@ six_months_experts: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 url: https://github.com/yokwejuste +- login: sachinh35 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4 + url: https://github.com/sachinh35 - login: viniciusCalcantara count: 3 avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4 @@ -431,14 +399,30 @@ six_months_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4 url: https://github.com/SobikXexe -- login: pawelad - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/7062874?u=d27dc220545a8401ad21840590a97d474d7101e6&v=4 - url: https://github.com/pawelad -- login: dbfreem - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4 - url: https://github.com/dbfreem +- login: chaitanyarahalkar + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/24942959?u=d3fbbc622540cb50b956585d5aec5037e01e4b1f&v=4 + url: https://github.com/chaitanyarahalkar +- login: KianAnbarestani + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4 + url: https://github.com/KianAnbarestani +- login: sinisaos + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 + url: https://github.com/sinisaos +- login: Ale-Cas + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 + url: https://github.com/Ale-Cas +- login: adsouza + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/275832?v=4 + url: https://github.com/adsouza +- login: Synrom + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4 + url: https://github.com/Synrom - login: PREPONDERANCE count: 2 avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 @@ -451,18 +435,10 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 url: https://github.com/marsboy02 -- login: Ale-Cas - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 - url: https://github.com/Ale-Cas - login: EverStarck count: 2 avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 url: https://github.com/EverStarck -- login: n8sty - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 - url: https://github.com/n8sty - login: vtgn count: 2 avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4 @@ -491,10 +467,6 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/40732698?u=611f39d3c1d2f4207a590937a78c1f10eed6232c&v=4 url: https://github.com/gelezo43 -- login: 1001pepi - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/82064861?u=8c6ffdf2275d6970a07294752c545cd2702c57d3&v=4 - url: https://github.com/1001pepi - login: AliYmn count: 2 avatarUrl: https://avatars.githubusercontent.com/u/18416653?u=98c1fca46c7e4dabe8c39d17b5e55d1511d41cf9&v=4 @@ -503,85 +475,69 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4 url: https://github.com/RichieB2B -- login: Synrom - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4 - url: https://github.com/Synrom - login: iiotsrc count: 2 avatarUrl: https://avatars.githubusercontent.com/u/131771119?u=bcaf2559ef6266af70b151b7fda31a1ee3dbecb3&v=4 url: https://github.com/iiotsrc -- login: Isuxiz - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4 - url: https://github.com/Isuxiz -- login: Reemyos - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/44867003?v=4 - url: https://github.com/Reemyos -- login: deight93 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4 - url: https://github.com/deight93 -- login: Jkrox +- login: Kfir-G count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/83181939?u=d6a922d97129f7f3916d6a1c166bc011b3a72b7f&v=4 - url: https://github.com/Jkrox + avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 + url: https://github.com/Kfir-G one_year_experts: - login: YuriiMotov - count: 196 + count: 172 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: Kludex - count: 65 + count: 63 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4 url: https://github.com/Kludex - login: luzzodev - count: 54 + count: 61 avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4 url: https://github.com/luzzodev - login: sinisaos - count: 40 + count: 41 avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4 url: https://github.com/sinisaos - login: JavierSanchezCastro - count: 37 + count: 33 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: jgould22 - count: 32 + count: 27 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 +- login: alv2017 + count: 25 + avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 + url: https://github.com/alv2017 - login: tiangolo count: 24 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo -- login: alv2017 - count: 22 - avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4 - url: https://github.com/alv2017 -- login: n8sty - count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 - url: https://github.com/n8sty -- login: estebanx64 - count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 - url: https://github.com/estebanx64 - login: ceb10n count: 15 avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 url: https://github.com/ceb10n -- login: sehraramiz - count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 - url: https://github.com/sehraramiz +- login: estebanx64 + count: 13 + avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 + url: https://github.com/estebanx64 +- login: n8sty + count: 13 + avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 + url: https://github.com/n8sty - login: Kfir-G count: 13 avatarUrl: https://avatars.githubusercontent.com/u/57500876?u=0cd29db046a17f12f382d398141319fca7ff230a&v=4 url: https://github.com/Kfir-G +- login: sehraramiz + count: 11 + avatarUrl: https://avatars.githubusercontent.com/u/14166324?u=8fac65e84dfff24245d304a5b5b09f7b5bd69dc9&v=4 + url: https://github.com/sehraramiz - login: PhysicallyActive - count: 12 + count: 11 avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 url: https://github.com/PhysicallyActive - login: mattmess1221 @@ -589,7 +545,7 @@ one_year_experts: avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=d22ea18aa8ea688af25a45df306134d593621a44&v=4 url: https://github.com/mattmess1221 - login: yauhen-sobaleu - count: 8 + count: 9 avatarUrl: https://avatars.githubusercontent.com/u/51629535?u=fc1817060daf2df438bfca86c44f33da5cd667db&v=4 url: https://github.com/yauhen-sobaleu - login: AIdjis @@ -601,13 +557,9 @@ one_year_experts: avatarUrl: https://avatars.githubusercontent.com/u/36999744?v=4 url: https://github.com/yvallois - login: hasansezertasan - count: 7 + count: 5 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan -- login: PREPONDERANCE - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 - url: https://github.com/PREPONDERANCE - login: gustavosett count: 5 avatarUrl: https://avatars.githubusercontent.com/u/99373133?u=1382fe27034a0179f07cf989f63c4f23017f043c&v=4 @@ -616,10 +568,10 @@ one_year_experts: count: 5 avatarUrl: https://avatars.githubusercontent.com/u/32629225?u=3b7c30e8a09426a1b9284f6e8a0ae53a525596bf&v=4 url: https://github.com/chyok -- login: acidjunk +- login: PREPONDERANCE count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk + avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 + url: https://github.com/PREPONDERANCE - login: svlandeg count: 4 avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4 @@ -632,22 +584,18 @@ one_year_experts: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/71908316?u=592c1e42aa0ee5cb94890e0b863e2acc78cc3bbc&v=4 url: https://github.com/yokwejuste -- login: bertomaniac - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/10235051?u=14484a96833228a7b29fee4a7916d411c242c4f6&v=4 - url: https://github.com/bertomaniac - login: binbjz count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=40b777c625cf53dcdc6afc4aa127de67c48bf610&v=4 url: https://github.com/binbjz -- login: CharlesPerrotMinotHCHB +- login: dbfreem count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/112571330?u=a9628848d6096b491135727435a2a253152995a1&v=4 - url: https://github.com/CharlesPerrotMinotHCHB -- login: ryanisn + avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4 + url: https://github.com/dbfreem +- login: sachinh35 count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4 - url: https://github.com/ryanisn + avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4 + url: https://github.com/sachinh35 - login: viniciusCalcantara count: 3 avatarUrl: https://avatars.githubusercontent.com/u/108818737?u=3d7ffe5808843ee4372f9cc5a559ff1674cf1792&v=4 @@ -656,10 +604,6 @@ one_year_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/87701130?v=4 url: https://github.com/SobikXexe -- login: pythonweb2 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 - url: https://github.com/pythonweb2 - login: DeoLeung count: 3 avatarUrl: https://avatars.githubusercontent.com/u/3764720?u=4c222ef513814de4c7fb3736d0a7adf11d953d43&v=4 @@ -668,22 +612,18 @@ one_year_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/7062874?u=d27dc220545a8401ad21840590a97d474d7101e6&v=4 url: https://github.com/pawelad -- login: dbfreem - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/9778569?u=f2f1e9135b5e4f1b0c6821a548b17f97572720fc&v=4 - url: https://github.com/dbfreem - login: Isuxiz count: 3 avatarUrl: https://avatars.githubusercontent.com/u/48672727?u=34d7b4ade252687d22a27cf53037b735b244bfc1&v=4 url: https://github.com/Isuxiz +- login: bertomaniac + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/10235051?u=14484a96833228a7b29fee4a7916d411c242c4f6&v=4 + url: https://github.com/bertomaniac - login: deight93 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/37678115?u=a608798b5bd0034183a9c430ebb42fb266db86ce&v=4 url: https://github.com/deight93 -- login: mmzeynalli - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/33568903?u=19efd0c0722730b83a70b7c86c36e5b7d83e07d2&v=4 - url: https://github.com/mmzeynalli - login: Minibrams count: 3 avatarUrl: https://avatars.githubusercontent.com/u/8108085?u=b028dbc308fa8485e0e2e9402b3d03d8deb22bf9&v=4 @@ -692,6 +632,42 @@ one_year_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/8014288?u=69580504c51a0cdd756fc47b23bb7f404bd694e7&v=4 url: https://github.com/alexandercronin +- login: yanggeorge + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/2434407?v=4 + url: https://github.com/yanggeorge +- login: chaitanyarahalkar + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/24942959?u=d3fbbc622540cb50b956585d5aec5037e01e4b1f&v=4 + url: https://github.com/chaitanyarahalkar +- login: KianAnbarestani + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4 + url: https://github.com/KianAnbarestani +- login: rustonaut + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/7632017?u=652bb86c1399727082c929fd4666fd7fa65923b1&v=4 + url: https://github.com/rustonaut +- login: Ale-Cas + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 + url: https://github.com/Ale-Cas +- login: CharlesPerrotMinotHCHB + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/112571330?u=a9628848d6096b491135727435a2a253152995a1&v=4 + url: https://github.com/CharlesPerrotMinotHCHB +- login: adsouza + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/275832?v=4 + url: https://github.com/adsouza +- login: Synrom + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/30272537?v=4 + url: https://github.com/Synrom +- login: gaby + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/835733?u=8c72dec16fa560bdc81113354f2ffd79ad062bde&v=4 + url: https://github.com/gaby - login: nbx3 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/34649527?u=943812f69e0d40adbd3fa1c9b8ef50dd971a2a45&v=4 @@ -700,22 +676,10 @@ one_year_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/86903678?u=fa4a6b91eea3a11ae93c162616ca5edf51c68572&v=4 url: https://github.com/marsboy02 -- login: Ale-Cas - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/64859146?u=d52a6ecf8d83d2927e2ae270bdfcc83495dba8c9&v=4 - url: https://github.com/Ale-Cas -- login: patrick91 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/667029?u=e35958a75ac1f99c81b4bc99e22db8cd665ae7f0&v=4 - url: https://github.com/patrick91 - login: EverStarck count: 2 avatarUrl: https://avatars.githubusercontent.com/u/51029456?u=343409b7cb6b3ea6a59359f4e8370d9c3f140ecd&v=4 url: https://github.com/EverStarck -- login: rustonaut - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/7632017?u=652bb86c1399727082c929fd4666fd7fa65923b1&v=4 - url: https://github.com/rustonaut - login: Trolldemorted count: 2 avatarUrl: https://avatars.githubusercontent.com/u/10261186?v=4 @@ -728,10 +692,6 @@ one_year_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4 url: https://github.com/slafs -- login: Wyko - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/467094?v=4 - url: https://github.com/Wyko - login: ddahan count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1933516?u=1d200a620e8d6841df017e9f2bb7efb58b580f40&v=4 @@ -740,10 +700,6 @@ one_year_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/112889052?v=4 url: https://github.com/vtgn -- login: SDAravind - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/72403396?v=4 - url: https://github.com/SDAravind - login: redb0 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/30475117?v=4 From ea839df09e5f1271767b05ea659363ba3959ffcb Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 1 May 2025 14:43:04 +0000 Subject: [PATCH 066/138] =?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 30127af56..63bfa7029 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -31,6 +31,7 @@ hide: ### Internal +* 👥 Update FastAPI People - Experts. PR [#13671](https://github.com/fastapi/fastapi/pull/13671) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump typer from 0.12.5 to 0.15.3. PR [#13666](https://github.com/fastapi/fastapi/pull/13666) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump sqlmodel from 0.0.23 to 0.0.24. PR [#13665](https://github.com/fastapi/fastapi/pull/13665) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Update Sponsors: Zuplo logo and alt text. PR [#13645](https://github.com/fastapi/fastapi/pull/13645) by [@martyndavies](https://github.com/martyndavies). From 1d63896c3537266dd9c89278e87b0c78d76435ae Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 10:23:09 +0200 Subject: [PATCH 067/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13688)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.7 → v0.11.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.7...v0.11.8) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b1429a562..2a688e2b4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.7 + rev: v0.11.8 hooks: - id: ruff args: From 9a33ba46ac3a3ef0b845c8515822f4e13c0fb443 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 6 May 2025 08:23:30 +0000 Subject: [PATCH 068/138] =?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 63bfa7029..a0a7520d1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -31,6 +31,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13688](https://github.com/fastapi/fastapi/pull/13688) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 👥 Update FastAPI People - Experts. PR [#13671](https://github.com/fastapi/fastapi/pull/13671) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump typer from 0.12.5 to 0.15.3. PR [#13666](https://github.com/fastapi/fastapi/pull/13666) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump sqlmodel from 0.0.23 to 0.0.24. PR [#13665](https://github.com/fastapi/fastapi/pull/13665) by [@dependabot[bot]](https://github.com/apps/dependabot). From f61fe35178d0ea00067da0cbdab058d3c8b87a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 9 May 2025 15:48:50 +0200 Subject: [PATCH 069/138] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20rem?= =?UTF-8?q?ove=20deepset=20/=20Haystack=20(#13700)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - docs/en/data/sponsors.yml | 3 --- 2 files changed, 4 deletions(-) diff --git a/README.md b/README.md index 40d0cdf6c..b834654b1 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,6 @@ The key features are: - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index f42f67ada..5e714b2c5 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -30,9 +30,6 @@ gold: title: Cut Code Review Time & Bugs in Half with CodeRabbit img: https://fastapi.tiangolo.com/img/sponsors/coderabbit.png silver: - - url: https://github.com/deepset-ai/haystack/ - title: Build powerful search from composable, open source building blocks - img: https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg - url: https://databento.com/ title: Pay as you go for market data img: https://fastapi.tiangolo.com/img/sponsors/databento.svg From acbf27c97175d6ca7e7fbb71778ff2431041c7de Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 9 May 2025 13:49:14 +0000 Subject: [PATCH 070/138] =?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 a0a7520d1..bcfe5cefa 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -31,6 +31,7 @@ hide: ### Internal +* 🔧 Update sponsors: remove deepset / Haystack. PR [#13700](https://github.com/fastapi/fastapi/pull/13700) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13688](https://github.com/fastapi/fastapi/pull/13688) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 👥 Update FastAPI People - Experts. PR [#13671](https://github.com/fastapi/fastapi/pull/13671) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump typer from 0.12.5 to 0.15.3. PR [#13666](https://github.com/fastapi/fastapi/pull/13666) by [@dependabot[bot]](https://github.com/apps/dependabot). From a9a2782f951eaaeb42123d54b14f4db05d1c332b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Fri, 9 May 2025 18:36:42 +0200 Subject: [PATCH 071/138] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20add?= =?UTF-8?q?=20Subtotal=20(#13701)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- README.md | 1 + docs/en/data/sponsors.yml | 3 + docs/en/docs/img/sponsors/subtotal-banner.svg | 133 ++++++++++++++++++ docs/en/docs/img/sponsors/subtotal.svg | 31 ++++ docs/en/overrides/main.html | 6 + 5 files changed, 174 insertions(+) create mode 100644 docs/en/docs/img/sponsors/subtotal-banner.svg create mode 100644 docs/en/docs/img/sponsors/subtotal.svg diff --git a/README.md b/README.md index b834654b1..d668babbb 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 5e714b2c5..a46fd03f5 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -29,6 +29,9 @@ gold: - url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi title: Cut Code Review Time & Bugs in Half with CodeRabbit img: https://fastapi.tiangolo.com/img/sponsors/coderabbit.png + - url: https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source + title: The Gold Standard in Retail Account Linking + img: https://fastapi.tiangolo.com/img/sponsors/subtotal.svg silver: - url: https://databento.com/ title: Pay as you go for market data diff --git a/docs/en/docs/img/sponsors/subtotal-banner.svg b/docs/en/docs/img/sponsors/subtotal-banner.svg new file mode 100644 index 000000000..3d6c98dfc --- /dev/null +++ b/docs/en/docs/img/sponsors/subtotal-banner.svg @@ -0,0 +1,133 @@ + + + + + sponsorship-banner + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/en/docs/img/sponsors/subtotal.svg b/docs/en/docs/img/sponsors/subtotal.svg new file mode 100644 index 000000000..b944c1b2c --- /dev/null +++ b/docs/en/docs/img/sponsors/subtotal.svg @@ -0,0 +1,31 @@ + + + sponsorship-badge + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index b81003808..9d985ea87 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -86,6 +86,12 @@
+
{% endblock %} From f3bfa3b8a510a6e7aa7f212dfddee50f7a948883 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 9 May 2025 16:37:03 +0000 Subject: [PATCH 072/138] =?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 bcfe5cefa..0a1293e9f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -31,6 +31,7 @@ hide: ### Internal +* 🔧 Update sponsors: add Subtotal. PR [#13701](https://github.com/fastapi/fastapi/pull/13701) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove deepset / Haystack. PR [#13700](https://github.com/fastapi/fastapi/pull/13700) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13688](https://github.com/fastapi/fastapi/pull/13688) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 👥 Update FastAPI People - Experts. PR [#13671](https://github.com/fastapi/fastapi/pull/13671) by [@tiangolo](https://github.com/tiangolo). From 214e0740c8cea64858285b02defac2d8ae071f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 11 May 2025 15:37:26 +0200 Subject: [PATCH 073/138] =?UTF-8?q?=F0=9F=8D=B1=20Update=20Drawio=20diagra?= =?UTF-8?q?ms=20SVGs,=20single=20file=20per=20diagram,=20sans-serif=20font?= =?UTF-8?q?=20(#13706)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/de/docs/deployment/concepts.md | 2 +- docs/de/docs/deployment/https.md | 18 +- docs/de/docs/tutorial/bigger-applications.md | 4 +- docs/em/docs/deployment/concepts.md | 2 +- docs/em/docs/deployment/https.md | 18 +- docs/em/docs/tutorial/bigger-applications.md | 4 +- docs/en/docs/deployment/concepts.md | 2 +- docs/en/docs/deployment/https.md | 18 +- .../deployment/concepts/process-ram.drawio | 106 -- .../concepts/process-ram.drawio.svg | 297 ++++++ .../img/deployment/concepts/process-ram.svg | 59 -- .../en/docs/img/deployment/https/https.drawio | 277 ------ .../img/deployment/https/https.drawio.svg | 907 ++++++++++++++++++ docs/en/docs/img/deployment/https/https.svg | 62 -- .../docs/img/deployment/https/https01.drawio | 78 -- .../img/deployment/https/https01.drawio.svg | 131 +++ docs/en/docs/img/deployment/https/https01.svg | 57 -- .../docs/img/deployment/https/https02.drawio | 110 --- .../img/deployment/https/https02.drawio.svg | 245 +++++ docs/en/docs/img/deployment/https/https02.svg | 57 -- .../docs/img/deployment/https/https03.drawio | 131 --- .../img/deployment/https/https03.drawio.svg | 715 ++++++++++++++ docs/en/docs/img/deployment/https/https03.svg | 62 -- .../docs/img/deployment/https/https04.drawio | 152 --- .../img/deployment/https/https04.drawio.svg | 419 ++++++++ docs/en/docs/img/deployment/https/https04.svg | 62 -- .../docs/img/deployment/https/https05.drawio | 166 ---- .../img/deployment/https/https05.drawio.svg | 641 +++++++++++++ docs/en/docs/img/deployment/https/https05.svg | 62 -- .../docs/img/deployment/https/https06.drawio | 183 ---- .../img/deployment/https/https06.drawio.svg | 673 +++++++++++++ docs/en/docs/img/deployment/https/https06.svg | 62 -- .../docs/img/deployment/https/https07.drawio | 203 ---- .../img/deployment/https/https07.drawio.svg | 540 +++++++++++ docs/en/docs/img/deployment/https/https07.svg | 62 -- .../docs/img/deployment/https/https08.drawio | 217 ----- .../img/deployment/https/https08.drawio.svg | 625 ++++++++++++ docs/en/docs/img/deployment/https/https08.svg | 62 -- .../bigger-applications/package.drawio | 43 - .../bigger-applications/package.drawio.svg | 420 ++++++++ .../tutorial/bigger-applications/package.svg | 1 - docs/en/docs/tutorial/bigger-applications.md | 4 +- docs/es/docs/deployment/concepts.md | 2 +- docs/es/docs/deployment/https.md | 18 +- docs/es/docs/tutorial/bigger-applications.md | 4 +- docs/ja/docs/deployment/concepts.md | 2 +- docs/ja/docs/deployment/https.md | 18 +- docs/pt/docs/deployment/concepts.md | 2 +- docs/pt/docs/deployment/https.md | 18 +- docs/pt/docs/tutorial/bigger-applications.md | 4 +- docs/ru/docs/deployment/concepts.md | 2 +- docs/ru/docs/deployment/https.md | 18 +- docs/ru/docs/tutorial/bigger-applications.md | 4 +- docs/zh/docs/deployment/concepts.md | 2 +- docs/zh/docs/deployment/https.md | 18 +- docs/zh/docs/tutorial/bigger-applications.md | 4 +- 56 files changed, 5707 insertions(+), 2368 deletions(-) delete mode 100644 docs/en/docs/img/deployment/concepts/process-ram.drawio create mode 100644 docs/en/docs/img/deployment/concepts/process-ram.drawio.svg delete mode 100644 docs/en/docs/img/deployment/concepts/process-ram.svg delete mode 100644 docs/en/docs/img/deployment/https/https.drawio create mode 100644 docs/en/docs/img/deployment/https/https.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https.svg delete mode 100644 docs/en/docs/img/deployment/https/https01.drawio create mode 100644 docs/en/docs/img/deployment/https/https01.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https01.svg delete mode 100644 docs/en/docs/img/deployment/https/https02.drawio create mode 100644 docs/en/docs/img/deployment/https/https02.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https02.svg delete mode 100644 docs/en/docs/img/deployment/https/https03.drawio create mode 100644 docs/en/docs/img/deployment/https/https03.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https03.svg delete mode 100644 docs/en/docs/img/deployment/https/https04.drawio create mode 100644 docs/en/docs/img/deployment/https/https04.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https04.svg delete mode 100644 docs/en/docs/img/deployment/https/https05.drawio create mode 100644 docs/en/docs/img/deployment/https/https05.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https05.svg delete mode 100644 docs/en/docs/img/deployment/https/https06.drawio create mode 100644 docs/en/docs/img/deployment/https/https06.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https06.svg delete mode 100644 docs/en/docs/img/deployment/https/https07.drawio create mode 100644 docs/en/docs/img/deployment/https/https07.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https07.svg delete mode 100644 docs/en/docs/img/deployment/https/https08.drawio create mode 100644 docs/en/docs/img/deployment/https/https08.drawio.svg delete mode 100644 docs/en/docs/img/deployment/https/https08.svg delete mode 100644 docs/en/docs/img/tutorial/bigger-applications/package.drawio create mode 100644 docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg delete mode 100644 docs/en/docs/img/tutorial/bigger-applications/package.svg diff --git a/docs/de/docs/deployment/concepts.md b/docs/de/docs/deployment/concepts.md index 97ad854e2..907598e54 100644 --- a/docs/de/docs/deployment/concepts.md +++ b/docs/de/docs/deployment/concepts.md @@ -216,7 +216,7 @@ Dieser Manager-Prozess wäre wahrscheinlich derjenige, welcher der IP am **Port* Diese Workerprozesse würden Ihre Anwendung ausführen, sie würden die Hauptberechnungen durchführen, um einen **Request** entgegenzunehmen und eine **Response** zurückzugeben, und sie würden alles, was Sie in Variablen einfügen, in den RAM laden. - + Und natürlich würden auf derselben Maschine neben Ihrer Anwendung wahrscheinlich auch **andere Prozesse** laufen. diff --git a/docs/de/docs/deployment/https.md b/docs/de/docs/deployment/https.md index 630582995..a216f44af 100644 --- a/docs/de/docs/deployment/https.md +++ b/docs/de/docs/deployment/https.md @@ -85,7 +85,7 @@ Zuerst würde der Browser mithilfe der **DNS-Server** herausfinden, welches die Die DNS-Server geben dem Browser eine bestimmte **IP-Adresse** zurück. Das wäre die von Ihrem Server verwendete öffentliche IP-Adresse, die Sie in den DNS-Servern konfiguriert haben. - + ### TLS-Handshake-Start @@ -93,7 +93,7 @@ Der Browser kommuniziert dann mit dieser IP-Adresse über **Port 443** (den HTTP Der erste Teil der Kommunikation besteht lediglich darin, die Verbindung zwischen dem Client und dem Server herzustellen und die zu verwendenden kryptografischen Schlüssel usw. zu vereinbaren. - + Diese Interaktion zwischen dem Client und dem Server zum Aufbau der TLS-Verbindung wird als **TLS-Handshake** bezeichnet. @@ -111,7 +111,7 @@ Mithilfe der oben beschriebenen **SNI-Erweiterung** würde der TLS-Terminierungs In diesem Fall würde er das Zertifikat für `someapp.example.com` verwenden. - + Der Client **vertraut** bereits der Entität, die das TLS-Zertifikat generiert hat (in diesem Fall Let's Encrypt, aber wir werden später mehr darüber erfahren), sodass er **verifizieren** kann, dass das Zertifikat gültig ist. @@ -133,19 +133,19 @@ Da Client und Server (sprich, der Browser und der TLS-Terminierungsproxy) nun ü Der Client sendet also einen **HTTPS-Request**. Das ist einfach ein HTTP-Request über eine verschlüsselte TLS-Verbindung. - + ### Den Request entschlüsseln Der TLS-Terminierungsproxy würde die vereinbarte Verschlüsselung zum **Entschlüsseln des Requests** verwenden und den **einfachen (entschlüsselten) HTTP-Request** an den Prozess weiterleiten, der die Anwendung ausführt (z. B. einen Prozess, bei dem Uvicorn die FastAPI-Anwendung ausführt). - + ### HTTP-Response Die Anwendung würde den Request verarbeiten und eine **einfache (unverschlüsselte) HTTP-Response** an den TLS-Terminierungsproxy senden. - + ### HTTPS-Response @@ -153,7 +153,7 @@ Der TLS-Terminierungsproxy würde dann die Response mithilfe der zuvor vereinbar Als Nächstes überprüft der Browser, ob die Response gültig und mit dem richtigen kryptografischen Schlüssel usw. verschlüsselt ist. Anschließend **entschlüsselt er die Response** und verarbeitet sie. - + Der Client (Browser) weiß, dass die Response vom richtigen Server kommt, da dieser die Kryptografie verwendet, die zuvor mit dem **HTTPS-Zertifikat** vereinbart wurde. @@ -163,7 +163,7 @@ Auf demselben Server (oder denselben Servern) könnten sich **mehrere Anwendunge Nur ein Prozess kann diese spezifische IP und den Port verarbeiten (in unserem Beispiel der TLS-Terminierungsproxy), aber die anderen Anwendungen/Prozesse können auch auf dem/den Server(n) ausgeführt werden, solange sie nicht versuchen, dieselbe **Kombination aus öffentlicher IP und Port** zu verwenden. - + Auf diese Weise könnte der TLS-Terminierungsproxy HTTPS und Zertifikate für **mehrere Domains**, für mehrere Anwendungen, verarbeiten und die Requests dann jeweils an die richtige Anwendung weiterleiten. @@ -173,7 +173,7 @@ Irgendwann in der Zukunft würde jedes Zertifikat **ablaufen** (etwa 3 Monate na Und dann gäbe es ein anderes Programm (in manchen Fällen ist es ein anderes Programm, in manchen Fällen ist es derselbe TLS-Terminierungsproxy), das mit Let's Encrypt kommuniziert und das/die Zertifikat(e) erneuert. - + Die **TLS-Zertifikate** sind **einem Domainnamen zugeordnet**, nicht einer IP-Adresse. diff --git a/docs/de/docs/tutorial/bigger-applications.md b/docs/de/docs/tutorial/bigger-applications.md index 59e91bdcc..514e3fd3a 100644 --- a/docs/de/docs/tutorial/bigger-applications.md +++ b/docs/de/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * Es gibt auch ein Unterverzeichnis `app/internal/` mit einer weiteren Datei `__init__.py`, es handelt sich also um ein weiteres „Python-Subpackage“: `app.internal`. * Und die Datei `app/internal/admin.py` ist ein weiteres Submodul: `app.internal.admin`. - + Die gleiche Dateistruktur mit Kommentaren: @@ -270,7 +270,7 @@ Aber diese Datei existiert nicht, unsere Abhängigkeiten befinden sich in einer Erinnern Sie sich, wie unsere Anwendungs-/Dateistruktur aussieht: - + --- diff --git a/docs/em/docs/deployment/concepts.md b/docs/em/docs/deployment/concepts.md index 019703296..bbb017277 100644 --- a/docs/em/docs/deployment/concepts.md +++ b/docs/em/docs/deployment/concepts.md @@ -216,7 +216,7 @@ 👈 👨‍🏭 🛠️ 🔜 🕐 🏃‍♂ 👆 🈸, 👫 🔜 🎭 👑 📊 📨 **📨** & 📨 **📨**, & 👫 🔜 📐 🕳 👆 🚮 🔢 💾. - + & ↗️, 🎏 🎰 🔜 🎲 ✔️ **🎏 🛠️** 🏃 👍, ↖️ ⚪️➡️ 👆 🈸. diff --git a/docs/em/docs/deployment/https.md b/docs/em/docs/deployment/https.md index 31cf99001..6d2641a92 100644 --- a/docs/em/docs/deployment/https.md +++ b/docs/em/docs/deployment/https.md @@ -85,7 +85,7 @@ 🏓 💽 🔜 💬 🖥 ⚙️ 🎯 **📢 📢**. 👈 🔜 📢 📢 📢 ⚙️ 👆 💽, 👈 👆 🔗 🏓 💽. - + ### 🤝 🤝 ▶️ @@ -93,7 +93,7 @@ 🥇 🍕 📻 🛠️ 🔗 🖖 👩‍💻 & 💽 & 💭 🔐 🔑 👫 🔜 ⚙️, ♒️. - + 👉 🔗 🖖 👩‍💻 & 💽 🛠️ 🤝 🔗 🤙 **🤝 🤝**. @@ -111,7 +111,7 @@ 👉 💼, ⚫️ 🔜 ⚙️ 📄 `someapp.example.com`. - + 👩‍💻 ⏪ **💙** 👨‍💼 👈 🏗 👈 🤝 📄 (👉 💼 ➡️ 🗜, ✋️ 👥 🔜 👀 🔃 👈 ⏪), ⚫️ 💪 **✔** 👈 📄 ☑. @@ -133,19 +133,19 @@ , 👩‍💻 📨 **🇺🇸🔍 📨**. 👉 🇺🇸🔍 📨 🔘 🗜 🤝 🔗. - + ### 🗜 📨 🤝 ❎ 🗳 🔜 ⚙️ 🔐 ✔ **🗜 📨**, & 🔜 📶 **✅ (🗜) 🇺🇸🔍 📨** 🛠️ 🏃 🈸 (🖼 🛠️ ⏮️ Uvicorn 🏃‍♂ FastAPI 🈸). - + ### 🇺🇸🔍 📨 🈸 🔜 🛠️ 📨 & 📨 **✅ (💽) 🇺🇸🔍 📨** 🤝 ❎ 🗳. - + ### 🇺🇸🔍 📨 @@ -153,7 +153,7 @@ ⏭, 🖥 🔜 ✔ 👈 📨 ☑ & 🗜 ⏮️ ▶️️ 🔐 🔑, ♒️. ⚫️ 🔜 ⤴️ **🗜 📨** & 🛠️ ⚫️. - + 👩‍💻 (🖥) 🔜 💭 👈 📨 👟 ⚪️➡️ ☑ 💽 ↩️ ⚫️ ⚙️ ⚛ 👫 ✔ ⚙️ **🇺🇸🔍 📄** ⏭. @@ -163,7 +163,7 @@ 🕴 1️⃣ 🛠️ 💪 🚚 🎯 📢 & ⛴ (🤝 ❎ 🗳 👆 🖼) ✋️ 🎏 🈸/🛠️ 💪 🏃 🔛 💽(Ⓜ) 💁‍♂️, 📏 👫 🚫 🔄 ⚙️ 🎏 **🌀 📢 📢 & ⛴**. - + 👈 🌌, 🤝 ❎ 🗳 💪 🍵 🇺🇸🔍 & 📄 **💗 🆔**, 💗 🈸, & ⤴️ 📶 📨 ▶️️ 🈸 🔠 💼. @@ -173,7 +173,7 @@ & ⤴️, 📤 🔜 ➕1️⃣ 📋 (💼 ⚫️ ➕1️⃣ 📋, 💼 ⚫️ 💪 🎏 🤝 ❎ 🗳) 👈 🔜 💬 ➡️ 🗜, & ♻ 📄(Ⓜ). - + **🤝 📄** **🔗 ⏮️ 🆔 📛**, 🚫 ⏮️ 📢 📢. diff --git a/docs/em/docs/tutorial/bigger-applications.md b/docs/em/docs/tutorial/bigger-applications.md index 68f506f27..78a321ae6 100644 --- a/docs/em/docs/tutorial/bigger-applications.md +++ b/docs/em/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * 📤 📁 `app/internal/` ⏮️ ➕1️⃣ 📁 `__init__.py`, ⚫️ ➕1️⃣ "🐍 📦": `app.internal`. * & 📁 `app/internal/admin.py` ➕1️⃣ 🔁: `app.internal.admin`. - + 🎏 📁 📊 ⏮️ 🏤: @@ -244,7 +244,7 @@ from .dependencies import get_token_header 💭 ❔ 👆 📱/📁 📊 👀 💖: - + --- diff --git a/docs/en/docs/deployment/concepts.md b/docs/en/docs/deployment/concepts.md index ed13bc28d..ed635a920 100644 --- a/docs/en/docs/deployment/concepts.md +++ b/docs/en/docs/deployment/concepts.md @@ -216,7 +216,7 @@ This Manager Process would probably be the one listening on the **port** in the Those worker processes would be the ones running your application, they would perform the main computations to receive a **request** and return a **response**, and they would load anything you put in variables in RAM. - + And of course, the same machine would probably have **other processes** running as well, apart from your application. diff --git a/docs/en/docs/deployment/https.md b/docs/en/docs/deployment/https.md index 46eda791e..8b4a08dbe 100644 --- a/docs/en/docs/deployment/https.md +++ b/docs/en/docs/deployment/https.md @@ -85,7 +85,7 @@ First, the browser would check with the **DNS servers** what is the **IP for the The DNS servers would tell the browser to use some specific **IP address**. That would be the public IP address used by your server, that you configured in the DNS servers. - + ### TLS Handshake Start @@ -93,7 +93,7 @@ The browser would then communicate with that IP address on **port 443** (the HTT The first part of the communication is just to establish the connection between the client and the server and to decide the cryptographic keys they will use, etc. - + This interaction between the client and the server to establish the TLS connection is called the **TLS handshake**. @@ -111,7 +111,7 @@ Using the **SNI extension** discussed above, the TLS Termination Proxy would che In this case, it would use the certificate for `someapp.example.com`. - + The client already **trusts** the entity that generated that TLS certificate (in this case Let's Encrypt, but we'll see about that later), so it can **verify** that the certificate is valid. @@ -133,19 +133,19 @@ Now that the client and server (specifically the browser and the TLS Termination So, the client sends an **HTTPS request**. This is just an HTTP request through an encrypted TLS connection. - + ### Decrypt the Request The TLS Termination Proxy would use the encryption agreed to **decrypt the request**, and would transmit the **plain (decrypted) HTTP request** to the process running the application (for example a process with Uvicorn running the FastAPI application). - + ### HTTP Response The application would process the request and send a **plain (unencrypted) HTTP response** to the TLS Termination Proxy. - + ### HTTPS Response @@ -153,7 +153,7 @@ The TLS Termination Proxy would then **encrypt the response** using the cryptogr Next, the browser would verify that the response is valid and encrypted with the right cryptographic key, etc. It would then **decrypt the response** and process it. - + The client (browser) will know that the response comes from the correct server because it is using the cryptography they agreed using the **HTTPS certificate** before. @@ -163,7 +163,7 @@ In the same server (or servers), there could be **multiple applications**, for e Only one process can be handling the specific IP and port (the TLS Termination Proxy in our example) but the other applications/processes can be running on the server(s) too, as long as they don't try to use the same **combination of public IP and port**. - + That way, the TLS Termination Proxy could handle HTTPS and certificates for **multiple domains**, for multiple applications, and then transmit the requests to the right application in each case. @@ -173,7 +173,7 @@ At some point in the future, each certificate would **expire** (about 3 months a And then, there would be another program (in some cases it's another program, in some cases it could be the same TLS Termination Proxy) that would talk to Let's Encrypt, and renew the certificate(s). - + The **TLS certificates** are **associated with a domain name**, not with an IP address. diff --git a/docs/en/docs/img/deployment/concepts/process-ram.drawio b/docs/en/docs/img/deployment/concepts/process-ram.drawio deleted file mode 100644 index b29c8a342..000000000 --- a/docs/en/docs/img/deployment/concepts/process-ram.drawio +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg b/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg new file mode 100644 index 000000000..a6a5c81d0 --- /dev/null +++ b/docs/en/docs/img/deployment/concepts/process-ram.drawio.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + + +
+
+
+ + + Server + + +
+
+
+
+ + Server + +
+
+
+ + + + + + + + + + +
+
+
+ + + RAM + +
+
+
+
+
+
+ + RAM + +
+
+
+ + + + + + + + + + +
+
+
+ + + CPU + +
+
+
+
+
+
+ + CPU + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + Process + + + + Manager + + +
+
+
+
+ + Process Manager + +
+
+
+ + + + + + + + + + +
+
+
+ + + Worker Process + + +
+
+
+
+ + Worker Process + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + Worker Process + + +
+
+
+
+ + Worker Process + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + Another Process + + +
+
+
+
+ + Another Process + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + 1 GB + +
+
+
+
+ + 1 GB + +
+
+
+ + + + + + + +
+
+
+ + 1 GB + +
+
+
+
+ + 1 GB + +
+
+
+ + + + + + +
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/concepts/process-ram.svg b/docs/en/docs/img/deployment/concepts/process-ram.svg deleted file mode 100644 index c1bf0d589..000000000 --- a/docs/en/docs/img/deployment/concepts/process-ram.svg +++ /dev/null @@ -1,59 +0,0 @@ -
Server
Server
RAM
RAM -
CPU
CPU -
Process Manager
Process Manager
Worker Process
Worker Process
Worker Process
Worker Process
Another Process
Another Process
1 GB
1 GB
1 GB
1 GB
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https.drawio b/docs/en/docs/img/deployment/https/https.drawio deleted file mode 100644 index c4c8a3628..000000000 --- a/docs/en/docs/img/deployment/https/https.drawio +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https.drawio.svg b/docs/en/docs/img/deployment/https/https.drawio.svg new file mode 100644 index 000000000..c2a65b69f --- /dev/null +++ b/docs/en/docs/img/deployment/https/https.drawio.svg @@ -0,0 +1,907 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + Cert Renovation Program + +
+
+
+
+ + Cert Renovation Program + +
+
+
+ + + + + + + + + + + +
+
+
+ + Let's Encrypt + +
+
+
+
+ + Let's Encrypt + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Another app + + + : another.example.com + + +
+
+
+
+ + Another app: another.example.com + +
+
+
+ + + + + + + +
+
+
+ + + One more app + + + : onemore.example.com + + +
+
+
+
+ + One more app: onemore.example.com + +
+
+
+ + + + + + + +
+
+
+ + + A Database + + +
+
+
+
+ + A Database + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + Plain response from: someapp.example.com + + +
+
+
+
+ + Plain response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + + Renew HTTPS cert for: someapp.example.com + + +
+
+
+
+ + Renew HTTPS cert for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + New HTTPS cert for: someapp.example.com + + +
+
+
+
+ + New HTTPS cert for: someapp.example.com + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + +
+
+
+ + + Encrypted response from: someapp.example.com + + +
+
+
+
+ + Encrypted response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https.svg b/docs/en/docs/img/deployment/https/https.svg deleted file mode 100644 index 69497518a..000000000 --- a/docs/en/docs/img/deployment/https/https.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
Cert Renovation Program
Cert Renovation Program
Let's Encrypt
Let's Encrypt
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Another app: another.example.com
Another app: another.example.com
One more app: onemore.example.com
One more app: onemore.example.com
A Database
A Database
Plain response from: someapp.example.com
Plain response from: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
Renew HTTPS cert for: someapp.example.com
Renew HTTPS cert for: someapp.example.com
New HTTPS cert for: someapp.example.com
New HTTPS cert for: someapp.example.com
TLS Handshake
TLS Handshake
Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https01.drawio b/docs/en/docs/img/deployment/https/https01.drawio deleted file mode 100644 index 181582f9b..000000000 --- a/docs/en/docs/img/deployment/https/https01.drawio +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https01.drawio.svg b/docs/en/docs/img/deployment/https/https01.drawio.svg new file mode 100644 index 000000000..ea128daf8 --- /dev/null +++ b/docs/en/docs/img/deployment/https/https01.drawio.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https01.svg b/docs/en/docs/img/deployment/https/https01.svg deleted file mode 100644 index 2edbd0623..000000000 --- a/docs/en/docs/img/deployment/https/https01.svg +++ /dev/null @@ -1,57 +0,0 @@ -
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https02.drawio b/docs/en/docs/img/deployment/https/https02.drawio deleted file mode 100644 index 650c06d1e..000000000 --- a/docs/en/docs/img/deployment/https/https02.drawio +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https02.drawio.svg b/docs/en/docs/img/deployment/https/https02.drawio.svg new file mode 100644 index 000000000..c29d59356 --- /dev/null +++ b/docs/en/docs/img/deployment/https/https02.drawio.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https02.svg b/docs/en/docs/img/deployment/https/https02.svg deleted file mode 100644 index e16b7e94a..000000000 --- a/docs/en/docs/img/deployment/https/https02.svg +++ /dev/null @@ -1,57 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
Port 443 (HTTPS)
Port 443 (HTTPS)
IP:
123.124.125.126
IP:...
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https03.drawio b/docs/en/docs/img/deployment/https/https03.drawio deleted file mode 100644 index c178fd363..000000000 --- a/docs/en/docs/img/deployment/https/https03.drawio +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https03.drawio.svg b/docs/en/docs/img/deployment/https/https03.drawio.svg new file mode 100644 index 000000000..6971e4c9c --- /dev/null +++ b/docs/en/docs/img/deployment/https/https03.drawio.svg @@ -0,0 +1,715 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https03.svg b/docs/en/docs/img/deployment/https/https03.svg deleted file mode 100644 index 2badd1c7d..000000000 --- a/docs/en/docs/img/deployment/https/https03.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
Port 443 (HTTPS)
Port 443 (HTTPS)
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https04.drawio b/docs/en/docs/img/deployment/https/https04.drawio deleted file mode 100644 index 78a6e919a..000000000 --- a/docs/en/docs/img/deployment/https/https04.drawio +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https04.drawio.svg b/docs/en/docs/img/deployment/https/https04.drawio.svg new file mode 100644 index 000000000..7e32bcdfe --- /dev/null +++ b/docs/en/docs/img/deployment/https/https04.drawio.svg @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https04.svg b/docs/en/docs/img/deployment/https/https04.svg deleted file mode 100644 index 4513ac76b..000000000 --- a/docs/en/docs/img/deployment/https/https04.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https05.drawio b/docs/en/docs/img/deployment/https/https05.drawio deleted file mode 100644 index 236ecd841..000000000 --- a/docs/en/docs/img/deployment/https/https05.drawio +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https05.drawio.svg b/docs/en/docs/img/deployment/https/https05.drawio.svg new file mode 100644 index 000000000..fed2fad16 --- /dev/null +++ b/docs/en/docs/img/deployment/https/https05.drawio.svg @@ -0,0 +1,641 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https05.svg b/docs/en/docs/img/deployment/https/https05.svg deleted file mode 100644 index ddcd2760a..000000000 --- a/docs/en/docs/img/deployment/https/https05.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https06.drawio b/docs/en/docs/img/deployment/https/https06.drawio deleted file mode 100644 index 9dec13184..000000000 --- a/docs/en/docs/img/deployment/https/https06.drawio +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https06.drawio.svg b/docs/en/docs/img/deployment/https/https06.drawio.svg new file mode 100644 index 000000000..e0bd9bc6e --- /dev/null +++ b/docs/en/docs/img/deployment/https/https06.drawio.svg @@ -0,0 +1,673 @@ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Plain response from: someapp.example.com + + +
+
+
+
+ + Plain response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https06.svg b/docs/en/docs/img/deployment/https/https06.svg deleted file mode 100644 index 3695de40c..000000000 --- a/docs/en/docs/img/deployment/https/https06.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Plain response from: someapp.example.com
Plain response from: someapp.example.com
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https07.drawio b/docs/en/docs/img/deployment/https/https07.drawio deleted file mode 100644 index aa8f4d6be..000000000 --- a/docs/en/docs/img/deployment/https/https07.drawio +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https07.drawio.svg b/docs/en/docs/img/deployment/https/https07.drawio.svg new file mode 100644 index 000000000..b74b33807 --- /dev/null +++ b/docs/en/docs/img/deployment/https/https07.drawio.svg @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Plain response from: someapp.example.com + + +
+
+
+
+ + Plain response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + +
+
+
+ + + Encrypted response from: someapp.example.com + + +
+
+
+
+ + Encrypted response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https07.svg b/docs/en/docs/img/deployment/https/https07.svg deleted file mode 100644 index 551354cef..000000000 --- a/docs/en/docs/img/deployment/https/https07.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Plain response from: someapp.example.com
Plain response from: someapp.example.com
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/deployment/https/https08.drawio b/docs/en/docs/img/deployment/https/https08.drawio deleted file mode 100644 index 794b192df..000000000 --- a/docs/en/docs/img/deployment/https/https08.drawio +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/deployment/https/https08.drawio.svg b/docs/en/docs/img/deployment/https/https08.drawio.svg new file mode 100644 index 000000000..8fc0b31ec --- /dev/null +++ b/docs/en/docs/img/deployment/https/https08.drawio.svg @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + +
+
+
+ + + Server(s) + + +
+
+
+
+ + Server(s) + +
+
+
+ + + + + + + + + + + +
+
+
+ + DNS Servers + +
+
+
+
+ + DNS Servers + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Termination Proxy + +
+
+
+
+
+
+ + TLS Termination Proxy + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + + FastAPI + + + app for: someapp.example.com + + +
+
+
+
+ + FastAPI app for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Another app + + + : another.example.com + + +
+
+
+
+ + Another app: another.example.com + +
+
+
+ + + + + + + +
+
+
+ + + One more app + + + : onemore.example.com + + +
+
+
+
+ + One more app: onemore.example.com + +
+
+
+ + + + + + + +
+
+
+ + + A Database + + +
+
+
+
+ + A Database + +
+
+
+ + + + + + + +
+
+
+ + + Plain response from: someapp.example.com + + +
+
+
+
+ + Plain response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Decrypted request for: someapp.example.com + + +
+
+
+
+ + Decrypted request for: someapp.example.com + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ + Port 443 (HTTPS) + +
+
+
+
+ + Port 443 (HTTPS) + +
+
+
+ + + + + + + + + + + + + + +
+
+
+ + + Encrypted request for: someapp.example.com + + +
+
+
+
+ + Encrypted request for: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + Who is: someapp.example.com + + +
+
+
+
+ + Who is: someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + + + + +
+
+
+ + + TLS Handshake + + +
+
+
+
+ + TLS Handshake + +
+
+
+ + + + + + + + + + +
+
+
+ + + Encrypted response from: someapp.example.com + + +
+
+
+
+ + Encrypted response from: someapp.example.com + +
+
+
+ + + + + + + + + + + + + +
+
+
+ + + HTTPS certificates + +
+
+
+
+
+
+ + HTTPS certificates + +
+
+
+ + + + + + + +
+
+
+ + + + someapp.example.com + + +
+
+
+
+
+
+ + someapp.example.com + +
+
+
+ + + + + + + +
+
+
+ + + + another.example.net + + +
+
+
+
+
+
+ + another.example.net + +
+
+
+ + + + + + + +
+
+
+ + + + onemore.example.org + + +
+
+
+
+
+
+ + onemore.example.org + +
+
+
+ + + + + + + +
+
+
+ + + + IP: + +
+ + 123.124.125.126 + +
+
+
+
+
+
+
+ + IP:... + +
+
+
+ + + + + + + +
+
+
+ + https://someapp.example.com + +
+
+
+
+ + https://someapp.example.com + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/deployment/https/https08.svg b/docs/en/docs/img/deployment/https/https08.svg deleted file mode 100644 index 2d4680dcc..000000000 --- a/docs/en/docs/img/deployment/https/https08.svg +++ /dev/null @@ -1,62 +0,0 @@ -
Server(s)
Server(s)
https://someapp.example.com
https://someapp.example.com
DNS Servers
DNS Servers
TLS Termination Proxy
TLS Termination Proxy -
FastAPI app for: someapp.example.com
FastAPI app for: someapp.example.com
Another app: another.example.com
Another app: another.example.com
One more app: onemore.example.com
One more app: onemore.example.com
A Database
A Database
Plain response from: someapp.example.com
Plain response from: someapp.example.com
Decrypted request for: someapp.example.com
Decrypted request for: someapp.example.com
Port 443 (HTTPS)
Port 443 (HTTPS)
Encrypted request for: someapp.example.com
Encrypted request for: someapp.example.com
Who is: someapp.example.com
Who is: someapp.example.com
IP:
123.124.125.126
IP:...
TLS Handshake
TLS Handshake
Encrypted response from: someapp.example.com
Encrypted response from: someapp.example.com
HTTPS certificates
HTTPS certificates -
someapp.example.com
someapp.example.com -
another.example.net
another.example.net -
onemore.example.org
onemore.example.org -
IP:
123.124.125.126
IP:...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.drawio b/docs/en/docs/img/tutorial/bigger-applications/package.drawio deleted file mode 100644 index cab3de2ca..000000000 --- a/docs/en/docs/img/tutorial/bigger-applications/package.drawio +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg b/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg new file mode 100644 index 000000000..7e28f4a68 --- /dev/null +++ b/docs/en/docs/img/tutorial/bigger-applications/package.drawio.svg @@ -0,0 +1,420 @@ + + + + + + + + + + + + + + + + +
+
+
+ + Package app +
+ app/__init__.py +
+
+
+
+
+ + Package app... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.main + +
+ + app/main.py + +
+
+
+
+
+ + Module app.main... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.dependencies + +
+ + app/dependencies.py + +
+
+
+
+
+ + Module app.dependencies... + +
+
+
+ + + + + + + + + + +
+
+
+ + + Subpackage app.internal +
+
+ + app/internal/__init__.py + +
+ +
+
+
+
+
+
+ + Subpackage app.internal... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.internal.admin + +
+ + app/internal/admin.py + +
+
+
+
+
+ + Module app.internal.admin... + +
+
+
+ + + + + + + + + + +
+
+
+ + + Subpackage app.routers +
+ app/routers/__init__.py +
+
+
+
+
+
+
+ + Subpackage app.routers... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.routers.items + +
+ + app/routers/items.py + +
+
+
+
+
+ + Module app.routers.items... + +
+
+
+ + + + + + + +
+
+
+ + + Module app.routers.users + +
+ + app/routers/users.py + +
+
+
+
+
+ + Module app.routers.users... + +
+
+
+
+ + + + + Text is not SVG - cannot display + + + +
diff --git a/docs/en/docs/img/tutorial/bigger-applications/package.svg b/docs/en/docs/img/tutorial/bigger-applications/package.svg deleted file mode 100644 index 44da1dc30..000000000 --- a/docs/en/docs/img/tutorial/bigger-applications/package.svg +++ /dev/null @@ -1 +0,0 @@ -
Package app
app/__init__.py
Package app...
Module app.main
app/main.py
Module app.main...
Module app.dependencies
app/dependencies.py
Module app.dependencies...
Subpackage app.internal
app/internal/__init__.py
Subpackage app.internal...
Module app.internal.admin
app/internal/admin.py
Module app.internal.admin...
Subpackage app.routers
app/routers/__init__.py
Subpackage app.routers...
Module app.routers.items
app/routers/items.py
Module app.routers.items...
Module app.routers.users
app/routers/users.py
Module app.routers.users...
Viewer does not support full SVG 1.1
diff --git a/docs/en/docs/tutorial/bigger-applications.md b/docs/en/docs/tutorial/bigger-applications.md index 605ced0d3..f5f29a173 100644 --- a/docs/en/docs/tutorial/bigger-applications.md +++ b/docs/en/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * There's also a subdirectory `app/internal/` with another file `__init__.py`, so it's another "Python subpackage": `app.internal`. * And the file `app/internal/admin.py` is another submodule: `app.internal.admin`. - + The same file structure with comments: @@ -270,7 +270,7 @@ But that file doesn't exist, our dependencies are in a file at `app/dependencies Remember how our app/file structure looks like: - + --- diff --git a/docs/es/docs/deployment/concepts.md b/docs/es/docs/deployment/concepts.md index f5725c5dc..bcc7948bc 100644 --- a/docs/es/docs/deployment/concepts.md +++ b/docs/es/docs/deployment/concepts.md @@ -216,7 +216,7 @@ Este Proceso Administrador probablemente sería el que escuche en el **puerto** Esos worker processes serían los que ejecutan tu aplicación, realizarían los cálculos principales para recibir un **request** y devolver un **response**, y cargarían cualquier cosa que pongas en variables en RAM. - + Y por supuesto, la misma máquina probablemente tendría **otros procesos** ejecutándose también, aparte de tu aplicación. diff --git a/docs/es/docs/deployment/https.md b/docs/es/docs/deployment/https.md index f2871ac03..3ccb5dc47 100644 --- a/docs/es/docs/deployment/https.md +++ b/docs/es/docs/deployment/https.md @@ -85,7 +85,7 @@ Primero, el navegador consultaría con los **servidores DNS** cuál es la **IP d Los servidores DNS le dirían al navegador que use una **dirección IP** específica. Esa sería la dirección IP pública utilizada por tu servidor, que configuraste en los servidores DNS. - + ### Inicio del Handshake TLS @@ -93,7 +93,7 @@ El navegador luego se comunicaría con esa dirección IP en el **puerto 443** (e La primera parte de la comunicación es solo para establecer la conexión entre el cliente y el servidor y decidir las claves criptográficas que usarán, etc. - + Esta interacción entre el cliente y el servidor para establecer la conexión TLS se llama **handshake TLS**. @@ -111,7 +111,7 @@ Usando la **extensión SNI** discutida anteriormente, el TLS Termination Proxy v En este caso, usaría el certificado para `someapp.example.com`. - + El cliente ya **confía** en la entidad que generó ese certificado TLS (en este caso Let's Encrypt, pero lo veremos más adelante), por lo que puede **verificar** que el certificado sea válido. @@ -133,19 +133,19 @@ Ahora que el cliente y el servidor (específicamente el navegador y el TLS Termi Así que, el cliente envía un **request HTTPS**. Esto es simplemente un request HTTP a través de una conexión TLS encriptada. - + ### Desencriptar el Request El TLS Termination Proxy usaría la encriptación acordada para **desencriptar el request**, y transmitiría el **request HTTP simple (desencriptado)** al proceso que ejecuta la aplicación (por ejemplo, un proceso con Uvicorn ejecutando la aplicación FastAPI). - + ### Response HTTP La aplicación procesaría el request y enviaría un **response HTTP simple (sin encriptar)** al TLS Termination Proxy. - + ### Response HTTPS @@ -153,7 +153,7 @@ El TLS Termination Proxy entonces **encriptaría el response** usando la criptog Luego, el navegador verificaría que el response sea válido y encriptado con la clave criptográfica correcta, etc. Entonces **desencriptaría el response** y lo procesaría. - + El cliente (navegador) sabrá que el response proviene del servidor correcto porque está utilizando la criptografía que acordaron usando el **certificado HTTPS** anteriormente. @@ -163,7 +163,7 @@ En el mismo servidor (o servidores), podrían haber **múltiples aplicaciones**, Solo un proceso puede estar gestionando la IP y puerto específica (el TLS Termination Proxy en nuestro ejemplo) pero las otras aplicaciones/procesos pueden estar ejecutándose en el/los servidor(es) también, siempre y cuando no intenten usar la misma **combinación de IP pública y puerto**. - + De esa manera, el TLS Termination Proxy podría gestionar HTTPS y certificados para **múltiples dominios**, para múltiples aplicaciones, y luego transmitir los requests a la aplicación correcta en cada caso. @@ -173,7 +173,7 @@ En algún momento en el futuro, cada certificado **expiraría** (alrededor de 3 Y entonces, habría otro programa (en algunos casos es otro programa, en algunos casos podría ser el mismo TLS Termination Proxy) que hablaría con Let's Encrypt y renovaría el/los certificado(s). - + Los **certificados TLS** están **asociados con un nombre de dominio**, no con una dirección IP. diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md index 78165ef05..c3d8f0686 100644 --- a/docs/es/docs/tutorial/bigger-applications.md +++ b/docs/es/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * También hay un subdirectorio `app/internal/` con otro archivo `__init__.py`, por lo que es otro "subpaquete de Python": `app.internal`. * Y el archivo `app/internal/admin.py` es otro submódulo: `app.internal.admin`. - + La misma estructura de archivos con comentarios: @@ -270,7 +270,7 @@ Pero ese archivo no existe, nuestras dependencias están en un archivo en `app/d Recuerda cómo se ve nuestra estructura de aplicación/archivo: - + --- diff --git a/docs/ja/docs/deployment/concepts.md b/docs/ja/docs/deployment/concepts.md index c6b21fd1b..a0d4fb35b 100644 --- a/docs/ja/docs/deployment/concepts.md +++ b/docs/ja/docs/deployment/concepts.md @@ -219,7 +219,7 @@ FastAPI アプリケーションでは、Uvicorn のようなサーバープロ これらのワーカー・プロセスは、アプリケーションを実行するものであり、**リクエスト**を受けて**レスポンス**を返すための主要な計算を行い、あなたが変数に入れたものは何でもRAMにロードします。 - + そしてもちろん、同じマシンでは、あなたのアプリケーションとは別に、**他のプロセス**も実行されているでしょう。 diff --git a/docs/ja/docs/deployment/https.md b/docs/ja/docs/deployment/https.md index ac40b0982..7b0f567aa 100644 --- a/docs/ja/docs/deployment/https.md +++ b/docs/ja/docs/deployment/https.md @@ -92,7 +92,7 @@ DNSサーバーでは、**取得したドメイン**をあなたのサーバー DNSサーバーは、ブラウザに特定の**IPアドレス**を使用するように指示します。このIPアドレスは、DNSサーバーで設定した、あなたのサーバーが使用するパブリックIPアドレスになります。 - + ### TLS Handshake の開始 @@ -100,7 +100,7 @@ DNSサーバーは、ブラウザに特定の**IPアドレス**を使用する 通信の最初の部分は、クライアントとサーバー間の接続を確立し、使用する暗号鍵などを決めるだけです。 - + TLS接続を確立するためのクライアントとサーバー間のこのやりとりは、**TLSハンドシェイク**と呼ばれます。 @@ -120,7 +120,7 @@ TLS Termination Proxyは、1つ以上の**TLS証明書**(HTTPS証明書)に 今回は、`someapp.example.com`の証明書を使うことになります。 - + クライアントは、そのTLS証明書を生成したエンティティ(この場合はLet's Encryptですが、これについては後述します)をすでに**信頼**しているため、その証明書が有効であることを**検証**することができます。 @@ -142,19 +142,19 @@ TLS Termination Proxyは、1つ以上の**TLS証明書**(HTTPS証明書)に そこで、クライアントは**HTTPSリクエスト**を送信します。これは、暗号化されたTLSコネクションを介した単なるHTTPリクエストです。 - + ### リクエストの復号化 TLS Termination Proxy は、合意が取れている暗号化を使用して、**リクエストを復号化**し、**プレーン (復号化された) HTTP リクエスト** をアプリケーションを実行しているプロセス (例えば、FastAPI アプリケーションを実行している Uvicorn を持つプロセス) に送信します。 - + ### HTTP レスポンス アプリケーションはリクエストを処理し、**プレーン(暗号化されていない)HTTPレスポンス** をTLS Termination Proxyに送信します。 - + ### HTTPS レスポンス @@ -162,7 +162,7 @@ TLS Termination Proxyは次に、事前に合意が取れている暗号(`someap その後ブラウザでは、レスポンスが有効で正しい暗号キーで暗号化されていることなどを検証します。そして、ブラウザはレスポンスを**復号化**して処理します。 - + クライアント(ブラウザ)は、レスポンスが正しいサーバーから来たことを知ることができます。 なぜなら、そのサーバーは、以前に**HTTPS証明書**を使って合意した暗号を使っているからです。 @@ -172,7 +172,7 @@ TLS Termination Proxyは次に、事前に合意が取れている暗号(`someap 特定のIPとポート(この例ではTLS Termination Proxy)を扱うことができるのは1つのプロセスだけですが、他のアプリケーション/プロセスも、同じ**パブリックIPとポート**の組み合わせを使用しようとしない限り、サーバー上で実行することができます。 - + そうすれば、TLS Termination Proxy は、**複数のドメイン**や複数のアプリケーションのHTTPSと証明書を処理し、それぞれのケースで適切なアプリケーションにリクエストを送信することができます。 @@ -182,7 +182,7 @@ TLS Termination Proxyは次に、事前に合意が取れている暗号(`someap その後、Let's Encryptと通信する別のプログラム(別のプログラムである場合もあれば、同じTLS Termination Proxyである場合もある)によって、証明書を更新します。 - + **TLS証明書**は、IPアドレスではなく、**ドメイン名に関連付けられて**います。 diff --git a/docs/pt/docs/deployment/concepts.md b/docs/pt/docs/deployment/concepts.md index 8cf70d0b4..014ca3797 100644 --- a/docs/pt/docs/deployment/concepts.md +++ b/docs/pt/docs/deployment/concepts.md @@ -216,7 +216,7 @@ Este Processo de Gerenciador provavelmente seria o que escutaria na **porta** no Esses processos de trabalho seriam aqueles que executariam seu aplicativo, eles executariam os cálculos principais para receber uma **solicitação** e retornar uma **resposta**, e carregariam qualquer coisa que você colocasse em variáveis ​​na RAM. - + E, claro, a mesma máquina provavelmente teria **outros processos** em execução, além do seu aplicativo. diff --git a/docs/pt/docs/deployment/https.md b/docs/pt/docs/deployment/https.md index 9ad419934..904d04eaa 100644 --- a/docs/pt/docs/deployment/https.md +++ b/docs/pt/docs/deployment/https.md @@ -85,7 +85,7 @@ Primeiro, o navegador iria verificar com os **servidores DNS** qual o **IP do do Os servidores DNS iriam informar o navegador para utilizar algum **endereço IP** específico. Esse seria o endereço IP público em uso no seu servidor, que você configurou nos servidores DNS. - + ### Início do Handshake TLS @@ -93,7 +93,7 @@ O navegador então irá comunicar-se com esse endereço IP na **porta 443** (a p A primeira parte dessa comunicação é apenas para estabelecer a conexão entre o cliente e o servidor e para decidir as chaves criptográficas a serem utilizadas, etc. - + Esse interação entre o cliente e o servidor para estabelecer uma conexão TLS é chamada de **Handshake TLS**. @@ -111,7 +111,7 @@ Utilizando a **extensão SNI** discutida acima, o Proxy de Terminação TLS iria Nesse caso, ele usaria o certificado para `someapp.example.com`. - + O cliente já **confia** na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), então ele pode **verificar** que o certificado é válido. @@ -133,19 +133,19 @@ Agora que o cliente e servidor (especialmente o navegador e o Proxy de Terminaç Então, o cliente envia uma **solicitação HTTPS**. Que é apenas uma solicitação HTTP sobre uma conexão TLS encriptada. - + ### Desencriptando a Solicitação O Proxy de Terminação TLS então usaria a encriptação combinada para **desencriptar a solicitação**, e transmitiria a **solicitação básica (desencriptada)** para o processo executando a aplicação (por exemplo, um processo com Uvicorn executando a aplicação FastAPI). - + ### Resposta HTTP A aplicação processaria a solicitação e retornaria uma **resposta HTTP básica (não encriptada)** para o Proxy de Terminação TLS. - + ### Resposta HTTPS @@ -153,7 +153,7 @@ O Proxy de Terminação TLS iria **encriptar a resposta** utilizando a criptogra No próximo passo, o navegador verifica que a resposta é válida e encriptada com a chave criptográfica correta, etc. E depois **desencripta a resposta** e a processa. - + O cliente (navegador) saberá que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o **certificado HTTPS** anterior. @@ -163,7 +163,7 @@ Podem existir **múltiplas aplicações** em execução no mesmo servidor (ou se Apenas um processo pode estar vinculado a um IP e porta (o Proxy de Terminação TLS, por exemplo), mas outras aplicações/processos também podem estar em execução no(s) servidor(es), desde que não tentem usar a mesma **combinação de IP público e porta**. - + Dessa forma, o Proxy de Terminação TLS pode gerenciar o HTTPS e os certificados de **múltiplos domínios**, para múltiplas aplicações, e então transmitir as requisições para a aplicação correta em cada caso. @@ -173,7 +173,7 @@ Em algum momento futuro, cada certificado irá **expirar** (aproximadamente 3 me E então, haverá outro programa (em alguns casos pode ser o próprio Proxy de Terminação TLS) que irá interagir com o Let's Encrypt e renovar o(s) certificado(s). - + Os **certificados TLS** são **associados com um nome de domínio**, e não a um endereço IP. diff --git a/docs/pt/docs/tutorial/bigger-applications.md b/docs/pt/docs/tutorial/bigger-applications.md index a094005fd..b621f3c72 100644 --- a/docs/pt/docs/tutorial/bigger-applications.md +++ b/docs/pt/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * Há também um subdiretório `app/internal/` com outro arquivo `__init__.py`, então ele é outro "subpacote Python":`app.internal`. * E o arquivo `app/internal/admin.py` é outro submódulo: `app.internal.admin`. - + A mesma estrutura de arquivos com comentários: @@ -270,7 +270,7 @@ Mas esse arquivo não existe, nossas dependências estão em um arquivo em `app/ Lembre-se de como nossa estrutura app/file se parece: - + --- diff --git a/docs/ru/docs/deployment/concepts.md b/docs/ru/docs/deployment/concepts.md index 7cdc29526..acfa1f4fe 100644 --- a/docs/ru/docs/deployment/concepts.md +++ b/docs/ru/docs/deployment/concepts.md @@ -216,7 +216,7 @@ Каждый из этих процессов будет запускать ваше приложение для обработки полученного **запроса** и возвращения вычисленного **ответа** и они будут использовать оперативную память. - + Безусловно, на этом же сервере будут работать и **другие процессы**, которые не относятся к вашему приложению. diff --git a/docs/ru/docs/deployment/https.md b/docs/ru/docs/deployment/https.md index 85c4cce60..d8877a9a1 100644 --- a/docs/ru/docs/deployment/https.md +++ b/docs/ru/docs/deployment/https.md @@ -92,7 +92,7 @@ DNS-сервера присылают браузеру определённый **IP-адрес**, тот самый публичный IP-адрес вашего сервера, который вы указали в ресурсной "записи А" при настройке. - + ### Рукопожатие TLS @@ -100,7 +100,7 @@ DNS-сервера присылают браузеру определённый Первым шагом будет установление соединения между клиентом (браузером) и сервером и выбор криптографического ключа (для шифрования). - + Эта часть клиент-серверного взаимодействия устанавливает TLS-соединение и называется **TLS-рукопожатием**. @@ -118,7 +118,7 @@ DNS-сервера присылают браузеру определённый То есть будет выбран сертификат для домена `someapp.example.com`. - + Клиент уже **доверяет** тому, кто выдал этот TLS-сертификат (в нашем случае - Let's Encrypt, но мы ещё обсудим это), потому может **проверить**, действителен ли полученный от сервера сертификат. @@ -140,19 +140,19 @@ DNS-сервера присылают браузеру определённый Так клиент отправляет **HTTPS-запрос**. То есть обычный HTTP-запрос, но через зашифрованное TLS-содинение. - + ### Расшифровка запроса Прокси-сервер, используя согласованный с клиентом ключ, расшифрует полученный **зашифрованный запрос** и передаст **обычный (незашифрованный) HTTP-запрос** процессу, запускающему приложение (например, процессу Uvicorn запускающему приложение FastAPI). - + ### HTTP-ответ Приложение обработает запрос и вернёт **обычный (незашифрованный) HTTP-ответ** прокси-серверу. - + ### HTTPS-ответ @@ -160,7 +160,7 @@ DNS-сервера присылают браузеру определённый Наконец, браузер проверит ответ, в том числе, что тот зашифрован с нужным ключом, **расшифрует его** и обработает. - + Клиент (браузер) знает, что ответ пришёл от правильного сервера, так как использует методы шифрования, согласованные ими раннее через **HTTPS-сертификат**. @@ -171,7 +171,7 @@ DNS-сервера присылают браузеру определённый Напомню, что только один процесс (например, прокси-сервер) может прослушивать определённый порт определённого IP-адреса. Но другие процессы и приложения тоже могут работать на этом же сервере (серверах), если они не пытаются использовать уже занятую **комбинацию IP-адреса и порта** (сокет). - + Таким образом, сервер завершения TLS может обрабатывать HTTPS-запросы и использовать сертификаты для **множества доменов** или приложений и передавать запросы правильным адресатам (другим приложениям). @@ -181,7 +181,7 @@ DNS-сервера присылают браузеру определённый Когда это произойдёт, можно запустить другую программу, которая подключится к Let's Encrypt и обновит сертификат(ы). Существуют прокси-серверы, которые могут сделать это действие самостоятельно. - + **TLS-сертификаты** не привязаны к IP-адресу, но **связаны с именем домена**. diff --git a/docs/ru/docs/tutorial/bigger-applications.md b/docs/ru/docs/tutorial/bigger-applications.md index 7c3dc288f..8b9080d39 100644 --- a/docs/ru/docs/tutorial/bigger-applications.md +++ b/docs/ru/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * Подкаталог `app/internal/`, содержащий файл `__init__.py`, является ещё одним суб-пакетом: `app.internal`. * А файл `app/internal/admin.py` является ещё одним суб-модулем: `app.internal.admin`. - + Та же самая файловая структура приложения, но с комментариями: @@ -269,7 +269,7 @@ from .dependencies import get_token_header Вспомните, как выглядит файловая структура нашего приложения: - + --- diff --git a/docs/zh/docs/deployment/concepts.md b/docs/zh/docs/deployment/concepts.md index 7a0b6c3d2..f7208da7c 100644 --- a/docs/zh/docs/deployment/concepts.md +++ b/docs/zh/docs/deployment/concepts.md @@ -220,7 +220,7 @@ 这些工作进程将是运行您的应用程序的进程,它们将执行主要计算以接收 **请求** 并返回 **响应**,并且它们将加载您放入 RAM 中的变量中的任何内容。 - + 当然,除了您的应用程序之外,同一台机器可能还运行**其他进程**。 diff --git a/docs/zh/docs/deployment/https.md b/docs/zh/docs/deployment/https.md index 9c963d587..d994c4add 100644 --- a/docs/zh/docs/deployment/https.md +++ b/docs/zh/docs/deployment/https.md @@ -86,7 +86,7 @@ DNS 服务器会告诉浏览器使用某个特定的 **IP 地址**。 这将是你在 DNS 服务器中为你的服务器配置的公共 IP 地址。 - + ### TLS 握手开始 @@ -94,7 +94,7 @@ DNS 服务器会告诉浏览器使用某个特定的 **IP 地址**。 这将是 通信的第一部分只是建立客户端和服务器之间的连接并决定它们将使用的加密密钥等。 - + 客户端和服务器之间建立 TLS 连接的过程称为 **TLS 握手**。 @@ -112,7 +112,7 @@ TLS 终止代理可以访问一个或多个 **TLS 证书**(HTTPS 证书)。 在这种情况下,它将使用`someapp.example.com`的证书。 - + 客户端已经**信任**生成该 TLS 证书的实体(在本例中为 Let's Encrypt,但我们稍后会看到),因此它可以**验证**该证书是否有效。 @@ -134,19 +134,19 @@ TLS 终止代理可以访问一个或多个 **TLS 证书**(HTTPS 证书)。 接下来,客户端发送一个 **HTTPS 请求**。 这其实只是一个通过 TLS 加密连接的 HTTP 请求。 - + ### 解密请求 TLS 终止代理将使用协商好的加密算法**解密请求**,并将**(解密的)HTTP 请求**传输到运行应用程序的进程(例如运行 FastAPI 应用的 Uvicorn 进程)。 - + ### HTTP 响应 应用程序将处理请求并向 TLS 终止代理发送**(未加密)HTTP 响应**。 - + ### HTTPS 响应 @@ -154,7 +154,7 @@ TLS 终止代理将使用协商好的加密算法**解密请求**,并将**( 接下来,浏览器将验证响应是否有效和是否使用了正确的加密密钥等。然后它会**解密响应**并处理它。 - + 客户端(浏览器)将知道响应来自正确的服务器,因为它使用了他们之前使用 **HTTPS 证书** 协商出的加密算法。 @@ -164,7 +164,7 @@ TLS 终止代理将使用协商好的加密算法**解密请求**,并将**( 只有一个进程可以处理特定的 IP 和端口(在我们的示例中为 TLS 终止代理),但其他应用程序/进程也可以在服务器上运行,只要它们不尝试使用相同的 **公共 IP 和端口的组合**。 - + 这样,TLS 终止代理就可以为多个应用程序处理**多个域名**的 HTTPS 和证书,然后在每种情况下将请求传输到正确的应用程序。 @@ -174,7 +174,7 @@ TLS 终止代理将使用协商好的加密算法**解密请求**,并将**( 然后,会有另一个程序(在某些情况下是另一个程序,在某些情况下可能是同一个 TLS 终止代理)与 Let's Encrypt 通信并更新证书。 - + **TLS 证书** **与域名相关联**,而不是与 IP 地址相关联。 diff --git a/docs/zh/docs/tutorial/bigger-applications.md b/docs/zh/docs/tutorial/bigger-applications.md index 318e10fd7..554bc654f 100644 --- a/docs/zh/docs/tutorial/bigger-applications.md +++ b/docs/zh/docs/tutorial/bigger-applications.md @@ -52,7 +52,7 @@ from app.routers import items * 还有一个子目录 `app/internal/` 包含另一个 `__init__.py` 文件,因此它是又一个「Python 子包」:`app.internal`。 * `app/internal/admin.py` 是另一个子模块:`app.internal.admin`。 - + 带有注释的同一文件结构: @@ -244,7 +244,7 @@ from .dependencies import get_token_header 请记住我们的程序/文件结构是怎样的: - + --- From ea7b1054762c72a79bc111e747e20d4c67721afc Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 11 May 2025 13:37:47 +0000 Subject: [PATCH 074/138] =?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 0a1293e9f..f931fafff 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,6 +13,7 @@ hide: ### Docs +* 🍱 Update Drawio diagrams SVGs, single file per diagram, sans-serif font. PR [#13706](https://github.com/fastapi/fastapi/pull/13706) by [@tiangolo](https://github.com/tiangolo). * 📝 Update docs for "Help FastAPI", simplify and reduce "sponsor" section. PR [#13670](https://github.com/fastapi/fastapi/pull/13670) by [@tiangolo](https://github.com/tiangolo). * 📝 Remove unnecessary bullet from docs. PR [#13641](https://github.com/fastapi/fastapi/pull/13641) by [@Adamowoc](https://github.com/Adamowoc). * ✏️ Fix syntax error in `docs/en/docs/tutorial/handling-errors.md`. PR [#13623](https://github.com/fastapi/fastapi/pull/13623) by [@gsheni](https://github.com/gsheni). From be0cf41d38e1f9b56f45ce8586d1336c2983ae84 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 18:02:28 +0200 Subject: [PATCH 075/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13711)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.8 → v0.11.10](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.8...v0.11.10) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2a688e2b4..2c7cee518 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.8 + rev: v0.11.10 hooks: - id: ruff args: From 4d1c69751eebeba3db591ccdd52b690d1ebd0878 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 20 May 2025 16:02:48 +0000 Subject: [PATCH 076/138] =?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 f931fafff..ace8cb045 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13711](https://github.com/fastapi/fastapi/pull/13711) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 🔧 Update sponsors: add Subtotal. PR [#13701](https://github.com/fastapi/fastapi/pull/13701) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove deepset / Haystack. PR [#13700](https://github.com/fastapi/fastapi/pull/13700) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13688](https://github.com/fastapi/fastapi/pull/13688) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From 7382ceda579e73776df0ea71cb76adefdcb21d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 21 May 2025 17:17:03 +0200 Subject: [PATCH 077/138] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20rem?= =?UTF-8?q?ove=20MongoDB=20(#13725)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - docs/en/data/sponsors.yml | 3 --- docs/en/overrides/main.html | 6 ------ 3 files changed, 10 deletions(-) diff --git a/README.md b/README.md index d668babbb..96809127d 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,6 @@ The key features are: - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index a46fd03f5..9c57dad0e 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -14,9 +14,6 @@ gold: - url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge title: Auth, user management and more for your B2B product img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png - - url: https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral - title: Simplify Full Stack Development with FastAPI & MongoDB - img: https://fastapi.tiangolo.com/img/sponsors/mongodb.png - url: https://zuplo.link/fastapi-gh title: 'Zuplo: Deploy, Secure, Document, and Monetize your FastAPI' img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 9d985ea87..89c8171d0 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -56,12 +56,6 @@ -
From 0e1ec488856b18da719f97a0da94004094f69465 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 21 May 2025 15:17:32 +0000 Subject: [PATCH 078/138] =?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 ace8cb045..654c5c013 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Internal +* 🔧 Update sponsors: remove MongoDB. PR [#13725](https://github.com/fastapi/fastapi/pull/13725) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13711](https://github.com/fastapi/fastapi/pull/13711) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 🔧 Update sponsors: add Subtotal. PR [#13701](https://github.com/fastapi/fastapi/pull/13701) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove deepset / Haystack. PR [#13700](https://github.com/fastapi/fastapi/pull/13700) by [@tiangolo](https://github.com/tiangolo). From a01a665b5723aef8613d269ccb7d8d77b6ecd678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 22 May 2025 11:18:52 +0200 Subject: [PATCH 079/138] =?UTF-8?q?=F0=9F=94=A7=20Remove=20Google=20Analyt?= =?UTF-8?q?ics=20(#13727)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/mkdocs.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml index 48b7fd8a0..8a5ea13e0 100644 --- a/docs/en/mkdocs.yml +++ b/docs/en/mkdocs.yml @@ -289,20 +289,6 @@ markdown_extensions: mdx_include: null markdown_include_variants: null extra: - analytics: - provider: google - property: G-YNEVN69SC3 - feedback: - title: Was this page helpful? - ratings: - - icon: material/emoticon-happy-outline - name: This page was helpful - data: 1 - note: Thanks for your feedback! - - icon: material/emoticon-sad-outline - name: This page could be improved - data: 0 - note: Thanks for your feedback! social: - icon: fontawesome/brands/github-alt link: https://github.com/fastapi/fastapi From bcb7935ab78e1e31c7f201e264b5b17a5772a3f0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 22 May 2025 09:19:16 +0000 Subject: [PATCH 080/138] =?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 654c5c013..69124c29e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Internal +* 🔧 Remove Google Analytics. PR [#13727](https://github.com/fastapi/fastapi/pull/13727) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove MongoDB. PR [#13725](https://github.com/fastapi/fastapi/pull/13725) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13711](https://github.com/fastapi/fastapi/pull/13711) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 🔧 Update sponsors: add Subtotal. PR [#13701](https://github.com/fastapi/fastapi/pull/13701) by [@tiangolo](https://github.com/tiangolo). From 29ed7d052b58f32444ff14ae299de365262fcc56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 22 May 2025 11:45:32 +0200 Subject: [PATCH 081/138] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20Add?= =?UTF-8?q?=20InterviewPal=20(#13728)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/en/data/sponsors.yml | 3 +++ docs/en/data/sponsors_badge.yml | 4 ++++ docs/en/docs/img/sponsors/interviewpal.png | Bin 0 -> 25890 bytes 4 files changed, 8 insertions(+) create mode 100644 docs/en/docs/img/sponsors/interviewpal.png diff --git a/README.md b/README.md index 96809127d..78ae6b10e 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 9c57dad0e..14a1f3cf3 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -45,6 +45,9 @@ silver: - url: https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi title: Fine-Grained Authorization for FastAPI img: https://fastapi.tiangolo.com/img/sponsors/permit.png + - url: https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring + title: InterviewPal - AI Interview Coach for Engineers and Devs + img: https://fastapi.tiangolo.com/img/sponsors/interviewpal.png bronze: - url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source title: Biosecurity risk assessments made easy. diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index d507a500f..fd34019b3 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -38,3 +38,7 @@ logins: - render-sponsorships - renderinc - stainless-api + - snapit-cypher + - coderabbitai + - permitio + - LambdaTest-Inc diff --git a/docs/en/docs/img/sponsors/interviewpal.png b/docs/en/docs/img/sponsors/interviewpal.png new file mode 100644 index 0000000000000000000000000000000000000000..e40ed01fd4f9c0b41183fb2f9cb5291985348e9e GIT binary patch literal 25890 zcmeFYRa7L+)-77NOXKeD(73z1JB_=$Hx7lnyKCdFjk`>$clf&qRL;#>#yAe8uIJ4wV-SG>k#Ut zs_CL^=uYI|WN&6^V@l-W>0nA^>S1XH0C=pb#mvI=GC_-eW*3lRv6*lr%`Yo*9MGTOqqcc&M^(dGSYmLfwzO|z-H~CY<0#U%V#@)F5Sq2Qf zJd6Q?g_*QxRnTxXKt`()uo;EiU+H}EpA*U>No~<7n=%J}2LNCpEx&rCDJRQqY;Vh8 zXku?<%HUz^@YPiSfLFl7!O+;+)P=~%)ZEgJkL0SOhlI$|gpWjnO^!**3`w2$ivpg&Y9bTkL15_xxe23^ED$0(SNzPSo4u+ z$|(|w*gKgLu`;kSFwu*7Sh}&0@WT@EI+>VpD~pQ%55(6eJ`xKT7YA-eMt6622KVm_ z_D<%E%v@Ytj7%(yEG+b29`w$hb}oh<^mfjq|3LgVhN!8tv6H2Pi>19C(Lb1mM)s~Q zd?X}acB20Q|A+nmgKp>iKO}t7!T67bk(q&s@&9&ru{8UCasS8iFZX{Mb1PbUnA&KH zTH2c0Ie&G5kA#Jl>A%4KW!3t>tjtXRZT$y{TgukZ+*HHT#Kq!Y&HiPOHMKMU$MXMZ zqTpm{`o+ONSNmllVf=?l#{Z%6D>97#Cp7=?^Z)(!pOgGs9RG)||IqbsG4O9W|3_W_ zq3hpb;NNookGlTakkY<({Rd;mY{&p0jo+&p221Xf~Q~uo>CgYGj-lj3W(O^o@u(pjSrHgUquhn5=Q; zcTj4t_kjFQ2?Q(-8{_rNVERf;J<@3L41VWVzO%<+%Z_Xwxe z$$Huy5G$R`2B7g;VV*no5UDzMV7K|FVURP}boA zrmbZLJ4r8zrZXE~c$r7CVIfE*;1 zU|!P6wrI%yDH;JrRQ10DN747VB)wBKjASg0BbH=5|$b>)odg z8rw`xal$Ny3+xJ*9z32p^i=q$$|fQY-!#p;Z9kyTBXO;xD&U9_F=H$KSiDdJ+swQKs2{jHGU}2=Ut!a#5-Du|=t|W(nk~wMyFex=O3S*iKI1BkUzD0_HFzb-UZ_cL`b$cw_ zrR1!cq;jxb-<8+ojE7g2)T~?bcV$Hu7Xbq-byOQki7VMr`((9~Fm=toI3u#)B{RYx z5Ox5{?p&~23|pQOD@V=^{*B`17JhuZe29T`GXvPPIU}B87$=K8jM9k11a#MN1J>oG z_L_0Fxk)r`Lxj4+CDDD$zM{Wb)HS)yNZ);9w23}`f34tDv?fSZK$?uemDXp;vBLG~KKF}c9AEcDbZ{w~*eVCgcEK7$ z{+vhoU^_xMp3%%r*cUX(KH!=f&m+W*IJnbkpIMMbvl&%gK4s*zX-GLmsR-@Mu7pLj zQO6VpMYtl9juc!J%w`s3q3-G%1D`8Mf-?lfBo2#okq!blJa=qLF9FlJY2$MWk?&;8%FcUbqf1lkRC9hg>PTzOea1@2#0x zXv?Nb={lpFc-P;Pizm9)sMU{m>(nQ*khquc5qUJToF2rm%B{so}6z5nXc9x203~P9#V`RC+7b{#z$D$NNq%Izubz`Ws7NKxod*_yaS^@=16{k1QZg5ag5GLFsb7gfhnUwtw9Aswm{BN$0nPE~19!zOnWTG2*z z>FF@g$TrVew}KWJpvl5U;$xJNUm`1_5e!S+7gI&fvM6h3TQf;2Dw^1|D=gWXI>_Yj z#1Ib20{rkP*cirY@%F~V-7dmaWLf%I0F^+MLrW)iK*o|^L6?vs z7kS1f&817Yq&w8U4c_ZYnC49B|1A9}U%*!^b4 zO7AD9W4Rmd9T6^eJPWOm5_5w0p{aq8q=O!Jpxl}(AfB%hs5;tEPHAgWocD=Q9l4>lJgkN5QrH`-@R@xe}ZP1IbQ;KcmTCNu#lB8lMZm)3!D~m5a6m*P| zhyvY@sKi2*l1-G+O=qclPD!B=FN%`#q?i;{L^K>4N-3%)KAx6Gb!F?rmMfX{@fa18 zO}8@hq)k^wpe9$(D|720?n#3;((GA!x)=#G%i%fV7(91M*Ffw_3~%j2bD=XaY7%}J zfaZ^A#xdTRL1@Ar3YHX9j%R(ELCz>M3(lDuPz7&dqoH;w%ws_s(7Tr?g0oHbbiDl& z7&l`?XX#03gkpF&R-T3wKXjdFdU*z;Yr&;maA+jKXwi;o)SgFgvI_Jeb{J(ey)+?M zH%*stDN&o+rj0MZlQ1<*P_(SC)%%$K-ipq1?9FCabHfHX!fxHLr-pVqkllGT& zBr{#RlQC)Ny(Rbb+1{{Tx%YjZRgf@(M9BaB8-T?iKt2E~$X11*XJIES#5?ie``fd~e419>XoLD&l70J_xrJ`oiLS9DB z$XA{e$Ap_hT_q<%i4>kZoEb4gQKCKpkkb`$8qsak7iM-}1?_^&1&`2H1DTI@Ox_u~ zkpNGNnV5GHNI57K>8rAAFae%vLz3@R-?XHs(CR8fs5rHxVU6J$u9EQ%83Kd)q+;rr zO&N;OkM|FQ=IG~>l6uidL@Q($djWef7OVJ_)B_mY&0t4Xcu>-;hB{H>>Jf$@?Yv^kRz16W~1HBJf2m}R8 z5CwHSBecv=PzStXt;om>3t* zldjrFx=HRFr1GHK)omjwITMmtfx3PN*MepD-J%gKK5A_D#XVKBdjC$b_WNRBjCaCu z*^MHlYji1vZ{EP_0Cl3$D=WSsbqpk@=gd%0-BLD^>s)w>SfWHC^e83S+v1dqO1;~| z%Wq4U#kCEK{+mV7Q41%^N-`%CAHsfA{}ih*-VHUKQAqg0Q*(GPX28{}Hmfg#XJYUX z#3v*MPBgw2mn3i5VNt_nv{-C#yxbA=Oc;9-SrMpqu558~?F7h2$3+^(eJttrY zqxb`tu|ROPWGS*O-XOHzI%)DQ9`0St7@1L8FzZr02Am=n;BaOBHy*p`Iz4GXN*+&G zb7b_B75Kg6uvn~7cnMBI!W(FB0h6^ZmN1fFEu&k zz&)yZKp$d0zM<35wd6`03dJy&p=bmuy1FhM?YQ{fYUD)vO%aNSvg{9*mCoj>v;LbM zt@NxKtxUY|1>ssm?6L(LM?De7IARQFvv2Sd{b^%eWDLhYo~gC-K?mPWrE3NFYHZGx zwVBap*`a9hR~toFNID`eUn?A)BTZ#XL#o6=4_SsMz-Zxqsm)LmN2!Pk68j2-o{a9V zSU$F|UylDQ0WUZaO3P~NcIxr|B7|aiU?qgbq zQ(_JYMZDxeTr`wG-iRq2)cgG*_9)WM5!Q4sFg1m^ z@%^ffNv{UM+2H~o+?Osy4~B}gBUA#^%5aQX+;NPS@in_OK>#N!>trfoEF6AH16ij% zTO}RF5aHYEAHYvN@8Rp~dCKS?KAN8+V?<~ggA(%sN+~tkd)nKwZ{m$VxdDJKJx>=` zGiIIYvvhf*<@EYyI8wOj{PFgO(yW0XIH1p(Ev`1f&n^G$aGzaTo>_|*x7)6i^0HxO zFK;KsLwIk**fXsd_Lm9h74>=!2s4a)$@9Q8N5*lCg)=Y8P11STClPud>LJA9&?nJ( zC}%`bD7ObkV2MlxqPY|^5!rEsAWrrW)Z2h6IqD8O4noqnDP9`3IG;-Y`2xI^{-2C3 zj=#A8 z?pG-oM7R9c&Ok$6miVA7 z4Tvd*X)ucYn?Wf}qCks6c^C`y|#68aO>06^VO&zS^^oB6C>JS}5Cvp5XUUJAQ9 zNzjZt`@K|*D}Na2*%aqXvk0f|!)f<0;iLwqHTFkQ9&Gj|wwv3-ZItn0{ktSx)>g ztbuD#?oUS~T&()QMk26Er|_ZeikljhYbKwaP@23&^gYz6(I0&5^rQuBNBcX)zAc?` z+@(}%M_#L@{_7c9uO6<4j`(wE2 zwkCxs$c`UfdVvtWU%){Fa-WA7_bCMgD$>{dUnNp+v!cP$=$D_D1iB11-)S=)$Jr`1 ztJxff2{-XOzz2m>uDssO+CFa4b!V1C&E|)@NfTS|BpCNLhhsqi4BXzxg#OcF;6Hnw zbEn6qb9u03j%yTj!!Dt_9&tD!LC-O zd>Dcz&%AC{rgjAVmaB&Fmuq&0)c8hBcx9)TuJ_?eZw~A)Qb;LFRgU1fmN0y%fo(vDhS0<^`{!M8+%fNT~p9-#Do^4~v5O@i*%ml0>I7;KK3rVY$VXsydl2 z*8*Kru8YCZ%Z;^ZuF2Bkr)ZdyEqlk!uD4?SkZ^%P9&N0FC$bRt0Wmnt*_J>5!1E&e zD#M8=i(7f!ca+N3@JBiZwhF7o$h|iUi@&tPf&cu6=1q^mv8PBdK3k8+Uv~Ma#XbjX zjQL$@Vg~NST#L8ZXt&rduKNH+PAUEe%GA4p>L5U1;xcKink^PQMyb0#vP$bkC`{E zV~gUv^Vt_%ekaqvhT75jqJ|P~!Y8d?uWtle!)a4oMm}FI2|Ratsknh!`_9<9E`NpJ z-kyJe{LQeLchXW(`ACq@P~cG-R~ZRi82KLaxpZe`GX=jJ zQpmV_1v?$oMknouE(i4&V{0;Tz{O11H+Yq4g7uZxcZqSU8;kJ$H|mPBg>bViRxi|+ zCqrZi-KI;w*T?vyeuDq=hs;w8;Z-7`?n<<>m<4`{Eiohh$-6NlN5&0mKgo=)A}##K5Lz>pU*h_vgrnc)1A%=Y)xH&2;;onV87>+f)V~e}!!~8F{^l zL*=IdfT^{{pMdN8NYc4$Up`b;N4ed$)ox27zt{bAtt#!MJ`VjJM1aF%p~L}U_Xn@^ z0XO3c3svs(cJjH+^o|@y)m~|Loyvk-I@)hkW-2vVV!7~9pNztz_{OM6tkPyB`1N2# zlbmx*Ob$Opll6;3DpTj}S=2eWW8a;g@Q>(Z{#93A00DYlFCu0nG>vkEksno>>oE(f2b{#)dae6F&gQxn^l!!g@D0(@ASaD#X$3|10ttGxp@yFF@W zakdKN<7grB3zgd0(|ONTf^q-+HScaSzI8Cc^>NMif?iJn)P^2cFKSi~xn_}ZV)73V zdo5_Mz`g*I6vk6<0B^H3*1d~rwdO>@FUr{NOWqVjw`~qP9=I001{{Ecj|t>!jNJC| zb=3OX2jN)9$0^A3z;cdQxptTb$@DpPU&MR^;HR2QI~jlsLAwM~ODA4`sD1R9@4-Fz z6L`zBJDvVHxNPiTe|I;;4gDG8!q^B({=jqN6>&v9%ZI9mK0A!kMd%my^CjEj9AzZ* zK9I9^b4iKq2;Hu10MLfjgw3=Q6-jbD}I(5OE=exS0Vs2dz%hW%=SSM0=>Qy8>p z2(LC=*IA8Zp3%Tbv`3}pquQYMRDgWW<{Zw3pOGe+x-|mKxyn zt(ZW(^VznZ29o(PFsn>b2Of z2>5IOf6&GDa7I1u;&~7_Zfe0j-DOiAbjra&00cfK4MrrkT)$0kH2%D&I?8S$>Rv|e z2r~|e^4q)%we^|CZPtR4tlk{h^1Z;07~<8dF#NoMvC;k$_C4J@tNdt@dOvengjj}S zTdSyRf-yD9Yo8QbC2Osm;;%)b2Eh>1wntG`s??Sc%anyk2Fd*2o4%UL|TkSw6XP%%#ZO!Tm+mDoSs~Jllvejaoh&xg! z{DLx;P;Nrz0Wk-h-}A|NT&+^&`|&C)_HR@!7bledLUK9+i($`9jIr`Mln$O-PERuo z0nc6NkL~ESud*xrYi9F}ej7|A5i6a_GIH!erJC(#|5D{?>`{N24z zss15OkDjd7FD7h`Ck!|WU_n2ue%~f80 z4xrV;koB35H;KQ^E&JW0VJ*`ni3Q&Ny-gacoi!C=U5Mrn|46vOxbq zouWUD(ZbI0kbQTp6M+`rKu9;MGtNcKOPFsGRnsaE`bNFwUY!aeAAJTM-bj7xNf zZQ8!Iq4-!$*RIzY<1f>n^;I(J$^$&kLlTJ~6fU^Pm-RXmIP{xgzs3U)K#q?kC*piL zg-hGg_JFLIKpKm7hq7+FZ5?2HbXKeLF%d~x1*J{AMjXvB-xHL_>E0r(-33Ynet#(f zYW9zR#iCF-;RnuHf{~b^*mw8jM)OHz6XDH5mCxg$|GgF<3@M!M`Eq@^-o|B zVGv~gAFM-&u$~slOY(Sg4B@<;XA2Y2=jq|PA*{cXIpCrW70l6Hn`sZ}?MKFC>_8~< zzdzcQLJ3P1s3H{gJM*xDFyalcqYQ?RyA+`t$4h$QL?BW=(br4Wk&t(yX}xC`<3;l0 zgir%>c|FOPbbe{}!?nN<{aCye%YGV@s5yxJxMBZzus6WSreif;8GGOR^t*pD1oYx- z{5lBC=^ggl{$t$N+COcv76%n2n{sW_YO&?Fr?uW#!O^|>7Xj`mI(B2ko8K48|4O4- z+&HQ9F$Ua_F_zPN5|ANBsBnegvp(#e8+-*frM*ZE*myqo(hNfp>j*Iz~bm){i*=wJ=!HZd^fWa1&Z&q`u^)N)7r4rp;;& zB0F_YW^Sx&;Aodoy4AAl1S7V7>=GOKoXGOZF?lur-Wkob{eyU5^nxJ>ZRuiXcQPrj)O{pjq(Fy?^zKlZ4?eZfiB3k!a{GffyR zM^i|Gp)UP)Yu_H0 zb9*&D?;zT2&QKVzk9*BGd%%XpOSG!l>dd4#Sg?@}tiV3K9_`S-#ZKtYp_=nGK;`h! zTy?wB!adUgwnIb;v2e1@OipPLq(R?dhM!{H`A7{uwyjsTHbQ^-JaH4?r$d5ke*HL} zBM}vqdOewYnK%;0xM<~bGlQMgVaNn|FWuBTK#<9Bw>>IVWv~PX@NnA-UwAjO@thU0 z!Wwn8dbe42+;lmyx_58csrmH#uFuH|6!X2%?dgOnrIglOStF2*r({PIioeg%vP)d- zJ5z|HD{gd=+l@EjE*^u=Yq!w5^Ppc$m#^F^Hqn9YZ;(PlXAT}JM2%MLmvY2YB$GNt znrMNC4FT0(^Cp;LtPY`xvSWHsQPmoL?oba})%KpyZ=;dXcabe9A_Xh?rQp zqcJ*v`)$K6n&( z{~0B(0Z=GNl+RiJj)!zww?V0fA6J_6NZ@}`M51!1C0y<)UZ%ulO0emw+kL%pq*TK` z^A)hl7RJ3f2>hp~Wr9@W(o*ypCR1lcQs^7rieFL*gi|xZMZu2yCZsd>>oWR<>~;}X zGSlJuWu+DM>PdBfUL?}?G-?u~*a%dvI|~F7iRUE|zhUkIA2&}*o9&}-DR&q5MBXSa zeXgD-4xLB#?;J}!3-yO>%7e?xsbwc8wk;0e&E8-S$4)SzPbVSeIZ7R?m_tdUmEfOI zulcqELo%=X7Jv0;ObMCrBI#2^%2Gt?@VmwKjt@k9%2ElL?eZ2wjIy!m497dp%_|AI zdlQhN7LQcLT&azi)*2aN)@$u9Xu|A$S34tQ5+kgPsEznRj18 zRV}Y9b=Mx(SFtPK%aAFtRLT@)2vUpeASU5t;SKTXR~YB38~MhNUaW!O*28$0_R0kW zw|KaL@G@$s`~j+bxRK;JekiKl1?|hlwH9f`tU<9?x))C2bL5?+(A14|TXA;r}+RVxI-o@3}vE)0Q4%|;Uj~vWkXRO}% z(N#9MqBFj3yl6O`q>+3z4XX;>L6dS6G!$rMCS&);C7bQuYmfRz&&$<$2Kw*7x6DB? z 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 Sn(1Z$0000 Date: Thu, 22 May 2025 09:45:56 +0000 Subject: [PATCH 082/138] =?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 69124c29e..124f3c84b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Internal +* 🔧 Update sponsors: Add InterviewPal. PR [#13728](https://github.com/fastapi/fastapi/pull/13728) by [@tiangolo](https://github.com/tiangolo). * 🔧 Remove Google Analytics. PR [#13727](https://github.com/fastapi/fastapi/pull/13727) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove MongoDB. PR [#13725](https://github.com/fastapi/fastapi/pull/13725) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13711](https://github.com/fastapi/fastapi/pull/13711) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From 61cc7014ccf5191f5d4da74b892615ea0ce5faf0 Mon Sep 17 00:00:00 2001 From: sungchan Yeo Date: Fri, 30 May 2025 22:10:41 +0900 Subject: [PATCH 083/138] =?UTF-8?q?=F0=9F=8C=90=20Update=20Korean=20transl?= =?UTF-8?q?ation=20for=20`docs/ko/docs/virtual-environments.md`=20(#13630)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/virtual-environments.md | 846 +++++++++++++++++++++++++++ 1 file changed, 846 insertions(+) create mode 100644 docs/ko/docs/virtual-environments.md diff --git a/docs/ko/docs/virtual-environments.md b/docs/ko/docs/virtual-environments.md new file mode 100644 index 000000000..0d10c3200 --- /dev/null +++ b/docs/ko/docs/virtual-environments.md @@ -0,0 +1,846 @@ +# 가상 환경 + +Python 프로젝트를 작업할 때는 **가상 환경** (또는 이와 유사한 도구)을 사용하는 것이 좋습니다. 각 프로젝트 마다 설치하는 패키지를 분리하여 관리할 수 있습니다. + +/// info | 정보 + +이미 가상 환경에 대해 잘 알고 있다면, 이 섹션은 건너 뛰어도 괜찮습니다. 🤓 + +/// + +/// tip | 팁 + +**가상 환경(Virtual Environment)** 은 **환경 변수(Environment Variable)** 와 다릅니다. + +**환경 변수**는 시스템에 존재하며, 프로그램이 사용할 수 있는 변수입니다. + +**가상 환경**은 몇몇 파일로 구성된 하나의 디렉터리입니다. + +/// + +/// info | 정보 + +이 페이지에서는 **가상 환경**의 사용 방법과 작동 방식을 설명합니다. + +만약 **모든 것을 관리해주는 도구** (Python 설치까지 포함)를 사용하고 싶다면 uv를 사용해보세요. + +/// + +## 프로젝트 생성 + +먼저, 프로젝트를 위한 디렉터리를 하나 생성합니다. + +보통 사용자 홈 디렉터리 안에 `code`라는 디렉터리를 만들고, 그 안에 프로젝트마다 하나씩 디렉터리를 만들어 관리합니다. + +

+ +```console +// 홈 디렉터리로 이동 +$ cd +// 모든 코드 프로젝트를 위한 디렉터리 생성 +$ mkdir code +// code 디렉터리로 이동 +$ cd code +// 이번 프로젝트를 위한 디렉터리 생성 +$ mkdir awesome-project +// 해당 프로젝트 디렉터리로 이동 +$ cd awesome-project +``` + +
+ +## 가상 환경 생성 + +Python 프로젝트를 **처음 시작할 때**, 가상 환경을 **프로젝트 내부**에 생성합니다. + +/// tip | 팁 + +이 작업은 **프로젝트를 처음 설정할 때 한번만** 해주면 됩니다. 이후 작업할 때 반복할 필요는 없습니다. + +/// + +//// tab | `venv` + +Python 표준 라이브러리에 포함된 venv 모듈을 사용해 가상 환경을 생성할 수 있습니다. + +
+ +```console +$ python -m venv .venv +``` + +
+ +/// details | 명령어 상세 설명 + +* `python`: `python` 프로그램을 실행합니다. +* `-m`: 특정 모듈을 스크립트처럼 실행합니다. 대상 모듈을 바로 뒤에 지정합니다. +* `venv`: Python 표준 라이브러리에 포함된 `venv` 모듈을 실행합니다. +* `.venv`: 가상 환경을 `.venv` 디렉터리에 생성합니다. + +/// + +//// + +//// tab | `uv` + +`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 + +Windows에서 Bash(예: Git Bash)를 사용하는 경우: + +
+ +```console +$ source .venv/Scripts/activate +``` + +
+ +//// + +/// tip | 팁 + +가상 환경에 새로운 패키지를 설치할 때마다, 해당 환경을 다시 활성화하세요. + +이렇게 하면 해당 패키지로 설치된 **터미널(CLI) 프로그램**을 사용할 때, 전역에 설치된 다른 버전이 아니라, 가상 환경 안에 설치된 정확한 버전을 사용합니다. + +/// + +## 가상 환경이 활성화 여부 확인 + +가상 환경이 활성화되었는지 확인합니다. (이전 명령어가 제대로 작동했는지 확인합니다). + +/// tip | 팁 + +이 단계는 **선택 사항**이지만, 모든 것이 예상대로 작동하고 있는지, 그리고 의도한 가상 환경이 활성화 되었는 지 **확인**하는 좋은 방법입니다. + +/// + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +$ which python + +/home/user/code/awesome-project/.venv/bin/python +``` + +
+ +`python` 위치가 프로젝트 내부(이 예시에서는 `awesome-project`)의 `.venv/bin/python` 경로로 표시된다면 성공입니다. 🎉 + +//// + +//// tab | Windows PowerShell + +
+ +```console +$ Get-Command python + +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +
+ +`python` 위치가 프로젝트 내부(이 예시에서는 `awesome-project`)의 `.venv\bin\python` 경로로 표시된다면 성공입니다. 🎉 + +//// + +## pip 업그레이드 + +/// tip | 팁 + +`uv`를 사용한다면, `pip` 대신 `uv`로 패키지를 설치하게 되므로 `pip`을 업그레이드할 필요가 없습니다. 😎 + +/// + +`pip`을 사용하여 패키지를 설치하는 경우 (Python 표준 라이브러리에 포함되어 있습니다), **최신 버전으로 업그레이드**하는 것이 좋습니다. + +패키지 설치 중 발생하는 다양하고 특이한 에러들은 `pip` 업그레이드로 쉽게 해결되는 경우가 많습니다. + +/// tip | 팁 + +이 작업은 보통 가상 환경을 생성한 **직후 한 번만** 하면 됩니다. + +/// + +가상 환경이 활성화된 상태인지 확인한 후(앞서 설명한 명령어 사용), 아래 명령어를 실행하세요: + +
+ +```console +$ python -m pip install --upgrade pip + +---> 100% +``` + +
+ +## `.gitignore` 추가하기 + +**Git**을 사용하고 있다면 (사용하는 것이 좋습니다), `.gitignore` 파일을 추가해서 `.venv` 디렉터리 전체를 Git에서 제외하세요. + +/// tip | 팁 + +`uv`를 사용해 가상 환경을 생성했다면, 이미 이 작업이 자동으로 처리되어 있으므로 이 단계는 건너뛰어도 됩니다. 😎 + +/// + +/// tip | 팁 + +이 작업도 마찬가지로, 가상 환경을 생성한 **직후 한 번만** 하면 됩니다. + +/// + +
+ +```console +$ echo "*" > .venv/.gitignore +``` + +
+ +/// details | 명령어 상세 설명 + +* `echo "*"`: 터미널에 `*` 텍스트를 "출력"합니다 (다음 설명에서 조금 바뀝니다) +* `>`: 왼쪽 명령어의 출력 내용을 터미널에 출력하지 않고, 오른쪽에 지정된 파일로 **기록(write)** 하라는 의미입니다. +* `.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와 함께 사용할 **기타 패키지들**을 **설치**해야 합니다. + +패키지를 설치할 때 보통 Python에 기본 포함된 `pip` 명령어(또는 유사한 도구)를 사용합니다. + +하지만 `pip`을 그냥 직접 사용하면, 해당 패키지들은 **전역 Python 환경**(시스템 전체에 설치된 Python)에 설치됩니다. + +### 문제점 + +그렇다면, 전역 Python 환경에 패키지를 설치하면 어떤 문제가 발생할까요? + +어느 시점이 되면, **서로 다른 패키지들**에 의존하는 여러 개의 프로그램을 작성하게 될 것입니다. 그리고 이들 중 일부는 **같은 패키지의 서로 다른 버전**을 필요로 할 수 있습니다. 😱 + +예를 들어, `마법사의 돌(philosophers-stone)` 프로젝트를 만들었다고 가정해봅시다. 이 프로그램은 `해리 포터(harry)`라는 패키지의 `v1` 버전을 **의존**합니다. 따라서 `harry`를 설치해야 합니다. + +```mermaid +flowchart LR + stone(philosophers-stone) -->|requires| harry-1[harry v1] +``` + +그런데 나중에 `아즈카반의 죄수(prisoner-of-azkaban)`이라는 또 다른 프로젝트를 만들게 되었고, 이 프로젝트도 역시 `harry` 패키지를 사용합니다. 그런데 이 프로젝트는 `harry`의 `v3` 버전이 필요합니다. + +```mermaid +flowchart LR + azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3] +``` + +하지만 이제 문제가 생깁니다. 로컬 가상 환경 대신에 전역 환경에 패키지를 설치하게 되면, 어떤 버전의 `harry`를 설치할지를 선택해야 하기 때문입니다. + +예를 들어, `마법사의 돌(philosophers-stone)`을 실행하고 싶다면 먼저 `harry` `v1` 버전을 다음과 같이 설치 해야 합니다: + +
+ +```console +$ pip install "harry==1" +``` + +
+ +그러면 결국 전역 Python 환경에는 `harry` `v1`버전이 설치된 상태가 됩니다. + +```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` `v1`버전을 제거하고 `harry` `v3`버전을 설치해야 합니다. (또는 단순히 `v3`버전을 설치하는 것만으로도 기존의 `v1`버전이 자동으로 제거됩니다.) + +
+ +```console +$ pip install "harry==3" +``` + +
+ +그렇게 하면 이제 전역 Python 환경에는 `harry` `v3`버전이 설치된 상태가 됩니다. + +그리고 다시 `마법사의 돌(philosophers-stone)`을 실행하려고 하면, **작동하지** 않을 수 있습니다. 왜냐하면 이 프로그램은 `harry` `v1`버전을 필요로 하기 때문입니다. + +```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 패키지들은 **새 버전**에서 **호환성 문제(breaking changes)**가 발생하지 않도록 최대한 노력하는 것이 일반적입니다. 하지만 그래도 안전하게 작업하려면, 테스트를 실행해보면서 새 버전을 의도적으로 설치하는 것이 좋습니다. + +/// + +이제, 이런 일이 여러분의 **모든 프로젝트**가 사용하는 **수많은 패키지들**에서 동시에 발생한다고 상상해보세요. 이는 매우 관리하기 어려우며, 결국 **서로 호환되지 않는 버전**의 패키지로 프로젝트를 실행하게 될 가능성이 높고, 그로 인해 어떤 문제가 왜 발생하는지 알 수 없게 될 수 있습니다. + +또한 사용하는 운영체제(Linux, Windows, macOS 등)에 따라 Python이 **미리 설치되어 있을 수도** 있습니다. 이런 경우에는 운영체제의 동작에 필요한 특정 버전의 패키지들이 함께 설치되어 있을 수 있습니다. 이 상태에서 전역 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 + +Windows에서 Bash(예: Git Bash)를 사용하는 경우: + +
+ +```console +$ source .venv/Scripts/activate +``` + +
+ +//// + +이 명령어는 이후에 실행될 명령어에서 사용될 [환경 변수](environment-variables.md){.internal-link target=_blank} 몇 개를 생성하거나 수정합니다. + +이 변수들 중 하나가 바로 `PATH` 변수입니다. + +/// tip | 팁 + +`PATH` 환경 변수에 대해 더 알고 싶다면 [환경 변수 문서의 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 +``` + +그리고 해당 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 +``` + +그리고 해당 Python을 사용하게 됩니다. + +//// + +중요한 세부 사항 중 하나는, 가상 환경의 경로가 `PATH` 변수의 가장 **앞**에 추가된다는 점입니다. 시스템은 사용 가능한 다른 Python들보다 **먼저** 이 경로를 찾습니다. 그래서 터미널에서 `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` 프로그램은 **가상 환경 내부에 있는 것**입니다. + +Linux와 macOS에서는 `which`, Windows PowerShell에서는 `Get-Command` 명령어를 사용합니다. + +이 명령어는 `PATH` 환경 변수에 지정된 경로들을 **순서대로 탐색**하면서 `python`이라는 이름의 프로그램을 찾습니다. +찾는 즉시, 해당 프로그램의 **경로를 출력**합니다. + +중요한 점은 터미널에서 `python`을 실행했을 때, 실제로 실행되는 "`python`"이 어떤 것인지 정확히 알 수 있다는 것입니다. + +따라서 현재 올바른 가상 환경에 있는지 확인할 수 있습니다. + +/// tip | 팁 + +하나의 가상 환경을 활성화한 뒤, 해당 Python을 가진 상태에서 **또 다른 프로젝트**로 이동하는 것은 흔히 발생합니다. + +하지만 이때 이전 프로젝트의 가상 환경에 있는 **잘못된 Python 실행 파일**을 사용하게 되어 새 프로젝트가 **정상 작동하지 않을 수 있습니다.** + +그래서 현재 어떤 `python`이 사용되고 있는지 확인할 수 있는 능력은 매우 유용합니다. 🤓 + +/// + +## 가상 환경을 비활성화하는 이유 + +예를 들어 `마법사의 돌(philosophers-stone)`이라는 프로젝트에서 작업 중이라고 해보겠습니다. 이때 해당 **가상 환경을 활성화**하고, 필요한 패키지를 설치하며 작업을 진행합니다. + +그런데 이제는 **다른 프로젝트**인 `아즈카반의 죄수(prisoner-of-azkaban)`을 작업하고 싶어졌습니다. + +그래서 그 프로젝트 디렉터리로 이동합니다: + +
+ +```console +$ cd ~/code/prisoner-of-azkaban +``` + +
+ +만약 `마법사의 돌(philosophers-stone)`의 가상 환경을 비활성화하지 않았다면, 터미널에서 `python`을 실행할 때 여전히 `마법사의 돌(philosophers-stone)` 가상 환경의 Python을 사용하게 됩니다. + +
+ +```console +$ cd ~/code/prisoner-of-azkaban + +$ python main.py + +// sirius를 임포트하는 데 실패했습니다. 설치되어 있지 않아요 😱 +Traceback (most recent call last): + File "main.py", line 1, in + import sirius +``` + +
+ +하지만 `마법사의 돌(philosophers-stone)`의 가상 환경을 비활성화한 다음, `아즈카반의 죄수(prisoner-of-azkaban)` 프로젝트의 가상 환경을 활성화하면, 이제 `python` 명령어는 `아즈카반의 죄수(prisoner-of-azkaban)` 가상 환경의 Python을 사용하게 됩니다. + +
+ +```console +$ cd ~/code/prisoner-of-azkaban + +// 이전 디렉터리에 있을 필요 없이, 어디서든 가상 환경을 비활성화할 수 있습니다. 다른 프로젝트 디렉터리로 이동한 후에도 괜찮아요 😎 +$ deactivate + +// prisoner-of-azkaban/.venv 가상 환경을 활성화합니다 🚀 +$ source .venv/bin/activate + +// 이제 python을 실행하면, 이 가상 환경에 설치된 sirius 패키지를 찾게 됩니다 ✨ +$ python main.py + +못된 짓을 꾸미고 있음을 엄숙히 맹세합니다.🧙 +ImportError는 이제 없습니다. 🐺 +``` + +
+ +## 대안들 + +이 문서는 여러분이 Python 프로젝트를 시작하고, **그 내부에서** 어떻게 돌아가는지 알려주는 간단한 가이드입니다. + +가상 환경, 패키지 의존성(Requirements), 프로젝트를 관리하는 방법에는 이 외에도 다양한 **대안**들이 존재합니다. + +만약 준비가 되었다면, **프로젝트 전체**, 패키지 의존성, 가상 환경 등을 통합적으로 **관리**할 수 있는 도구를 써보는 것도 좋습니다. 그럴 때 추천하는 도구가 바로 uv입니다. + +`uv`는 다양한 기능을 지원합니다: + +* 다양한 버전의 **Python 설치** +* 각 프로젝트 별 **가상 환경 관리** +* **패키지 설치** +* 프로젝트의 **의존성과 버전** 관리 +* 설치된 패키지들과 그 버전을 **정확히 고정(lock)**해서,개발 환경과 운영 환경이 완전히 동일하게 작동할 수 있도록 보장 +* 이 외에도 다양한 기능을 지원 + +## 결론 + +여기까지 모두 읽고 이해했다면, 이제 많은 개발자들보다 가상 환경을 **훨씬 더 깊이 있게 이해**하게 되셨습니다. 🤓 + +이런 세부적인 내용을 알고 있으면, 언젠가 복잡해 보이는 문제를 디버깅할 때 분명히 큰 도움이 될 것입니다. 이제는 **이 모든 것들이 내부에서 어떻게 작동하는지** 알고 있기 때문입니다. 😎 From 34856a27381c5deed62ce8ae6e153613d55e62b7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:11:03 +0000 Subject: [PATCH 084/138] =?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 124f3c84b..c6c615d55 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Update Korean translation for `docs/ko/docs/virtual-environments.md`. PR [#13630](https://github.com/fastapi/fastapi/pull/13630) by [@sungchan1](https://github.com/sungchan1). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/header-param-models.md`. PR [#13526](https://github.com/fastapi/fastapi/pull/13526) by [@minaton-ru](https://github.com/minaton-ru). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/index.md`. PR [#13374](https://github.com/fastapi/fastapi/pull/13374) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). * 🌐 Update Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#13324](https://github.com/fastapi/fastapi/pull/13324) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). From 5f84703beae6d535998861a9339e72ca7c203458 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabi=C3=A1n=20Fal=C3=B3n?= Date: Fri, 30 May 2025 15:15:52 +0200 Subject: [PATCH 085/138] =?UTF-8?q?=F0=9F=93=9D=20Fix=20internal=20anchor?= =?UTF-8?q?=20link=20in=20Spanish=20deployment=20docs=20(#13737)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/es/docs/deployment/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/es/docs/deployment/docker.md b/docs/es/docs/deployment/docker.md index ff204f078..3a39d3661 100644 --- a/docs/es/docs/deployment/docker.md +++ b/docs/es/docs/deployment/docker.md @@ -6,7 +6,7 @@ Usar contenedores de Linux tiene varias ventajas, incluyendo **seguridad**, **re /// tip | Consejo -¿Tienes prisa y ya conoces esto? Salta al [`Dockerfile` más abajo 👇](#build-a-docker-image-for-fastapi). +¿Tienes prisa y ya conoces esto? Salta al [`Dockerfile` más abajo 👇](#construir-una-imagen-de-docker-para-fastapi). /// From 6c1e7fb4de03c20540b0d519ff929025f3d80baa Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:16:17 +0000 Subject: [PATCH 086/138] =?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 c6c615d55..241448c83 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 📝 Fix internal anchor link in Spanish deployment docs. PR [#13737](https://github.com/fastapi/fastapi/pull/13737) by [@fabianfalon](https://github.com/fabianfalon). * 🌐 Update Korean translation for `docs/ko/docs/virtual-environments.md`. PR [#13630](https://github.com/fastapi/fastapi/pull/13630) by [@sungchan1](https://github.com/sungchan1). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/header-param-models.md`. PR [#13526](https://github.com/fastapi/fastapi/pull/13526) by [@minaton-ru](https://github.com/minaton-ru). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/index.md`. PR [#13374](https://github.com/fastapi/fastapi/pull/13374) by [@Zhongheng-Cheng](https://github.com/Zhongheng-Cheng). From 374626e0364fe373d7e7fdc75e289b2d5e9e5226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=9E=D0=BD=D0=B8=D1=89=D1=83?= =?UTF-8?q?=D0=BA?= <120256301+EgorOnishchuk@users.noreply.github.com> Date: Fri, 30 May 2025 16:17:36 +0300 Subject: [PATCH 087/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?= =?UTF-8?q?ion=20for=20`docs/ru/docs/tutorial/request-form-models.md`=20(#?= =?UTF-8?q?13552)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/tutorial/request-form-models.md | 78 ++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 docs/ru/docs/tutorial/request-form-models.md diff --git a/docs/ru/docs/tutorial/request-form-models.md b/docs/ru/docs/tutorial/request-form-models.md new file mode 100644 index 000000000..1034ed27f --- /dev/null +++ b/docs/ru/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 | Заметка + +Этот функционал доступен с версии `0.113.0`. 🤓 + +/// + +## Pydantic-модель для формы + +Вам просто нужно объявить **Pydantic-модель** с полями, которые вы хотите получить как **поля формы**, а затем объявить параметр как `Form`: + +{* ../../docs_src/request_form_models/tutorial001_an_py39.py hl[9:11,15] *} + +**FastAPI** **извлечёт** данные для **каждого поля** из **данных формы** в запросе и выдаст вам объявленную Pydantic-модель. + +## Проверка сгенерированной документации + +Вы можете посмотреть поля формы в графическом интерфейсе Документации по пути `/docs`: + +
+ +
+ +## Запрет дополнительных полей формы + +В некоторых случаях (не особо часто встречающихся) вам может понадобиться **ограничить** поля формы только теми, которые объявлены в Pydantic-модели. И **запретить** любые **дополнительные** поля. + +/// note | Заметка + +Этот функционал доступен с версии `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 2e9e5dfeec7300abc144c0ade02645d0b8d728c4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:18:34 +0000 Subject: [PATCH 088/138] =?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 241448c83..28db3039a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-form-models.md`. PR [#13552](https://github.com/fastapi/fastapi/pull/13552) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). * 📝 Fix internal anchor link in Spanish deployment docs. PR [#13737](https://github.com/fastapi/fastapi/pull/13737) by [@fabianfalon](https://github.com/fabianfalon). * 🌐 Update Korean translation for `docs/ko/docs/virtual-environments.md`. PR [#13630](https://github.com/fastapi/fastapi/pull/13630) by [@sungchan1](https://github.com/sungchan1). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/header-param-models.md`. PR [#13526](https://github.com/fastapi/fastapi/pull/13526) by [@minaton-ru](https://github.com/minaton-ru). From 4f9b737548bddbfeddef19ba28316799971e1d26 Mon Sep 17 00:00:00 2001 From: Valentyn Date: Fri, 30 May 2025 16:31:13 +0300 Subject: [PATCH 089/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/handling-errors.md`=20page?= =?UTF-8?q?=20(#13420)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/uk/docs/tutorial/handling-errors.md | 255 +++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 docs/uk/docs/tutorial/handling-errors.md diff --git a/docs/uk/docs/tutorial/handling-errors.md b/docs/uk/docs/tutorial/handling-errors.md new file mode 100644 index 000000000..12a356cd0 --- /dev/null +++ b/docs/uk/docs/tutorial/handling-errors.md @@ -0,0 +1,255 @@ +# Обробка Помилок + +Є багато ситуацій, коли потрібно повідомити клієнта, який використовує Ваш API, про помилку. + +Цим клієнтом може бути браузер із фронтендом, код іншого розробника, IoT-пристрій тощо. + +Можливо, Вам потрібно повідомити клієнта, що: + +* У нього недостатньо прав для виконання цієї операції. +* Він не має доступу до цього ресурсу. +* Елемент, до якого він намагається отримати доступ, не існує. +* тощо. + +У таких випадках зазвичай повертається **HTTP статус-код** в діапазоні **400** (від 400 до 499). + +Це схоже на HTTP статус-коди 200 (від 200 до 299). Ці "200" статус-коди означають, що запит пройшов успішно. + +Статус-коди в діапазоні 400 означають, що сталася помилка з боку клієнта. + +Пам'ятаєте всі ці помилки **404 Not Found** (і жарти про них)? + +## Використання `HTTPException` + +Щоб повернути HTTP-відповіді з помилками клієнту, використовуйте `HTTPException`. + +### Імпорт `HTTPException` + +{* ../../docs_src/handling_errors/tutorial001.py hl[1] *} + +### Використання `HTTPException` у коді + +`HTTPException` — це звичайна помилка Python із додатковими даними, які стосуються API. + +Оскільки це помилка Python, Ви не `повертаєте` його, а `генеруєте` (генеруєте помилку). + +Це також означає, що якщо Ви перебуваєте всередині допоміжної функції, яку викликаєте всередині своєї *функції операції шляху*, і там генеруєте `HTTPException`, всередині цієї допоміжної функції, то решта коду в *функції операції шляху* не буде виконана. Запит одразу завершиться, і HTTP-помилка з `HTTPException` буде надіслана клієнту. + +Перевага використання `генерації` (raise) помилки замість `повернення` значення (return) стане більш очевидним в розділі про Залежності та Безпеку. + +У цьому прикладі, якщо клієнт запитує елемент за ID, якого не існує, буде згенеровано помилку зі статус-кодом `404`: + +{* ../../docs_src/handling_errors/tutorial001.py hl[11] *} + +### Отримана відповідь + +Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id` `"foo"`), він отримає статус-код 200 і JSON відповідь: + +```JSON +{ + "item": "The Foo Wrestlers" +} +``` + +Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає статус-код 404 (помилка "не знайдено") та відповідь: + +```JSON +{ + "detail": "Item not found" +} +``` + +/// tip | Порада + +Під час виклику `HTTPException` Ви можете передати будь-яке значення, яке може бути перетворене в JSON, як параметр `detail`, а не лише рядок (`str`). + +Ви можете передати `dict`, `list` тощо. + +Вони обробляються автоматично за допомогою **FastAPI** та перетворюються в JSON. + +/// + +## Додавання власних заголовків + +Іноді потрібно додати власні заголовки до HTTP-помилки, наприклад, для певних типів безпеки. + +Ймовірно, Вам не доведеться використовувати це безпосередньо у своєму коді. + +Але якщо Вам знадобиться це для складного сценарію, Ви можете додати власні заголовки: + +{* ../../docs_src/handling_errors/tutorial002.py hl[14] *} + +## Встановлення власних обробників помилок + +Ви можете додати власні обробники помилок за допомогою тих самих утиліт обробки помилок зі Starlette. + +Припустимо, у Вас є власний обʼєкт помилки `UnicornException`, яке Ви (або бібліотека, яку Ви використовуєте) може `згенерувати` (`raise`). + +І Ви хочете обробляти це виключення глобально за допомогою FastAPI. + +Ви можете додати власний обробник виключень за допомогою `@app.exception_handler()`: + +{* ../../docs_src/handling_errors/tutorial003.py hl[5:7,13:18,24] *} + +Тут, якщо Ви звернетеся до `/unicorns/yolo`, то згенерується помилка `UnicornException`. + +Але вона буде оброблена функцією-обробником `unicorn_exception_handler`. + +Отже, Ви отримаєте зрозумілу помилку зі HTTP-статусом `418` і JSON-відповіддю: + +```JSON +{"message": "Oops! yolo did something. There goes a rainbow..."} +``` + +/// note | Технічні деталі + +Ви також можете використовувати `from starlette.requests import Request` і `from starlette.responses import JSONResponse`. + +**FastAPI** надає ті самі `starlette.responses`, що й `fastapi.responses`, просто для зручності розробника. Але більшість доступних відповідей надходять безпосередньо зі Starlette. Те ж саме стосується і `Request`. + +/// + +## Перевизначення обробників помилок за замовчуванням + +**FastAPI** має кілька обробників помилок за замовчуванням. + +Ці обробники відповідають за повернення стандартних JSON-відповідей, коли Ви `генеруєте` (`raise`) `HTTPException`, а також коли запит містить некоректні дані. + +Ви можете перевизначити ці обробники, створивши власні. + +### Перевизначення помилок валідації запиту + +Коли запит містить некоректні дані, **FastAPI** генерує `RequestValidationError`. + +І також включає обробник помилок за замовчуванням для нього. + +Щоб перевизначити його, імпортуйте `RequestValidationError` і використовуйте його з `@app.exception_handler(RequestValidationError)` для декорування обробника помилок. + +Обробник помилок отримує `Request` і саму помилку. + +{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *} + +Тепер, якщо Ви перейдете за посиланням `/items/foo`, замість того, щоб отримати стандартну JSON-помилку: + +```JSON +{ + "detail": [ + { + "loc": [ + "path", + "item_id" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ] +} +``` + +Ви отримаєте текстову версію: + +``` +1 validation error +path -> item_id + value is not a valid integer (type=type_error.integer) +``` + +#### `RequestValidationError` проти `ValidationError` + +/// warning | Увага + +Це технічні деталі, які Ви можете пропустити, якщо вони зараз не важливі для Вас. + +/// + +`RequestValidationError` є підкласом Pydantic `ValidationError`. + +**FastAPI** використовує його для того, якщо Ви використовуєте модель Pydantic у `response_model` і у ваших даних є помилка, Ви побачили помилку у своєму журналі. + +Але клієнт/користувач не побачить її. Натомість клієнт отримає "Internal Server Error" зі статусом HTTP `500`. + +Так має бути, якщо у Вас виникла `ValidationError` Pydantic у *відповіді* або деінде у вашому коді (не у *запиті* клієнта), це насправді є помилкою у Вашому коді. + +І поки Ви її виправляєте, клієнти/користувачі не повинні мати доступу до внутрішньої інформації про помилку, оскільки це може призвести до вразливості безпеки. + +### Перевизначення обробника помилок `HTTPException` + +Аналогічно, Ви можете перевизначити обробник `HTTPException`. + +Наприклад, Ви можете захотіти повернути текстову відповідь замість JSON для цих помилок: + +{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,22] *} + +/// note | Технічні деталі + +Ви також можете використовувати `from starlette.responses import PlainTextResponse`. + +**FastAPI** надає ті самі `starlette.responses`, що й `fastapi.responses`, просто для зручності розробника. Але більшість доступних відповідей надходять безпосередньо зі Starlette. + +/// + +### Використання тіла `RequestValidationError` + +`RequestValidationError` містить `body`, який він отримав із некоректними даними. + +Ви можете використовувати це під час розробки свого додатка, щоб логувати тіло запиту та налагоджувати його, повертати користувачеві тощо. + +{* ../../docs_src/handling_errors/tutorial005.py hl[14] *} + +Тепер спробуйте надіслати некоректний елемент, наприклад: + +```JSON +{ + "title": "towel", + "size": "XL" +} +``` +Ви отримаєте відповідь, яка повідомить Вам, які саме дані є некоректні у вашому тілі запиту: + + +```JSON hl_lines="12-15" +{ + "detail": [ + { + "loc": [ + "body", + "size" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ], + "body": { + "title": "towel", + "size": "XL" + } +} +``` + +#### `HTTPException` FastAPI проти `HTTPException` Starlette + +**FastAPI** має власний `HTTPException`. + +І клас помилки `HTTPException` в **FastAPI** успадковується від класу помилки `HTTPException` в Starlette. + +Єдина різниця полягає в тому, що `HTTPException` в **FastAPI** приймає будь-які дані, які можна перетворити на JSON, для поля `detail`, тоді як `HTTPException` у Starlette приймає тільки рядки. + +Отже, Ви можете продовжувати використовувати `HTTPException` в **FastAPI** як зазвичай у своєму коді. + +Але коли Ви реєструєте обробник виключень, слід реєструвати його для `HTTPException` зі Starlette. + +Таким чином, якщо будь-яка частина внутрішнього коду Starlette або розширення чи плагін Starlette згенерує (raise) `HTTPException`, Ваш обробник зможе перехопити та обробити її. + +У цьому прикладі, щоб мати можливість використовувати обидва `HTTPException` в одному коді, помилка Starlette перейменовується на `StarletteHTTPException`: + +```Python +from starlette.exceptions import HTTPException as StarletteHTTPException +``` + +### Повторне використання обробників помилок **FastAPI** + +Якщо Ви хочете використовувати помилки разом із такими ж обробниками помилок за замовчуванням, як у **FastAPI**, Ви можете імпортувати та повторно використовувати їх із `fastapi.exception_handlers`: + +{* ../../docs_src/handling_errors/tutorial006.py hl[2:5,15,21] *} + +У цьому прикладі Ви просто використовуєте `print` для виведення дуже інформативного повідомлення, але Ви зрозуміли основну ідею. Ви можете обробити помилку та повторно використовувати обробники помилок за замовчуванням. From f0b3ebdf038dc63292a0337e9f10ba859d783628 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:31:35 +0000 Subject: [PATCH 090/138] =?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 28db3039a..4364e367d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/handling-errors.md` page. PR [#13420](https://github.com/fastapi/fastapi/pull/13420) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-form-models.md`. PR [#13552](https://github.com/fastapi/fastapi/pull/13552) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). * 📝 Fix internal anchor link in Spanish deployment docs. PR [#13737](https://github.com/fastapi/fastapi/pull/13737) by [@fabianfalon](https://github.com/fabianfalon). * 🌐 Update Korean translation for `docs/ko/docs/virtual-environments.md`. PR [#13630](https://github.com/fastapi/fastapi/pull/13630) by [@sungchan1](https://github.com/sungchan1). From aa2bb3e5699cb61f051654994f50b2c389f58907 Mon Sep 17 00:00:00 2001 From: Junbeom Lee Date: Fri, 30 May 2025 09:33:53 -0400 Subject: [PATCH 091/138] =?UTF-8?q?=F0=9F=8C=90=20Update=20Korean=20transl?= =?UTF-8?q?ation=20for=20`docs/ko/docs/advanced/events.md`=20(#13487)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/advanced/events.md | 146 ++++++++++++++++++++++++++++---- 1 file changed, 129 insertions(+), 17 deletions(-) diff --git a/docs/ko/docs/advanced/events.md b/docs/ko/docs/advanced/events.md index ae349e7be..5f8fe0f1e 100644 --- a/docs/ko/docs/advanced/events.md +++ b/docs/ko/docs/advanced/events.md @@ -1,53 +1,165 @@ -# 이벤트: startup과 shutdown +# Lifespan 이벤트 -필요에 따라 응용 프로그램이 시작되기 전이나 종료될 때 실행되는 이벤트 핸들러(함수)를 정의할 수 있습니다. +애플리케이션 **시작 전**에 실행되어야 하는 로직(코드)을 정의할 수 있습니다. 이는 이 코드가 **한 번**만 실행되며, **애플리케이션이 요청을 받기 시작하기 전**에 실행된다는 의미입니다. -이 함수들은 `async def` 또는 평범하게 `def`으로 선언할 수 있습니다. +마찬가지로, 애플리케이션이 **종료될 때** 실행되어야 하는 로직(코드)을 정의할 수 있습니다. 이 경우, 이 코드는 **한 번**만 실행되며, **여러 요청을 처리한 후**에 실행됩니다. + +이 코드가 애플리케이션이 **요청을 받기 시작하기 전에** 실행되고, 요청 처리가 끝난 후 **종료 직전에** 실행되기 때문에 전체 애플리케이션의 **수명(Lifespan)**을 다룹니다. (잠시 후 "수명"이라는 단어가 중요해집니다 😉) + +이 방법은 전체 애플리케이션에서 사용해야 하는 **자원**을 설정하거나 요청 간에 **공유되는** 자원을 설정하고, 또는 그 후에 **정리**하는 데 매우 유용할 수 있습니다. 예를 들어, 데이터베이스 연결 풀 또는 공유되는 머신러닝 모델을 로드하는 경우입니다. + + +## 사용 사례 + +먼저 **사용 사례**를 예로 들어보고, 이를 어떻게 해결할 수 있는지 살펴보겠습니다. + +우리가 요청을 처리하기 위해 사용하고 싶은 **머신러닝 모델**이 있다고 상상해 봅시다. 🤖 + +이 모델들은 요청 간에 공유되므로, 요청마다 모델이 하나씩 있는 것이 아니라, 여러 요청에서 동일한 모델을 사용합니다. + +모델을 로드하는 데 **상당한 시간이 걸린다고 상상해 봅시다**, 왜냐하면 모델이 **디스크에서 많은 데이터를 읽어야** 하기 때문입니다. 따라서 모든 요청에 대해 모델을 매번 로드하고 싶지 않습니다. + +모듈/파일의 최상위에서 모델을 로드할 수도 있지만, 그러면 **모델을 로드하는데** 시간이 걸리기 때문에, 단순한 자동화된 테스트를 실행할 때도 모델이 로드될 때까지 기다려야 해서 **테스트 속도가 느려집니다**. + +이 문제를 해결하려고 하는 것입니다. 요청을 처리하기 전에 모델을 로드하되, 애플리케이션이 요청을 받기 시작하기 직전에만 로드하고, 코드가 로드되는 동안은 로드하지 않도록 하겠습니다. + +## Lifespan + +`FastAPI` 애플리케이션의 `lifespan` 매개변수와 "컨텍스트 매니저"를 사용하여 *시작*과 *종료* 로직을 정의할 수 있습니다. (컨텍스트 매니저가 무엇인지 잠시 후에 설명드리겠습니다.) + +예제를 통해 시작하고, 그 후에 자세히 살펴보겠습니다. + +우리는 `yield`를 사용하여 비동기 함수 `lifespan()`을 다음과 같이 생성합니다: + +{* ../../docs_src/events/tutorial003.py hl[16,19] *} + +여기서 우리는 모델을 로드하는 비싼 *시작* 작업을 시뮬레이션하고 있습니다. `yield` 앞에서 (가짜) 모델 함수를 머신러닝 모델이 담긴 딕셔너리에 넣습니다. 이 코드는 **애플리케이션이 요청을 받기 시작하기 전**, *시작* 동안에 실행됩니다. + +그리고 `yield` 직후에는 모델을 언로드합니다. 이 코드는 **애플리케이션이 요청 처리 완료 후**, *종료* 직전에 실행됩니다. 예를 들어, 메모리나 GPU와 같은 자원을 해제하는 작업을 할 수 있습니다. + +/// tip | 팁 + +`shutdown`은 애플리케이션을 **종료**할 때 발생합니다. + +새로운 버전을 시작해야 하거나, 그냥 실행을 멈추고 싶을 수도 있습니다. 🤷 + +/// + +### Lifespan 함수 + +먼저 주목할 점은, `yield`를 사용하여 비동기 함수(async function)를 정의하고 있다는 것입니다. 이는 `yield`를 사용한 의존성과 매우 유사합니다. + +{* ../../docs_src/events/tutorial003.py hl[14:19] *} + +함수의 첫 번째 부분, 즉 `yield` 이전의 코드는 애플리케이션이 시작되기 **전에** 실행됩니다. + +그리고 `yield` 이후의 부분은 애플리케이션이 완료된 후 **나중에** 실행됩니다. + +### 비동기 컨텍스트 매니저 + +함수를 확인해보면, `@asynccontextmanager`로 장식되어 있습니다. + +이것은 함수를 "**비동기 컨텍스트 매니저**"라고 불리는 것으로 변환시킵니다. + +{* ../../docs_src/events/tutorial003.py hl[1,13] *} + +파이썬에서 **컨텍스트 매니저**는 `with` 문에서 사용할 수 있는 것입니다. 예를 들어, `open()`은 컨텍스트 매니저로 사용할 수 있습니다: + +```Python +with open("file.txt") as file: + file.read() +``` +최근 버전의 파이썬에서는 **비동기 컨텍스트 매니저**도 있습니다. 이를 `async with`와 함께 사용합니다: + +```Python +async with lifespan(app): + await do_stuff() +``` + +컨텍스트 매니저나 위와 같은 비동기 컨텍스트 매니저를 만들면, `with` 블록에 들어가기 전에 `yield` 이전의 코드가 실행되고, `with` 블록을 벗어난 후에는 `yield` 이후의 코드가 실행됩니다. + +위의 코드 예제에서는 직접 사용하지 않고, FastAPI에 전달하여 사용하도록 합니다. + +`FastAPI` 애플리케이션의 `lifespan` 매개변수는 **비동기 컨텍스트 매니저**를 받기 때문에, 새로운 `lifespan` 비동기 컨텍스트 매니저를 FastAPI에 전달할 수 있습니다. + +{* ../../docs_src/events/tutorial003.py hl[22] *} + +## 대체 이벤트 (사용 중단) /// warning | 경고 -이벤트 핸들러는 주 응용 프로그램에서만 작동합니다. [하위 응용 프로그램 - 마운트](./sub-applications.md){.internal-link target=_blank}에서는 작동하지 않습니다. +*시작*과 *종료*를 처리하는 권장 방법은 위에서 설명한 대로 `FastAPI` 애플리케이션의 `lifespan` 매개변수를 사용하는 것입니다. `lifespan` 매개변수를 제공하면 `startup`과 `shutdown` 이벤트 핸들러는 더 이상 호출되지 않습니다. `lifespan`을 사용할지, 모든 이벤트를 사용할지 선택해야 하며 둘 다 사용할 수는 없습니다. + +이 부분은 건너뛰셔도 좋습니다. /// -## `startup` 이벤트 +*시작*과 *종료* 동안 실행될 이 로직을 정의하는 대체 방법이 있습니다. + +애플리케이션이 시작되기 전에 또는 종료될 때 실행해야 하는 이벤트 핸들러(함수)를 정의할 수 있습니다. -응용 프로그램을 시작하기 전에 실행하려는 함수를 "startup" 이벤트로 선언합니다: +이 함수들은 `async def` 또는 일반 `def`로 선언할 수 있습니다. + +### `startup` 이벤트 + +애플리케이션이 시작되기 전에 실행되어야 하는 함수를 추가하려면, `"startup"` 이벤트로 선언합니다: {* ../../docs_src/events/tutorial001.py hl[8] *} -이 경우 `startup` 이벤트 핸들러 함수는 단순히 몇 가지 값으로 구성된 `dict` 형식의 "데이터베이스"를 초기화합니다. +이 경우, `startup` 이벤트 핸들러 함수는 "database"라는 항목(단지 `dict`)을 일부 값으로 초기화합니다. -하나 이상의 이벤트 핸들러 함수를 추가할 수도 있습니다. +여러 개의 이벤트 핸들러 함수를 추가할 수 있습니다. -그리고 응용 프로그램은 모든 `startup` 이벤트 핸들러가 완료될 때까지 요청을 받지 않습니다. +애플리케이션은 모든 `startup` 이벤트 핸들러가 완료될 때까지 요청을 받기 시작하지 않습니다. -## `shutdown` 이벤트 +### `shutdown` 이벤트 -응용 프로그램이 종료될 때 실행하려는 함수를 추가하려면 `"shutdown"` 이벤트로 선언합니다: +애플리케이션이 종료될 때 실행되어야 하는 함수를 추가하려면, `"shutdown"` 이벤트로 선언합니다: {* ../../docs_src/events/tutorial002.py hl[6] *} -이 예제에서 `shutdown` 이벤트 핸들러 함수는 `"Application shutdown"`이라는 텍스트가 적힌 `log.txt` 파일을 추가할 것입니다. +여기서, `shutdown` 이벤트 핸들러 함수는 `"Application shutdown"`이라는 텍스트를 `log.txt` 파일에 기록합니다. /// info | 정보 -`open()` 함수에서 `mode="a"`는 "추가"를 의미합니다. 따라서 이미 존재하는 파일의 내용을 덮어쓰지 않고 새로운 줄을 추가합니다. +`open()` 함수에서 `mode="a"`는 "추가"를 의미하므로, 파일에 있는 기존 내용은 덮어쓰지 않고 새로운 줄이 추가됩니다. /// /// tip | 팁 -이 예제에서는 파일과 상호작용 하기 위해 파이썬 표준 함수인 `open()`을 사용하고 있습니다. +이 경우, 우리는 표준 파이썬 `open()` 함수를 사용하여 파일과 상호작용하고 있습니다. -따라서 디스크에 데이터를 쓰기 위해 "대기"가 필요한 I/O (입력/출력) 작업을 수행합니다. +따라서 I/O(입출력) 작업이 포함되어 있어 디스크에 기록되는 것을 "기다리는" 과정이 필요합니다. -그러나 `open()`은 `async`와 `await`을 사용하지 않기 때문에 이벤트 핸들러 함수는 `async def`가 아닌 표준 `def`로 선언하고 있습니다. +하지만 `open()`은 `async`와 `await`를 사용하지 않습니다. + +그래서 우리는 이벤트 핸들러 함수를 `async def` 대신 일반 `def`로 선언합니다. /// +### `startup`과 `shutdown`을 함께 사용 + +*시작*과 *종료* 로직이 연결될 가능성이 높습니다. 예를 들어, 무언가를 시작한 후 끝내거나, 자원을 획득한 후 해제하는 등의 작업을 할 수 있습니다. + +이러한 작업을 별도의 함수로 처리하면 서로 로직이나 변수를 공유하지 않기 때문에 더 어려워집니다. 값들을 전역 변수에 저장하거나 비슷한 트릭을 사용해야 할 수 있습니다. + +그렇기 때문에 위에서 설명한 대로 `lifespan`을 사용하는 것이 권장됩니다. + +## 기술적 세부사항 + +호기심 많은 분들을 위한 기술적인 세부사항입니다. 🤓 + +ASGI 기술 사양에 따르면, 이는 Lifespan Protocol의 일부이며, `startup`과 `shutdown`이라는 이벤트를 정의합니다. + /// info | 정보 -이벤트 핸들러에 관한 내용은 Starlette 이벤트 문서에서 추가로 확인할 수 있습니다. +Starlette의 `lifespan` 핸들러에 대해 더 읽고 싶다면 Starlette의 Lifespan 문서에서 확인할 수 있습니다. + +이 문서에는 코드의 다른 영역에서 사용할 수 있는 lifespan 상태를 처리하는 방법도 포함되어 있습니다. /// + +## 서브 애플리케이션 + +🚨 이 lifespan 이벤트(`startup`과 `shutdown`)는 메인 애플리케이션에 대해서만 실행되며, [서브 애플리케이션 - Mounts](sub-applications.md){.internal-link target=_blank}에는 실행되지 않음을 유의하세요. From 57a7a706f3faeff2f8cc2e30fc230995a730fdf3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:34:17 +0000 Subject: [PATCH 092/138] =?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 4364e367d..a20041b48 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Update Korean translation for `docs/ko/docs/advanced/events.md`. PR [#13487](https://github.com/fastapi/fastapi/pull/13487) by [@bom1215](https://github.com/bom1215). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/handling-errors.md` page. PR [#13420](https://github.com/fastapi/fastapi/pull/13420) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-form-models.md`. PR [#13552](https://github.com/fastapi/fastapi/pull/13552) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). * 📝 Fix internal anchor link in Spanish deployment docs. PR [#13737](https://github.com/fastapi/fastapi/pull/13737) by [@fabianfalon](https://github.com/fabianfalon). From 44c83dda0bd0aab1c5e54e7a8f0807add65040d6 Mon Sep 17 00:00:00 2001 From: Valentyn Date: Fri, 30 May 2025 16:34:34 +0300 Subject: [PATCH 093/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/cors.md`=20page=20(#13519)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/uk/docs/tutorial/cors.md | 89 +++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 docs/uk/docs/tutorial/cors.md diff --git a/docs/uk/docs/tutorial/cors.md b/docs/uk/docs/tutorial/cors.md new file mode 100644 index 000000000..95b204d0f --- /dev/null +++ b/docs/uk/docs/tutorial/cors.md @@ -0,0 +1,89 @@ +# CORS (Обмін ресурсами між різними джерелами) + +CORS або "Обмін ресурсами між різними джерелами" є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому "джерелі" (origin). + +## Джерело (Origin) + +Джерело визначається комбінацією протоколу (`http`, `https`), домену (`myapp.com`, `localhost`, `localhost.tiangolo.com`), порту (`80`, `443`, `8080`). + + +Наприклад, такі адреси вважаються різними джерелами: + +* `http://localhost` +* `https://localhost` +* `http://localhost:8080` + +Навіть якщо вони всі містять `localhost`, вони мають різні протоколи або порти, що робить їх окремими "джерелами". + +## Кроки + +Припустимо, що Ваш фронтенд працює в браузері на `http://localhost:8080`, а його JavaScript намагається відправити запит до бекенду, який працює на `http://localhost` (Оскільки ми не вказуємо порт, браузер за замовчуванням припускає порт `80`). + +Потім браузер надішле HTTP-запит `OPTIONS` до бекенду на порту `:80`, і якщо бекенд надішле відповідні заголовки, що дозволяють комунікацію з цього іншого джерела (`http://localhost:8080`), тоді браузер на порту `:8080` дозволить JavaScript у фронтенді надіслати свій запит до бекенду на порту `:80`. + +Щоб досягти цього, бекенд на порту `:80` повинен мати список "дозволених джерел". + +У цьому випадку список має містити `http://localhost:8080`, щоб фронтенд на порту `:8080` працював коректно. + +## Символьне підставляння + +Можна також оголосити список як `"*"` ("символьне підставляння"), що означає дозвіл для всіх джерел. + +Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, такі як ті, що використовуються з Bearer токенами тощо. + +Тому для коректної роботи краще явно вказувати дозволені джерела. + +## Використання `CORSMiddleware` + +Ви можете налаштувати це у Вашому додатку **FastAPI** за допомогою `CORSMiddleware`. + +* Імпортуйте `CORSMiddleware`. +* Створіть список дозволених джерел (у вигляді рядків). +* Додайте його як "middleware" у Ваш додаток **FastAPI**. + + +Також можна вказати, чи дозволяє Ваш бекенд: + +* Облікові дані (заголовки авторизації, сookies, тощо). +* Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"` +* Конкретні HTTP-заголовки або всі за допомогою `"*"`. + + +{* ../../docs_src/cors/tutorial001.py hl[2,6:11,13:19] *} + +Параметри за замовчуванням у `CORSMiddleware` є досить обмеженими, тому Вам потрібно явно вказати конкретні джерела, методи або заголовки, щоб браузери могли використовувати їх у контексті запитів між різними доменами. + + +Підтримуються такі аргументи: + +* `allow_origins` - Список джерел, яким дозволено здійснювати міждоменні запити. Наприклад `['https://example.org', 'https://www.example.org']`. Ви можете використовувати ['*'], щоб дозволити всі джерела. +* `allow_origin_regex` - Рядок регулярного виразу для відповідності джерелам, яким дозволено здійснювати міждоменні запити. Наприклад, `'https://.*\.example\.org'`. +* `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи. +* `allow_headers` - Список HTTP-заголовків, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для простих CORS-запитів. +* `allow_credentials` - Визначає, чи підтримуються файли cookie для міждоменних запитів. За замовчуванням `False`. Також, якщо потрібно дозволити обмін обліковими даними (`allow_credentials = True`), параметр `allow_origins` не може бути встановлений як `['*']`, необхідно вказати конкретні джерела. +* `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`. +* `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`. + +Цей middleware обробляє два типи HTTP-запитів... + +### Попередні CORS-запити (preflight requests) + +Це будь-які `OPTIONS` - запити, що містять заголовки `Origin` та `Access-Control-Request-Method`. + +У такому випадку middleware перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей. + +### Прості запити + +Будь-які запити із заголовком `Origin`. У цьому випадку middleware пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь. + +## Додаткова інформація + +Більше про CORS можна дізнатися в документації Mozilla. + +/// note | Технічні деталі + +Також можна використовувати `from starlette.middleware.cors import CORSMiddleware`. + +**FastAPI** надає кілька middleware у `fastapi.middleware` для зручності розробників. Але більшість доступних middleware походять безпосередньо зі Starlette. + +/// From 45a40f8b1ce8f1c4ad6fdf0cdae226f886735902 Mon Sep 17 00:00:00 2001 From: Valentyn Date: Fri, 30 May 2025 16:34:53 +0300 Subject: [PATCH 094/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/background-tasks.md`=20pag?= =?UTF-8?q?e=20(#13502)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/uk/docs/tutorial/background-tasks.md | 85 +++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 docs/uk/docs/tutorial/background-tasks.md diff --git a/docs/uk/docs/tutorial/background-tasks.md b/docs/uk/docs/tutorial/background-tasks.md new file mode 100644 index 000000000..912ba8c2a --- /dev/null +++ b/docs/uk/docs/tutorial/background-tasks.md @@ -0,0 +1,85 @@ +# Фонові задачі + +Ви можете створювати фонові задачі, які будуть виконуватися *після* повернення відповіді. + +Це корисно для операцій, які потрібно виконати після обробки запиту, але клієнту не обов’язково чекати завершення цієї операції перед отриманням відповіді. + +Приклади використання: + +* Надсилання email-сповіщень після виконання певної дії: + * Підключення до поштового сервера та надсилання листа може займати кілька секунд. Ви можете відразу повернути відповідь, а email відправити у фоні. +* Обробка даних: + * Наприклад, якщо отримано файл, який потрібно обробити довготривалим процесом, можна повернути відповідь "Accepted" ("Прийнято", HTTP 202) і виконати обробку файлу у фоні. + +## Використання `BackgroundTasks` + +Спочатку імпортуйте `BackgroundTasks` і додайте його як параметр у Вашу *функцію операції шляху* (path operation function) до `BackgroundTasks`: + +{* ../../docs_src/background_tasks/tutorial001.py hl[1,13] *} + +**FastAPI** автоматично створить об'єкт `BackgroundTasks` і передасть його у цей параметр. + + +## Створення функції задачі + +Створіть функцію, яка буде виконувати фонову задачу. + +Це звичайна функція, яка може отримувати параметри. + +Вона може бути асинхронною `async def` або звичайною `def` функцією – **FastAPI** обробить її правильно. + +У нашому випадку функція записує у файл (імітуючи надсилання email). + +І оскільки операція запису не використовує `async` та `await`, ми визначаємо функцію як звичайну `def`: + +{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *} + +## Додавання фонової задачі + +Усередині Вашої *функції обробки шляху*, передайте функцію задачі в об'єкт *background tasks*, використовуючи метод `.add_task()`: + +{* ../../docs_src/background_tasks/tutorial001.py hl[14] *} + +`.add_task()` приймає аргументи: + +* Функція задача, яка буде виконуватися у фоновому режимі (`write_notification`). Зверніть увагу, що передається обʼєкт без дужок. +* Будь-яка послідовність аргументів, які потрібно передати у функцію завдання у відповідному порядку (`email`). +* Будь-які іменовані аргументи, які потрібно передати у функцію задачу (`message="some notification"`). + +## Впровадження залежностей + +Використання `BackgroundTasks` також працює з системою впровадження залежностей. Ви можете оголосити параметр типу `BackgroundTasks` на різних рівнях: у *функції операції шляху*, у залежності (dependable), у під залежності тощо. + +**FastAPI** знає, як діяти в кожному випадку і як повторно використовувати один і той самий об'єкт, щоб усі фонові задачі були об’єднані та виконувалися у фоновому режимі після завершення основного запиту. + +{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *} + +У цьому прикладі повідомлення будуть записані у файл `log.txt` *після* того, як відповідь буде надіслана. + +Якщо у запиті був переданий query-параметр, він буде записаний у лог у фоновій задачі. + +А потім інша фонова задача, яка створюється у *функції операції шляху*, запише повідомлення з використанням path параметра `email`. + +## Технічні деталі + +Клас `BackgroundTasks` походить безпосередньо з `starlette.background`. + +Він імпортується безпосередньо у FastAPI, щоб Ви могли використовувати його з `fastapi` і випадково не імпортували `BackgroundTask` (без s в кінці) з `starlette.background`. + +Якщо використовувати лише `BackgroundTasks` (а не `BackgroundTask`), то його можна передавати як параметр у *функції операції шляху*, і **FastAPI** подбає про все інше, так само як і про використання об'єкта `Request`. + +Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього Вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його. + +Детальніше можна почитати в офіційній документації Starlette про фонові задачі . + +## Застереження + +Якщо Вам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як Celery. + +Такі інструменти зазвичай потребують складнішої конфігурації та менеджера черги повідомлень/завдань, наприклад, RabbitMQ або Redis. Однак вони дозволяють виконувати фонові задачі в кількох процесах і навіть на кількох серверах. + +Якщо ж Вам потрібно отримати доступ до змінних і об’єктів із тієї ж **FastAPI** - програми або виконувати невеликі фонові завдання (наприклад, надсилати сповіщення електронною поштою), достатньо просто використовувати `BackgroundTasks`. + +## Підсумок + +Імпортуйте та використовуйте `BackgroundTasks` як параметр у *функціях операції шляху* та залежностях, щоб додавати фонові задачі. From c83a5bf14975a2aaec0c1ec1a0d14da51e5aaea2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:35:17 +0000 Subject: [PATCH 095/138] =?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 a20041b48..9bab975b5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/cors.md` page. PR [#13519](https://github.com/fastapi/fastapi/pull/13519) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Update Korean translation for `docs/ko/docs/advanced/events.md`. PR [#13487](https://github.com/fastapi/fastapi/pull/13487) by [@bom1215](https://github.com/bom1215). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/handling-errors.md` page. PR [#13420](https://github.com/fastapi/fastapi/pull/13420) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-form-models.md`. PR [#13552](https://github.com/fastapi/fastapi/pull/13552) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). From 950fb3f02d876a4ab6cad307dc0f4d4e9a83e8ab Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:35:25 +0000 Subject: [PATCH 096/138] =?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 9bab975b5..ef6420ff1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/background-tasks.md` page. PR [#13502](https://github.com/fastapi/fastapi/pull/13502) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/cors.md` page. PR [#13519](https://github.com/fastapi/fastapi/pull/13519) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Update Korean translation for `docs/ko/docs/advanced/events.md`. PR [#13487](https://github.com/fastapi/fastapi/pull/13487) by [@bom1215](https://github.com/bom1215). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/handling-errors.md` page. PR [#13420](https://github.com/fastapi/fastapi/pull/13420) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). From 3337c3b9be8154804935e529f22fd50b3956ec37 Mon Sep 17 00:00:00 2001 From: Valentyn Date: Fri, 30 May 2025 16:35:33 +0300 Subject: [PATCH 097/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/middleware.md`=20page=20(#?= =?UTF-8?q?13520)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/uk/docs/tutorial/middleware.md | 75 +++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 docs/uk/docs/tutorial/middleware.md diff --git a/docs/uk/docs/tutorial/middleware.md b/docs/uk/docs/tutorial/middleware.md new file mode 100644 index 000000000..807be484a --- /dev/null +++ b/docs/uk/docs/tutorial/middleware.md @@ -0,0 +1,75 @@ +# Middleware (Проміжний шар) + +У **FastAPI** можна додавати middleware (проміжний шар). + +"Middleware" — це функція, яка працює з кожним **запитом** перед його обробкою будь-якою конкретною *операцією шляху* (*path operation*), а також з кожною **відповіддю** перед її поверненням. + +* Middleware отримує кожен **запит**, що надходить до Вашого застосунку. +* Може виконати певні дії із цим **запитом** або запустити необхідний код. +* Далі передає **запит** для обробки основним застосунком (*операцією шляху*). +* Отримує **відповідь**, сформовану застосунком (*операцією шляху*). +* Може змінити цю **відповідь** або виконати додатковий код. +* Повертає **відповідь** клієнту. + +/// note | Технічні деталі + +Якщо у Вас є залежності з `yield`, код виходу виконається *після* middleware. + +Якщо були заплановані фонові задачі (background tasks - розглянуто далі), вони виконаються *після* всіх middleware. + +/// + +## Створення middleware + +Щоб створити middleware, Ви використовуєте декоратор `@app.middleware("http")` на функції. + +Функція middleware отримує: + +* `Запит`. +* Функцію `call_next`, яка приймає `запит` як параметр. + * Ця функція передає `запит` відповідній *операції шляху*. + * Потім вона повертає `відповідь`, згенеровану цією *операцією шляху*. + +* Ви можете ще змінити `відповідь` перед тим, як повернути її. + + +{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *} + +/// tip | Порада + +Не забувайте, що власні заголовки можна додавати, використовуючи префікс 'X-'. + +Але якщо у Вас є власні заголовки, які Ви хочете, щоб браузерний клієнт міг побачити, потрібно додати їх до Вашої конфігурації CORS (див. [CORS (Обмін ресурсами між різними джерелами)](cors.md){.internal-link target=_blank} за допомогою параметра `expose_headers`, описаного в документації Starlette по CORS. + +/// + +/// note | Технічні деталі + +Ви також можете використати `from starlette.requests import Request`. + +**FastAPI** надає це для Вашої зручності як розробника. Але він походить безпосередньо зі Starlette. + +/// + +### До і після `response`(`відповіді`) + +Ви можете додати код, який буде виконуватися з `запитом` (`request`), до того, як його обробить будь-яка *операція шляху* (*path operation*). + +Також Ви можете додати код, який буде виконуватися після того, як `відповідь` (`response`) буде згенеровано, перед тим як його повернути. + +Наприклад, Ви можете додати власний заголовок `X-Process-Time`, який міститиме час у секундах, який витратився на обробку запиту та генерацію відповіді: + +{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *} + + +/// tip | Підказка + +Тут ми використовуємо `time.perf_counter()` замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓 + +/// + +## Інші middlewares + +Ви можете пізніше прочитати більше про інші middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}. + +Ви дізнаєтесь, як обробляти CORS за допомогою middleware в наступному розділі. From d6b8b8f59066101296d1bac270247c22d9a2912a Mon Sep 17 00:00:00 2001 From: Valentyn Date: Fri, 30 May 2025 16:35:49 +0300 Subject: [PATCH 098/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/path-params-numeric-valida?= =?UTF-8?q?tions.md`=20page=20(#13548)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../path-params-numeric-validations.md | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 docs/uk/docs/tutorial/path-params-numeric-validations.md diff --git a/docs/uk/docs/tutorial/path-params-numeric-validations.md b/docs/uk/docs/tutorial/path-params-numeric-validations.md new file mode 100644 index 000000000..281ee183c --- /dev/null +++ b/docs/uk/docs/tutorial/path-params-numeric-validations.md @@ -0,0 +1,165 @@ +# Path Параметри та валідація числових даних + +Так само як Ви можете оголошувати додаткові перевірки та метадані для query параметрів за допомогою `Query`, Ви можете оголошувати той самий тип перевірок і метаданих для параметрів шляху за допомогою `Path`. + +## Імпорт Path + +Спочатку імпортуйте `Path` з `fastapi` і імпортуйте `Annotated`: + +{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *} + +/// info | Інформація + +FastAPI додав підтримку `Annotated` (і почав рекомендувати його використання) у версії 0.95.0. + +Якщо у Вас стара версія, при спробі використати `Annotated` можуть виникати помилки. + +Переконайтеся, що Ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} принаймні до версії 0.95.1 перед використанням `Annotated`. + +/// + +## Оголошення метаданих + +Ви можете оголошувати всі ті ж параметри, що і для `Query`. + +Наприклад, щоб оголосити значення метаданих `title` для параметра шляху `item_id`, Ви можете написати: + +{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[10] *} + +/// note | Примітка + +Параметр шляху завжди є обов’язковим, оскільки він має бути частиною шляху. Навіть якщо Ви оголосите його зі значенням `None` або встановите значення за замовчуванням — він все одно залишатиметься обов’язковим. + +/// + +## Упорядковуйте параметри, як Вам потрібно + +/// tip | Підказка + +Це, мабуть, не настільки важливо або необхідно, якщо Ви використовуєте `Annotated`. + +/// + +Припустимо, Ви хочете оголосити параметр запиту `q` як обов’язковий `str`. + +І Вам не потрібно оголошувати нічого іншого для цього параметра, тому немає потреби використовувати `Query`. + +Але Вам все одно потрібно використовувати `Path` для параметра шляху `item_id`. І з певних причин Ви не хочете використовувати `Annotated`. + +Python видасть помилку, якщо розмістити значення з "default" перед значенням, яке не має "default". + +Але Ви можете змінити порядок і розмістити значення без значення за замовчуванням (параметр запиту `q`) першим. + + +Для **FastAPI** порядок не має значення. Він визначає параметри за їх іменами, типами та значеннями за замовчуванням (`Query`, `Path` тощо) і не звертає уваги на порядок. + +Тому Ви можете оголосити Вашу функцію так: + +//// tab | Python 3.8 non-Annotated + +/// tip | Підказка + +За можливості віддавайте перевагу версії з використанням `Annotated`. + +/// + +{* ../../docs_src/path_params_numeric_validations/tutorial002.py hl[7] *} + +//// + +Але майте на увазі, що якщо Ви використовуєте `Annotated`, ця проблема не виникне, оскільки Ви не використовуєте значення за замовчуванням для параметрів `Query()` або `Path()`. + +{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *} + +## Упорядковуйте параметри за потребою, хитрощі + +/// tip | Підказка + +Це, мабуть, не настільки важливо або необхідно, якщо Ви використовуєте `Annotated`. + +/// + +Ось **невелика хитрість**, яка може стати в пригоді, хоча вона рідко знадобиться. + +Якщо Ви хочете: + +* оголосити параметр запиту `q` без використання `Query` або значення за замовчуванням +* оголосити параметр шляху `item_id`, використовуючи `Path` +* розмістити їх у різному порядку +* не використовувати `Annotated` + +...у Python є спеціальний синтаксис для цього. + +Передайте `*` як перший параметр функції. + +Python нічого не зробить із цією `*`, але розпізнає, що всі наступні параметри слід викликати як аргументи за ключовим словом (пари ключ-значення), також відомі як kwargs. Навіть якщо вони не мають значення за замовчуванням. + +{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *} + +### Краще з `Annotated` + +Майте на увазі, якщо Ви використовуєте `Annotated`, оскільки Ви не використовуєте значення за замовчуванням для параметрів функції, цієї проблеми не виникне, і, швидше за все, Вам не потрібно буде використовувати `*`. + +{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *} + +## Валідація числових даних: більше або дорівнює + +За допомогою `Query` і `Path` (та інших, які Ви побачите пізніше) можна оголошувати числові обмеження. + +Тут, завдяки `ge=1`, `item_id` має бути цілим числом, яке "`g`reater than or `e`qual" (більше або дорівнює) `1`. + +{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *} + +## Валідація числових даних: більше ніж і менше або дорівнює + +Те саме застосовується до: + +* `gt`: `g`reater `t`han (більше ніж) +* `le`: `l`ess than or `e`qual (менше або дорівнює) + +{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *} + +## Валідація числових даних: float, більше ніж і менше ніж + +Валідація чисел також працює для значень типу `float`. + +Ось де стає важливо мати можливість оголошувати gt, а не тільки ge. Це дозволяє, наприклад, вимагати, щоб значення було більше `0`, навіть якщо воно менше `1`. + +Таким чином, значення `0.5` буде допустимим. Але `0.0` або `0` — ні. + +Те саме стосується lt. + +{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *} + +## Підсумок + +За допомогою `Query`, `Path` (і інших параметрів, які Ви ще не бачили) можна оголошувати метадані та перевірки рядків, так само як у [Query параметри та валідація рядків](query-params-str-validations.md){.internal-link target=_blank}. + +Також можна оголошувати числові перевірки: + +* `gt`: `g`reater `t`han (більше ніж) +* `ge`: `g`reater than or `e`qual (більше або дорівнює) +* `lt`: `l`ess `t`han (менше ніж) +* `le`: `l`ess than or `e`qual (менше або дорівнює) + +/// info | Інформація + +`Query`, `Path` та інші класи, які Ви побачите пізніше, є підкласами спільного класу `Param`. + +Всі вони мають однакові параметри для додаткових перевірок і метаданих, які Ви вже бачили. + +/// + +/// note | Технічні деталі + +Коли Ви імпортуєте `Query`, `Path` та інші з `fastapi`, насправді це функції. + +При виклику вони повертають екземпляри класів з такими ж іменами. + +Тобто Ви імпортуєте `Query`, яка є функцією. А коли Ви її викликаєте, вона повертає екземпляр класу, який теж називається `Query`. + +Ці функції створені таким чином (замість використання класів напряму), щоб Ваш редактор не відзначав їхні типи як помилки. + +Таким чином, Ви можете користуватися своїм звичайним редактором і інструментами для програмування без додаткових налаштувань для ігнорування таких помилок. + +/// From 3855d808b0fd42766d23a3755ed3cb11217633c6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:36:27 +0000 Subject: [PATCH 099/138] =?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 ef6420ff1..ace5fdd5b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/middleware.md` page. PR [#13520](https://github.com/fastapi/fastapi/pull/13520) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/background-tasks.md` page. PR [#13502](https://github.com/fastapi/fastapi/pull/13502) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/cors.md` page. PR [#13519](https://github.com/fastapi/fastapi/pull/13519) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Update Korean translation for `docs/ko/docs/advanced/events.md`. PR [#13487](https://github.com/fastapi/fastapi/pull/13487) by [@bom1215](https://github.com/bom1215). From 57ed433befb782d45047944044ece386921cbd22 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:36:31 +0000 Subject: [PATCH 100/138] =?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 ace5fdd5b..0a9275dda 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/path-params-numeric-validations.md` page. PR [#13548](https://github.com/fastapi/fastapi/pull/13548) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/middleware.md` page. PR [#13520](https://github.com/fastapi/fastapi/pull/13520) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/background-tasks.md` page. PR [#13502](https://github.com/fastapi/fastapi/pull/13502) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/cors.md` page. PR [#13519](https://github.com/fastapi/fastapi/pull/13519) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). From 7ebcd8761cf98b6010d2f818105f30f3db58d0ce Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 15:36:54 +0200 Subject: [PATCH 101/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13736)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.10 → v0.11.11](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.10...v0.11.11) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2c7cee518..445676b8b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.10 + rev: v0.11.11 hooks: - id: ruff args: From bb05a685309817aab6b80f15ff7da9accecf87a9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:37:55 +0000 Subject: [PATCH 102/138] =?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 0a9275dda..1b9cbd687 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -41,6 +41,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13736](https://github.com/fastapi/fastapi/pull/13736) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 🔧 Update sponsors: Add InterviewPal. PR [#13728](https://github.com/fastapi/fastapi/pull/13728) by [@tiangolo](https://github.com/tiangolo). * 🔧 Remove Google Analytics. PR [#13727](https://github.com/fastapi/fastapi/pull/13727) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove MongoDB. PR [#13725](https://github.com/fastapi/fastapi/pull/13725) by [@tiangolo](https://github.com/tiangolo). From 645d6457378e89fc2b21123db13386197225496e Mon Sep 17 00:00:00 2001 From: timothy <53824764+timothy-jeong@users.noreply.github.com> Date: Fri, 30 May 2025 22:38:33 +0900 Subject: [PATCH 103/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/extra-models.md`=20(#13063)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/extra-models.md | 223 ++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 docs/ko/docs/tutorial/extra-models.md diff --git a/docs/ko/docs/tutorial/extra-models.md b/docs/ko/docs/tutorial/extra-models.md new file mode 100644 index 000000000..8e4559061 --- /dev/null +++ b/docs/ko/docs/tutorial/extra-models.md @@ -0,0 +1,223 @@ +# 추가 모델 + +지난 예제에 이어서, 연관된 모델을 여러개 갖는 것은 흔한 일입니다. + +특히 사용자 모델의 경우에 그러한데, 왜냐하면: + +* **입력 모델** 은 비밀번호를 가져야 합니다. +* **출력 모델** 은 비밀번호를 가지면 안됩니다. +* **데이터베이스 모델** 은 해시처리된 비밀번호를 가질 것입니다. + +/// danger | 위험 + +절대 사용자의 비밀번호를 평문으로 저장하지 마세요. 항상 이후에 검증 가능한 "안전한 해시(secure hash)"로 저장하세요. + +만약 이게 무엇인지 모르겠다면, [security chapters](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.에서 비밀번호 해시에 대해 배울 수 있습니다. + +/// + +## 다중 모델 + +아래는 비밀번호 필드와 해당 필드가 사용되는 위치를 포함하여, 각 모델들이 어떤 형태를 가질 수 있는지 전반적인 예시입니다: + +{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *} + + +/// info | 정보 + +Pydantic v1에서는 해당 메서드가 `.dict()`로 불렸으며, Pydantic v2에서는 `.model_dump()`로 이름이 변경되었습니다. `.dict()`는 여전히 지원되지만 더 이상 권장되지 않습니다. + +여기에서 사용하는 예제는 Pydantic v1과의 호환성을 위해 `.dict()`를 사용하지만, Pydantic v2를 사용할 수 있다면 `.model_dump()`를 사용하는 것이 좋습니다. + +/// + +### `**user_in.dict()` 에 대하여 + +#### Pydantic의 `.dict()` + +`user_in`은 Pydantic 모델 클래스인 `UserIn`입니다. + +Pydantic 모델은 모델 데이터를 포함한 `dict`를 반환하는 `.dict()` 메서드를 제공합니다. + +따라서, 다음과 같이 Pydantic 객체 `user_in`을 생성할 수 있습니다: + +```Python +user_in = UserIn(username="john", password="secret", email="john.doe@example.com") +``` + +그 다음, 다음과 같이 호출합니다: + +```Python +user_dict = user_in.dict() +``` + +이제 변수 `user_dict`에 데이터가 포함된 `dict`를 가지게 됩니다(이는 Pydantic 모델 객체가 아닌 `dict`입니다). + +그리고 다음과 같이 호출하면: + +```Python +print(user_dict) +``` + +Python의 `dict`가 다음과 같이 출력됩니다: + +```Python +{ + 'username': 'john', + 'password': 'secret', + 'email': 'john.doe@example.com', + 'full_name': None, +} +``` + +#### `dict` 언패킹(Unpacking) + +`user_dict`와 같은 `dict`를 함수(또는 클래스)에 `**user_dict`로 전달하면, Python은 이를 "언팩(unpack)"합니다. 이 과정에서 `user_dict`의 키와 값을 각각 키-값 인자로 직접 전달합니다. + +따라서, 위에서 생성한 `user_dict`를 사용하여 다음과 같이 작성하면: + +```Python +UserInDB(**user_dict) +``` + +다음과 같은 결과를 생성합니다: + +```Python +UserInDB( + username="john", + password="secret", + email="john.doe@example.com", + full_name=None, +) +``` + +혹은 더 정확히 말하자면, `user_dict`를 직접 사용하는 것은, 나중에 어떤 값이 추가되더라도 아래와 동일한 효과를 냅니다: + +```Python +UserInDB( + username = user_dict["username"], + password = user_dict["password"], + email = user_dict["email"], + full_name = user_dict["full_name"], +) +``` + +#### 다른 모델 데이터로 새 Pydantic 모델 생성 + +위의 예제에서 `user_in.dict()`로부터 `user_dict`를 생성한 것처럼, 아래 코드는: + +```Python +user_dict = user_in.dict() +UserInDB(**user_dict) +``` + +다음과 동일합니다: + +```Python +UserInDB(**user_in.dict()) +``` + +...왜냐하면 `user_in.dict()`는 `dict`이며, 이를 `**`로 Python이 "언팩(unpack)"하도록 하여 `UserInDB`에 전달하기 때문입니다. + +따라서, 다른 Pydantic 모델의 데이터를 사용하여 새로운 Pydantic 모델을 생성할 수 있습니다. + +#### `dict` 언패킹(Unpacking)과 추가 키워드 + +그리고 다음과 같이 추가 키워드 인자 `hashed_password=hashed_password`를 추가하면: + +```Python +UserInDB(**user_in.dict(), hashed_password=hashed_password) +``` + +다음과 같은 결과를 생성합니다: + +```Python +UserInDB( + username = user_dict["username"], + password = user_dict["password"], + email = user_dict["email"], + full_name = user_dict["full_name"], + hashed_password = hashed_password, +) +``` + +/// warning | 경고 + +추가적으로 제공된 함수 `fake_password_hasher`와 `fake_save_user`는 데이터 흐름을 시연하기 위한 예제일 뿐이며, 실제 보안을 제공하지 않습니다. + +/// + +## 중복 줄이기 + +코드 중복을 줄이는 것은 **FastAPI**의 핵심 아이디어 중 하나입니다. + +코드 중복은 버그, 보안 문제, 코드 비동기화 문제(한 곳은 업데이트되었지만 다른 곳은 업데이트되지 않는 문제) 등의 가능성을 증가시킵니다. + +그리고 이 모델들은 많은 데이터를 공유하면서 속성 이름과 타입을 중복하고 있습니다. + +더 나은 방법이 있습니다. + +`UserBase` 모델을 선언하여 다른 모델들의 기본(base)으로 사용할 수 있습니다. 그런 다음 이 모델을 상속받아 속성과 타입 선언(유형 선언, 검증 등)을 상속하는 서브클래스를 만들 수 있습니다. + +모든 데이터 변환, 검증, 문서화 등은 정상적으로 작동할 것입니다. + +이렇게 하면 각 모델 간의 차이점만 선언할 수 있습니다(평문 `password`가 있는 경우, `hashed_password`만 있는 경우, 혹은 비밀번호가 없는 경우): + +{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *} + +## `Union` 또는 `anyOf` + +두 가지 이상의 타입을 포함하는 `Union`으로 응답을 선언할 수 있습니다. 이는 응답이 그 중 하나의 타입일 수 있음을 의미합니다. + +OpenAPI에서는 이를 `anyOf`로 정의합니다. + +이를 위해 표준 Python 타입 힌트인 `typing.Union`을 사용할 수 있습니다: + +/// note | 참고 + +`Union`을 정의할때는 더 구체적인 타입을 먼저 포함하고, 덜 구체적인 타입을 그 뒤에 나열해야합니다. 아래 예제에서는 `Union[PlaneItem, CarItem]` 를 보면, 더 구체적인 `PlaneItem`이 `CarItem`보다 앞에 위치합니다. + +/// + +{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *} + + +### Python 3.10에서 `Union` + +위의 예제에서는 `response_model` 인자 값으로 `Union[PlaneItem, CarItem]`을 전달합니다. + +이 경우, 이를 **타입 어노테이션(type annotation)** 이 아닌 **인자 값(argument value)** 으로 전달하고 있기 때문에 Python 3.10에서도 `Union`을 사용해야 합니다. + +만약 타입 어노테이션에 사용한다면, 다음과 같이 수직 막대(|)를 사용할 수 있습니다: + +```Python +some_variable: PlaneItem | CarItem +``` + +하지만 이를 `response_model=PlaneItem | CarItem`과 같이 할당하면 에러가 발생합니다. 이는 Python이 이를 타입 어노테이션으로 해석하지 않고, `PlaneItem`과 `CarItem` 사이의 **잘못된 연산(invalid operation)**을 시도하기 때문입니다 + +## 모델 리스트 + +마찬가지로, 객체 리스트 형태의 응답을 선언할 수도 있습니다. + +이를 위해 표준 Python의 `typing.List`를 사용하세요(또는 Python 3.9 이상에서는 단순히 `list`를 사용할 수 있습니다): + +{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *} + + +## 임의의 `dict` 응답 + +Pydantic 모델을 사용하지 않고, 키와 값의 타입만 선언하여 평범한 임의의 `dict`로 응답을 선언할 수도 있습니다. + +이는 Pydantic 모델에 필요한 유효한 필드/속성 이름을 사전에 알 수 없는 경우에 유용합니다. + +이 경우, `typing.Dict`를 사용할 수 있습니다(또는 Python 3.9 이상에서는 단순히 `dict`를 사용할 수 있습니다): + +{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *} + + +## 요약 + +여러 Pydantic 모델을 사용하고, 각 경우에 맞게 자유롭게 상속하세요. + +엔터티가 서로 다른 "상태"를 가져야 하는 경우, 엔터티당 단일 데이터 모델을 사용할 필요는 없습니다. 예를 들어, 사용자 "엔터티"가 `password`, `password_hash`, 또는 비밀번호가 없는 상태를 포함할 수 있는 경우처럼 말입니다. From cadb7f5c3a085ce1a88795f4a377067b93370b5f Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 13:38:55 +0000 Subject: [PATCH 104/138] =?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 1b9cbd687..3164dbe79 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-models.md`. PR [#13063](https://github.com/fastapi/fastapi/pull/13063) by [@timothy-jeong](https://github.com/timothy-jeong). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/path-params-numeric-validations.md` page. PR [#13548](https://github.com/fastapi/fastapi/pull/13548) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/middleware.md` page. PR [#13520](https://github.com/fastapi/fastapi/pull/13520) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/background-tasks.md` page. PR [#13502](https://github.com/fastapi/fastapi/pull/13502) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). From 02ca76136596aa1089764e545a4f408075fb4ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B3=D0=BE=D1=80=20=D0=9E=D0=BD=D0=B8=D1=89=D1=83?= =?UTF-8?q?=D0=BA?= <120256301+EgorOnishchuk@users.noreply.github.com> Date: Fri, 30 May 2025 17:14:42 +0300 Subject: [PATCH 105/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?= =?UTF-8?q?ion=20for=20`docs/ru/docs/tutorial/cookie-param-models.md`=20(#?= =?UTF-8?q?13616)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/tutorial/cookie-param-models.md | 76 ++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 docs/ru/docs/tutorial/cookie-param-models.md diff --git a/docs/ru/docs/tutorial/cookie-param-models.md b/docs/ru/docs/tutorial/cookie-param-models.md new file mode 100644 index 000000000..3a57443bb --- /dev/null +++ b/docs/ru/docs/tutorial/cookie-param-models.md @@ -0,0 +1,76 @@ +# Модели параметров cookie + +Если у вас есть группа **cookies**, которые связаны между собой, вы можете создать **Pydantic-модель** для их объявления. 🍪 + +Это позволит вам **переиспользовать модель** в **разных местах**, а также объявить проверки и метаданные сразу для всех параметров. 😎 + +/// note | Заметка + +Этот функционал доступен с версии `0.115.0`. 🤓 + +/// + +/// tip | Совет + +Такой же подход применяется для `Query`, `Cookie`, и `Header`. 😎 + +/// + +## Pydantic-модель для cookies + +Объявите параметры **cookie**, которые вам нужны, в **Pydantic-модели**, а затем объявите параметр как `Cookie`: + +{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *} + +**FastAPI** **извлечёт** данные для **каждого поля** из **cookies**, полученных в запросе, и выдаст вам объявленную Pydantic-модель. + +## Проверка сгенерированной документации + +Вы можете посмотреть объявленные cookies в графическом интерфейсе Документации по пути `/docs`: + +
+ +
+ +/// info | Дополнительная информация + +Имейте в виду, что, поскольку **браузеры обрабатывают cookies** особым образом и под капотом, они **не** позволят **JavaScript** легко получить доступ к ним. + +Если вы перейдёте к **графическому интерфейсу документации API** по пути `/docs`, то сможете увидеть **документацию** по cookies для ваших *операций путей*. + +Но даже если вы **заполните данные** и нажмёте "Execute", поскольку графический интерфейс Документации работает с **JavaScript**, cookies не будут отправлены, и вы увидите сообщение об **ошибке** как будто не указывали никаких значений. + +/// + +## Запрет дополнительных cookies + +В некоторых случаях (не особо часто встречающихся) вам может понадобиться **ограничить** cookies, которые вы хотите получать. + +Теперь ваш API сам решает, принимать ли cookies. 🤪🍪 + +Вы можете сконфигурировать Pydantic-модель так, чтобы запретить (`forbid`) любые дополнительные (`extra`) поля: + +{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *} + +Если клиент попробует отправить **дополнительные cookies**, то в ответ он получит **ошибку**. + +Бедные баннеры cookies, они всеми силами пытаются получить ваше согласие — и всё ради того, чтобы API его отклонил. 🍪 + +Например, если клиент попытается отправить cookie `santa_tracker` со значением `good-list-please`, то в ответ он получит **ошибку**, сообщающую ему, что cookie `santa_tracker` не разрешён: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["cookie", "santa_tracker"], + "msg": "Extra inputs are not permitted", + "input": "good-list-please" + } + ] +} +``` + +## Заключение + +Вы можете использовать **Pydantic-модели** для объявления **cookies** в **FastAPI**. 😎 From be6cfd6cf508c2a4f699815be327e98c7b9ffe2c Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 14:15:08 +0000 Subject: [PATCH 106/138] =?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 3164dbe79..0d2601530 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/cookie-param-models.md`. PR [#13616](https://github.com/fastapi/fastapi/pull/13616) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-models.md`. PR [#13063](https://github.com/fastapi/fastapi/pull/13063) by [@timothy-jeong](https://github.com/timothy-jeong). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/path-params-numeric-validations.md` page. PR [#13548](https://github.com/fastapi/fastapi/pull/13548) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/middleware.md` page. PR [#13520](https://github.com/fastapi/fastapi/pull/13520) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). From e48c526b62b209923d77f96ac8aed143da2e7860 Mon Sep 17 00:00:00 2001 From: Valentyn Date: Fri, 30 May 2025 17:17:24 +0300 Subject: [PATCH 107/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/query-params-str-validatio?= =?UTF-8?q?ns.md`=20page=20(#13546)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorial/query-params-str-validations.md | 491 ++++++++++++++++++ 1 file changed, 491 insertions(+) create mode 100644 docs/uk/docs/tutorial/query-params-str-validations.md diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md new file mode 100644 index 000000000..cd3f4ad93 --- /dev/null +++ b/docs/uk/docs/tutorial/query-params-str-validations.md @@ -0,0 +1,491 @@ +# Query параметри та валідація рядків + +**FastAPI** дозволяє оголошувати додаткову інформацію та виконувати валідацію для Ваших параметрів. + +Розглянемо цей додаток як приклад: + +{* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *} + +Query параметр `q` має тип `str | None`, що означає, що він може бути як `str`, так і `None`. За замовчуванням він має значення `None`, тому FastAPI розуміє, що цей параметр не є обов'язковим. + +/// note | Примітка + +FastAPI знає, що `q` не є обов’язковим, завдяки значенню за замовчуванням `= None`. + +Використання `str | None` дозволить Вашому редактору коду надавати кращу підтримку та виявляти помилки. + +/// + +## Додаткова валідація + +Ми хочемо, щоб навіть якщо `q` є необов’язковим, **його довжина не перевищувала 50 символів**, якщо він все ж буде переданий. + +### Імпорт `Query` та `Annotated` + +Щоб це зробити, спочатку імпортуємо: + +* `Query` з `fastapi` +* `Annotated` з `typing` + +{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *} + +/// info | Інформація + +FastAPI додав підтримку `Annotated` (і почав рекомендувати його) у версії 0.95.0. + +Якщо у Вас старіша версія, під час використання `Annotated` можуть виникати помилки. + +Переконайтеся, що Ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} до принаймні 0.95.1, перш ніж використовувати `Annotated`. + +/// + +## Використання `Annotated` у типі параметра `q` + +Пам’ятаєте, як я раніше розповідав, що `Annotated` можна використовувати для додавання метаданих до параметрів у [Вступі до типів Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}? + +Зараз саме час використати його разом із FastAPI. 🚀 + +Раніше ми мали таку анотацію типу: + +//// tab | Python 3.10+ + +```Python +q: str | None = None +``` + +//// + +//// tab | Python 3.8+ + +```Python +q: Union[str, None] = None +``` + +//// + +Тепер ми загорнемо її у `Annotated`, і отримаємо: + +//// tab | Python 3.10+ + +```Python +q: Annotated[str | None] = None +``` + +//// + +//// tab | Python 3.8+ + +```Python +q: Annotated[Union[str, None]] = None +``` + +//// + +Обидві ці версії означають одне й те саме: `q` — це параметр, який може бути `str` або `None`, і за замовчуванням має значення `None`. + +А тепер переходимо до цікавого! 🎉 + +## Додавання `Query` до `Annotated` у параметр `q` + +Тепер, коли у нас є `Annotated`, де ми можемо додавати додаткову інформацію (зокрема валідацію), додамо `Query` всередину `Annotated` і встановимо параметр `max_length` у `50`: + +{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *} + +Зверніть увагу, що значення за замовчуванням усе ще `None`, тому параметр залишається необов'язковим. + +Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо **додаткову валідацію** для цього значення — воно має містити максимум 50 символів. 😎 + +/// tip | Підказка + +Ми використовуємо `Query()`, оскільки це **query параметр**. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`. + +/// + +Тепер FastAPI: + +* **Перевірить** дані, щоб переконатися, що їхня довжина не перевищує 50 символів +* Покажe **чітку помилку** клієнту, якщо дані недійсні +* **Задокументує** параметр в OpenAPI-схемі *операції шляху* (що відобразиться в **автоматично згенерованій документації**) + +## Альтернативний (застарілий) метод: Query як значення за замовчуванням + +У попередніх версіях FastAPI (до 0.95.0) `Query` використовувався як значення за замовчуванням для параметра, а не всередині `Annotated`. Ви, ймовірно, побачите код, який використовує цей підхід, тому варто розглянути його. + +/// tip | Підказка + +Для нового коду та коли це можливо, використовуйте `Annotated`, як показано вище. Це має багато переваг (пояснених нижче) і не має недоліків. 🍰 + +/// + +Раніше ми писали `Query()` як значення за замовчуванням для параметра функції, встановлюючи `max_length` у 50: + +{* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *} + +Оскільки в цьому випадку (без `Annotated`) нам потрібно замінити `None` у функції на `Query()`, тепер ми повинні явно встановити значення за замовчуванням через параметр `Query(default=None)`. Це виконує ту саму роль визначення значення за замовчуванням (принаймні для FastAPI). + +Таким чином: + +```Python +q: str | None = Query(default=None) +``` + +...робить параметр необов’язковим зі значенням за замовчуванням `None`, що еквівалентно: + + +```Python +q: str | None = None +``` +Але у версії з `Query` ми явно вказуємо, що це query параметр. + +Далі ми можемо передавати `Query` додаткові параметри, зокрема `max_length`, який застосовується до рядків: + +```Python +q: str | None = Query(default=None, max_length=50) +``` + +Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у схемі OpenAPI *операції шляху*. + +### `Query` як значення за замовчуванням або всередині `Annotated` + +Важливо пам’ятати, якщо використовувати `Query` всередині `Annotated`, не можна задавати параметр `default` у `Query`. + +Замість цього використовуйте значення за замовчуванням у самій функції. Інакше це буде нелогічно. + +Наприклад, цей варіант є некоректним: + +```Python +q: Annotated[str, Query(default="rick")] = "morty" +``` + +...тому, що не зрозуміло, яке значення має бути значенням за замовчуванням: `"rick"` чи `"morty"`. + +Коректні варіанти: + +```Python +q: Annotated[str, Query()] = "rick" +``` + +...або у старих кодових базах Ви знайдете: + +```Python +q: str = Query(default="rick") +``` + +### Переваги використання `Annotated` + +**Використання `Annotated` є рекомендованим** замість задання значення за замовчуванням у параметрах функції, оскільки воно **краще** з кількох причин. 🤓 + +Значення **за замовчуванням** параметра **функції** є його **фактичним значенням за замовчуванням**, що є більш інтуїтивним у Python загалом. 😌 + +Ви можете **викликати** ту саму функцію **в інших місцях** без FastAPI, і вона **працюватиме очікувано**. Якщо параметр є **обов’язковим** (без значення за замовчуванням), Ваш **редактор** повідомить про помилку, а **Python** також видасть помилку, якщо Ви виконаєте функцію без передавання цього параметра. + +Якщо Ви не використовуєте `Annotated`, а використовуєте **(старий) стиль значень за замовчуванням**, то при виклику цієї функції без FastAPI **в інших місцях**, потрібно **не забути** передати їй аргументи, інакше значення будуть відрізнятися від очікуваних (наприклад, Ви отримаєте `QueryInfo` або подібне замість `str`). Ваш редактор не повідомить про помилку, і Python також не видасть помилку при запуску функції, поки не виникне помилка під час виконання операцій усередині. + +Оскільки `Annotated` може містити кілька анотацій метаданих, Ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як Typer. 🚀 + +## Додавання додаткових валідацій + +Ви також можете додати параметр `min_length`: + +{* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *} + +## Додавання регулярних виразів + +Ви можете визначити регулярний вираз pattern, якому має відповідати параметр: + +{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *} + +Цей конкретний шаблон регулярного виразу перевіряє, що отримане значення параметра: + +* `^`: починається з наступних символів, перед якими немає інших символів. +* `fixedquery`: точно відповідає значенню `fixedquery`. +* `$`: закінчується тут, після `fixedquery` немає жодних символів. + +Якщо Ви почуваєтеся розгублено щодо **"регулярних виразів"**, не хвилюйтеся. Вони є складною темою для багатьох людей. Ви все одно можете зробити багато речей без їх використання. + +Але тепер Ви знаєте, що коли вони знадобляться, їх можна застосовувати у **FastAPI**. + +### Pydantic v1 `regex` замість `pattern` + +До версії Pydantic 2 і FastAPI 0.100.0 параметр називався `regex` замість `pattern`, але тепер він застарів. + +Ви все ще можете зустріти код, який використовує його: + +//// tab | Pydantic v1 + +{* ../../docs_src/query_params_str_validations/tutorial004_regex_an_py310.py hl[11] *} + +//// + +Але майте на увазі, що він є застарілим і його слід оновити до нового параметра `pattern`. 🤓 + +## Значення за замовчуванням + +Ви можете використовувати значення за замовчуванням, відмінні від `None`. + +Наприклад, якщо Ви хочете оголосити параметр запиту `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`: + +{* ../../docs_src/query_params_str_validations/tutorial005_an_py39.py hl[9] *} + +/// note | Технічні деталі + +Наявність значення за замовчуванням будь-якого типу, включаючи `None`, робить параметр необов’язковим (not required). + +/// + +## Обов’язкові параметри + +Якщо нам не потрібно вказувати додаткові перевірки або метадані, ми можемо зробити параметр `q` обов’язковим, просто не оголошуючи значення за замовчуванням, наприклад: + +```Python +q: str +``` + +замість: + +```Python +q: str | None = None +``` + +Але тепер ми оголошуємо його з `Query`, наприклад: + +//// tab | Annotated + +```Python +q: Annotated[str | None, Query(min_length=3)] = None +``` + +//// + +Тому, якщо Вам потрібно зробити значення обов’язковим, використовуючи `Query`, просто не вказуйте значення за замовчуванням: + +{* ../../docs_src/query_params_str_validations/tutorial006_an_py39.py hl[9] *} + +### Обов’язкове значення, яке може бути `None` + +Ви можете вказати, що параметр може приймати `None`, але при цьому залишається обов’язковим. Це змусить клієнтів надіслати значення, навіть якщо воно дорівнює `None`. + +Щоб зробити це, оголосіть, що `None` є допустимим типом, але не вказуйте значення за замовчуванням: + +{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *} + +## Список параметрів запиту / кілька значень + +Якщо Ви визначаєте параметр запиту за допомогою `Query`, Ви також можете дозволити отримання списку значень, тобто дозволити отримання кількох значень. + +Наприклад, щоб дозволити параметру запиту `q` з'являтися кілька разів в URL, можна написати: + +{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *} + +Тоді, у випадку запиту за URL: + +``` +http://localhost:8000/items/?q=foo&q=bar +``` + +Ви отримаєте кілька значень *query параметра* `q` (`foo` і `bar`) у вигляді списку `list` в Python у Вашій *функції обробки шляху*, у *параметрі функції* `q`. + +Отже, відповідь на цей URL буде: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +/// tip | Підказка + +Щоб оголосити параметр запиту з типом `list`, як у наведеному вище прикладі, потрібно явно використовувати `Query`, інакше він буде інтерпретований як тіло запиту. + +/// + +Інтерактивна API-документація оновиться відповідно, дозволяючи передавати кілька значень: + + + +### Список параметрів запиту / кілька значень за замовчуванням + +Ви також можете визначити значення за замовчуванням для `list`, якщо жодне значення не було передане: + +{* ../../docs_src/query_params_str_validations/tutorial012_an_py39.py hl[9] *} + +Якщо Ви перейдете за посиланням: + +``` +http://localhost:8000/items/ +``` + +то значення `q` за замовчуванням буде: `["foo", "bar"]`, і Ваша відповідь виглядатиме так: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +#### Використання тільки `list` + +Ви також можете використовувати `list` без уточнення типу, замість `list[str]`: + +{* ../../docs_src/query_params_str_validations/tutorial013_an_py39.py hl[9] *} + +/// note | Технічні деталі + +Майте на увазі, що в цьому випадку FastAPI не перевірятиме вміст списку. + +Наприклад, `list[int]` перевірятиме (і документуватиме), що всі елементи списку є цілими числами. Але `list` без уточнення цього не робитиме. + +/// + +## Додавання додаткових метаданих + +Ви можете додати більше інформації про параметр. + +Ця інформація буде включена у згенерований OpenAPI та використана в інтерфейсах документації та зовнішніх інструментах. + +/// note | Технічні деталі + +Майте на увазі, що різні інструменти можуть мати різний рівень підтримки OpenAPI. + +Деякі з них можуть ще не відображати всю додаткову інформацію, хоча в більшості випадків ця функція вже запланована для розробки. + +/// + +Ви можете додати `title` : + +{* ../../docs_src/query_params_str_validations/tutorial007_an_py310.py hl[10] *} + +А також `description`: + +{* ../../docs_src/query_params_str_validations/tutorial008_an_py310.py hl[14] *} + +## Аліаси параметрів + +Уявіть, що Ви хочете, щоб параметр називався `item-query`. + +Наприклад: + +``` +http://127.0.0.1:8000/items/?item-query=foobaritems +``` + +Але `item-query` — це некоректна назва змінної в Python. + +Найближчий допустимий варіант — `item_query`. + +Проте Вам потрібно, щоб параметр залишався саме `item-query`... + +У такому випадку можна оголосити `alias`, і саме він буде використовуватися для отримання значення параметра: + +{* ../../docs_src/query_params_str_validations/tutorial009_an_py310.py hl[9] *} + +## Виведення параметрів як застарілих + +Припустимо, що Ви більше не хочете використовувати цей параметр. + +Вам потрібно залишити його на деякий час, оскільки ним користуються клієнти, але Ви хочете, щоб документація чітко показувала, що він є застарілим. + +Тоді Ви можете передати параметр `deprecated=True` до `Query`: + +{* ../../docs_src/query_params_str_validations/tutorial010_an_py310.py hl[19] *} + +Документація буде показувати це таким чином: + + + +## Виняток параметрів з OpenAPI + +Щоб виключити параметр запиту зі згенерованої схеми OpenAPI (і, таким чином, з автоматичних систем документації), встановіть параметр `include_in_schema` для `Query` в `False`: + +{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *} + +## Кастомна валідація + +Можуть бути випадки, коли Вам потрібно провести **кастомну валідацію**, яку не можна реалізувати за допомогою параметрів, показаних вище. + +У таких випадках ви можете використати **кастомну функцію валідації**, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`). + +Це можна досягти за допомогою Pydantic's `AfterValidator` в середині `Annotated`. + +/// tip | Підказка + +Pydantic також має `BeforeValidator` та інші. 🤓 + +/// + +Наприклад, цей кастомний валідатор перевіряє, чи починається ID елемента з `isbn-` для номера книги ISBN або з `imdb-` для ID URL фільму на IMDB: + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *} + +/// info | Інформація + +Це доступно з версії Pydantic 2 або вище. 😎 + +/// + +/// tip | Підказка + +Якщо Вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким **зовнішнім компонентом**, таким як база даних чи інший API, ви повинні замість цього використовувати **FastAPI Dependencies**. Ви дізнаєтесь про них пізніше. + +Ці кастомні валідатори використовуються для речей, які можна перевірити лише з **тими даними**, що надані в запиті. + +/// + +### Зрозумійте цей код + +Головний момент – це використання **`AfterValidator` з функцією всередині `Annotated`**. Можете пропустити цю частину, якщо хочете. 🤸 + +--- + +Але якщо Вам цікаво розібратися в цьому конкретному прикладі коду і Вам ще не набридло, ось кілька додаткових деталей. + +#### Рядок із `value.startswith()` + +Звернули увагу? Рядок із `value.startswith()` може приймати кортеж, і тоді він перевірятиме кожне значення в кортежі: + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *} + +#### Випадковий елемент + +За допомогою `data.items()` ми отримуємо ітерабельний об'єкт із кортежами, що містять ключ і значення для кожного елемента словника. + +Ми перетворюємо цей ітерабельний об'єкт у звичайний `list` за допомогою `list(data.items())`. + +Потім, використовуючи `random.choice()`, ми можемо отримати випадкове значення зі списку, тобто отримуємо кортеж із `(id, name)`. Це може бути щось на зразок `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`. + +Далі ми **присвоюємо ці два значення** кортежу змінним `id` і `name`. + +Тож, якщо користувач не вказав ID елемента, він все одно отримає випадкову рекомендацію. + +...і все це реалізовано в **одному рядку коду**. 🤯 Хіба не прекрасний Python? 🐍 + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *} + +## Підсумок + +Ви можете оголошувати додаткові валідації та метаінформацію для своїх параметрів. + +Загальні валідації та метаінформація: + +* `alias` +* `title` +* `description` +* `deprecated` + +Валідації, специфічні для рядків: + +* `min_length` +* `max_length` +* `pattern` + +Кастомні валідації за допомогою `AfterValidator`. + +У цих прикладах Ви побачили, як оголошувати валідації для значень `str`. + +Дивіться наступні розділи, щоб дізнатися, як оголошувати валідації для інших типів, наприклад чисел. From b2d742074c41b4435775e0b24500eb0fe0cb2ed3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 30 May 2025 14:17:45 +0000 Subject: [PATCH 108/138] =?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 0d2601530..fa2ba1601 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-params-str-validations.md` page. PR [#13546](https://github.com/fastapi/fastapi/pull/13546) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/cookie-param-models.md`. PR [#13616](https://github.com/fastapi/fastapi/pull/13616) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-models.md`. PR [#13063](https://github.com/fastapi/fastapi/pull/13063) by [@timothy-jeong](https://github.com/timothy-jeong). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/path-params-numeric-validations.md` page. PR [#13548](https://github.com/fastapi/fastapi/pull/13548) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). From 751c7dc1799ec4a3979668b0d1899f080ca916f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 5 Jun 2025 08:48:55 +0200 Subject: [PATCH 109/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Contributors=20and=20Translators=20(#13749)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/contributors.yml | 6 ++-- docs/en/data/translation_reviewers.yml | 44 ++++++++++++++++---------- docs/en/data/translators.yml | 30 ++++++++++++------ 3 files changed, 50 insertions(+), 30 deletions(-) diff --git a/docs/en/data/contributors.yml b/docs/en/data/contributors.yml index 7da07d8a1..f3f7c9133 100644 --- a/docs/en/data/contributors.yml +++ b/docs/en/data/contributors.yml @@ -1,11 +1,11 @@ tiangolo: login: tiangolo - count: 734 + count: 747 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4 url: https://github.com/tiangolo dependabot: login: dependabot - count: 100 + count: 102 avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4 url: https://github.com/apps/dependabot alejsdev: @@ -15,7 +15,7 @@ alejsdev: url: https://github.com/alejsdev pre-commit-ci: login: pre-commit-ci - count: 27 + count: 30 avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4 url: https://github.com/apps/pre-commit-ci github-actions: diff --git a/docs/en/data/translation_reviewers.yml b/docs/en/data/translation_reviewers.yml index b544633fd..aad3e4fac 100644 --- a/docs/en/data/translation_reviewers.yml +++ b/docs/en/data/translation_reviewers.yml @@ -10,7 +10,7 @@ Xewus: url: https://github.com/Xewus sodaMelon: login: sodaMelon - count: 124 + count: 125 avatarUrl: https://avatars.githubusercontent.com/u/66295123?u=be939db90f1119efee9e6110cc05066ff1f40f00&v=4 url: https://github.com/sodaMelon ceb10n: @@ -646,7 +646,7 @@ riroan: MinLee0210: login: MinLee0210 count: 9 - avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=175010b24bc3a15a5705424badf9b18823bfd67d&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=3c4b6e9d69bff148d09fe022ddf867e564acaa44&v=4 url: https://github.com/MinLee0210 yodai-yodai: login: yodai-yodai @@ -723,6 +723,11 @@ minaton-ru: count: 8 avatarUrl: https://avatars.githubusercontent.com/u/53541518?u=67336ca11a85493f75031508aade588dad3b9910&v=4 url: https://github.com/minaton-ru +sungchan1: + login: sungchan1 + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/28076127?u=a816d86ef3e60450a7225f128caf9a394c9320f9&v=4 + url: https://github.com/sungchan1 Serrones: login: Serrones count: 7 @@ -768,11 +773,11 @@ d2a-raudenaerde: count: 7 avatarUrl: https://avatars.githubusercontent.com/u/5213150?v=4 url: https://github.com/d2a-raudenaerde -sungchan1: - login: sungchan1 +Zerohertz: + login: Zerohertz count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/28076127?u=a816d86ef3e60450a7225f128caf9a394c9320f9&v=4 - url: https://github.com/sungchan1 + avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=5ebf4d33e73b1ad373154f6cdee44f7cab4d05ba&v=4 + url: https://github.com/Zerohertz deniscapeto: login: deniscapeto count: 6 @@ -921,7 +926,7 @@ Wuerike: jvmazagao: login: jvmazagao count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/22477816?u=f3b2d503b53e6ec8c808f0601b756a063a07f06e&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/22477816?u=2b57addf5830906bf6ae5f25cd4c8c2fa5c2d68e&v=4 url: https://github.com/jvmazagao cun3yt: login: cun3yt @@ -1003,11 +1008,6 @@ devluisrodrigues: count: 5 avatarUrl: https://avatars.githubusercontent.com/u/103431660?u=d9674a3249edc4601d2c712cdebf899918503c3a&v=4 url: https://github.com/devluisrodrigues -Zerohertz: - login: Zerohertz - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=c6acda352c866b1747921e0ff8782b58571d849e&v=4 - url: https://github.com/Zerohertz 11kkw: login: 11kkw count: 5 @@ -1386,7 +1386,7 @@ tienduong-21: soroushgh1: login: soroushgh1 count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=e4d791c982cf7899c69f6baeebc4d7bbe86635d1&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/178516095?u=5e26f6a5f66cdb32d7b56e6ab362bf18ba7858b9&v=4 url: https://github.com/soroushgh1 zbellos: login: zbellos @@ -1508,11 +1508,11 @@ tyzh-dev: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/51972581?u=ba3882da7c009918a8e2d6b9ead31c89f09c922d&v=4 url: https://github.com/tyzh-dev -WaFeeAL: - login: WaFeeAL +yurkevich-dev: + login: yurkevich-dev count: 2 avatarUrl: https://avatars.githubusercontent.com/u/45145188?u=db2de8c186073d95693279dcf085fcebffab57d0&v=4 - url: https://github.com/WaFeeAL + url: https://github.com/yurkevich-dev emp7yhead: login: emp7yhead count: 2 @@ -1566,7 +1566,7 @@ raphaelauv: Fahad-Md-Kamal: login: Fahad-Md-Kamal count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/34704464?u=84abea85e59c30b2e3bc700ae42424f3fe704332&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/34704464?u=f96c6cbd25b06274e3ff96bc961ca91b3f876481&v=4 url: https://github.com/Fahad-Md-Kamal zxcq544: login: zxcq544 @@ -1733,6 +1733,11 @@ Heumhub: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/173761521?v=4 url: https://github.com/Heumhub +manumolina: + login: manumolina + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/2404208?u=fdc5502910f8dec814b2477f89587b9e45fac846&v=4 + url: https://github.com/manumolina logan2d5: login: logan2d5 count: 2 @@ -1768,6 +1773,11 @@ EgorOnishchuk: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4 url: https://github.com/EgorOnishchuk +iamantonreznik: + login: iamantonreznik + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/112612414?u=bf6de9a1ab17326fe14de0709719fff3826526d0&v=4 + url: https://github.com/iamantonreznik Azazul123: login: Azazul123 count: 2 diff --git a/docs/en/data/translators.yml b/docs/en/data/translators.yml index d8593f53f..51d05003b 100644 --- a/docs/en/data/translators.yml +++ b/docs/en/data/translators.yml @@ -13,6 +13,11 @@ ceb10n: count: 27 avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 url: https://github.com/ceb10n +valentinDruzhinin: + login: valentinDruzhinin + count: 24 + avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 + url: https://github.com/valentinDruzhinin tokusumi: login: tokusumi count: 23 @@ -33,11 +38,6 @@ waynerv: count: 20 avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4 url: https://github.com/waynerv -valentinDruzhinin: - login: valentinDruzhinin - count: 18 - avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4 - url: https://github.com/valentinDruzhinin AlertRED: login: AlertRED count: 16 @@ -328,6 +328,11 @@ nahyunkeem: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/174440096?u=e12401d492eee58570f8914d0872b52e421a776e&v=4 url: https://github.com/nahyunkeem +timothy-jeong: + login: timothy-jeong + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=db3d0cea2f5fab64d810113c5039a369699a2774&v=4 + url: https://github.com/timothy-jeong gerry-sabar: login: gerry-sabar count: 3 @@ -468,6 +473,11 @@ imtiaz101325: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/54007087?u=194d972b501b9ea9d2ddeaed757c492936e0121a&v=4 url: https://github.com/imtiaz101325 +fabianfalon: + login: fabianfalon + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/3700760?u=95f69e31280b17ac22299cdcd345323b142fe0af&v=4 + url: https://github.com/fabianfalon waketzheng: login: waketzheng count: 2 @@ -498,11 +508,6 @@ saeye: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/62229734?u=312d619db2588b60d5d5bde65260a2f44fdc6c76&v=4 url: https://github.com/saeye -timothy-jeong: - login: timothy-jeong - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/53824764?u=db3d0cea2f5fab64d810113c5039a369699a2774&v=4 - url: https://github.com/timothy-jeong 11kkw: login: 11kkw count: 2 @@ -513,3 +518,8 @@ yes0ng: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/25501794?u=3aed18b0d491e0220a167a1e9e58bea3638c6707&v=4 url: https://github.com/yes0ng +EgorOnishchuk: + login: EgorOnishchuk + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/120256301?v=4 + url: https://github.com/EgorOnishchuk From 54f255ecc8d199d53e58c6f01237511754352608 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 5 Jun 2025 06:49:21 +0000 Subject: [PATCH 110/138] =?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 fa2ba1601..53271fe1c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -44,6 +44,7 @@ hide: ### Internal +* 👥 Update FastAPI People - Contributors and Translators. PR [#13749](https://github.com/fastapi/fastapi/pull/13749) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13736](https://github.com/fastapi/fastapi/pull/13736) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 🔧 Update sponsors: Add InterviewPal. PR [#13728](https://github.com/fastapi/fastapi/pull/13728) by [@tiangolo](https://github.com/tiangolo). * 🔧 Remove Google Analytics. PR [#13727](https://github.com/fastapi/fastapi/pull/13727) by [@tiangolo](https://github.com/tiangolo). From c430ef1ac13f190a0d7669e394366ddd5eb75a47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 5 Jun 2025 08:58:14 +0200 Subject: [PATCH 111/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20-=20Sponsors=20(#13750)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/github_sponsors.yml | 106 ++++++++++++++----------------- 1 file changed, 47 insertions(+), 59 deletions(-) diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml index e24f64edc..efc5cbfcc 100644 --- a/docs/en/data/github_sponsors.yml +++ b/docs/en/data/github_sponsors.yml @@ -2,6 +2,9 @@ sponsors: - - login: renderinc avatarUrl: https://avatars.githubusercontent.com/u/36424661?v=4 url: https://github.com/renderinc + - login: Nixtla + avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4 + url: https://github.com/Nixtla - login: andrew-propelauth avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=c98993dec8553c09d424ede67bbe86e5c35f48c9&v=4 url: https://github.com/andrew-propelauth @@ -14,19 +17,22 @@ sponsors: - login: coderabbitai avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4 url: https://github.com/coderabbitai + - login: subtotal + avatarUrl: https://avatars.githubusercontent.com/u/176449348?v=4 + url: https://github.com/subtotal - login: porter-dev avatarUrl: https://avatars.githubusercontent.com/u/62078005?v=4 url: https://github.com/porter-dev - - login: Nixtla - avatarUrl: https://avatars.githubusercontent.com/u/79945230?v=4 - url: https://github.com/Nixtla - login: scalar avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4 url: https://github.com/scalar - - login: ObliviousAI avatarUrl: https://avatars.githubusercontent.com/u/65656077?v=4 url: https://github.com/ObliviousAI -- - login: svix +- - login: dribia + avatarUrl: https://avatars.githubusercontent.com/u/41189616?v=4 + url: https://github.com/dribia + - login: svix avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4 url: https://github.com/svix - login: stainless-api @@ -35,6 +41,9 @@ sponsors: - login: speakeasy-api avatarUrl: https://avatars.githubusercontent.com/u/91446104?v=4 url: https://github.com/speakeasy-api + - login: snapit-cypher + avatarUrl: https://avatars.githubusercontent.com/u/115662654?v=4 + url: https://github.com/snapit-cypher - login: databento avatarUrl: https://avatars.githubusercontent.com/u/64141749?v=4 url: https://github.com/databento @@ -68,6 +77,9 @@ sponsors: - - login: takashi-yoneya avatarUrl: https://avatars.githubusercontent.com/u/33813153?u=2d0522bceba0b8b69adf1f2db866503bd96f944e&v=4 url: https://github.com/takashi-yoneya + - login: Doist + avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4 + url: https://github.com/Doist - - login: mainframeindustries avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4 url: https://github.com/mainframeindustries @@ -83,18 +95,9 @@ sponsors: - - login: upciti avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4 url: https://github.com/upciti - - login: f4rk4sh - avatarUrl: https://avatars.githubusercontent.com/u/90454259?v=4 - url: https://github.com/f4rk4sh - - login: freddiev4 - avatarUrl: https://avatars.githubusercontent.com/u/8339018?u=1aad5b4f5a04cb750852b843d5e1d8f4ce339c2e&v=4 - url: https://github.com/freddiev4 - - login: samuelcolvin avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4 url: https://github.com/samuelcolvin - - login: vincentkoc - avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4 - url: https://github.com/vincentkoc - login: otosky avatarUrl: https://avatars.githubusercontent.com/u/42260747?u=69d089387c743d89427aa4ad8740cfb34045a9e0&v=4 url: https://github.com/otosky @@ -104,9 +107,6 @@ sponsors: - login: ashi-agrawal avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4 url: https://github.com/ashi-agrawal - - login: sepsi77 - avatarUrl: https://avatars.githubusercontent.com/u/18682303?v=4 - url: https://github.com/sepsi77 - login: RaamEEIL avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4 url: https://github.com/RaamEEIL @@ -125,9 +125,6 @@ sponsors: - login: ProteinQure avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 url: https://github.com/ProteinQure - - login: roboflow - avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4 - url: https://github.com/roboflow - login: kaoru0310 avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4 url: https://github.com/kaoru0310 @@ -146,6 +143,9 @@ sponsors: - login: logic-automation avatarUrl: https://avatars.githubusercontent.com/u/144732884?v=4 url: https://github.com/logic-automation + - login: roboflow + avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4 + url: https://github.com/roboflow - login: dudikbender avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4 url: https://github.com/dudikbender @@ -185,15 +185,18 @@ sponsors: - login: anomaly avatarUrl: https://avatars.githubusercontent.com/u/3654837?v=4 url: https://github.com/anomaly + - login: mj0331 + avatarUrl: https://avatars.githubusercontent.com/u/3890353?u=1c627ac1a024515b4871de5c3ebbfaa1a57f65d4&v=4 + url: https://github.com/mj0331 - login: gorhack avatarUrl: https://avatars.githubusercontent.com/u/4141690?u=ec119ebc4bdf00a7bc84657a71aa17834f4f27f3&v=4 url: https://github.com/gorhack - login: Ryandaydev avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4 url: https://github.com/Ryandaydev - - login: jaredtrog - avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 - url: https://github.com/jaredtrog + - login: vincentkoc + avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4 + url: https://github.com/vincentkoc - login: jstanden avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4 url: https://github.com/jstanden @@ -215,9 +218,6 @@ sponsors: - login: wshayes avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes - - login: gaetanBloch - avatarUrl: https://avatars.githubusercontent.com/u/583199?u=50c49e83d6b4feb78a091901ea02ead1462f442b&v=4 - url: https://github.com/gaetanBloch - login: koxudaxi avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4 url: https://github.com/koxudaxi @@ -227,9 +227,6 @@ sponsors: - login: mintuhouse avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4 url: https://github.com/mintuhouse - - login: oliverxchen - avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 - url: https://github.com/oliverxchen - login: TrevorBenson avatarUrl: https://avatars.githubusercontent.com/u/9167887?u=dccbea3327a57750923333d8ebf1a0b3f1948949&v=4 url: https://github.com/TrevorBenson @@ -254,6 +251,12 @@ sponsors: - login: mjohnsey avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4 url: https://github.com/mjohnsey + - login: jaredtrog + avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 + url: https://github.com/jaredtrog + - login: oliverxchen + avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 + url: https://github.com/oliverxchen - login: ternaus avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4 url: https://github.com/ternaus @@ -263,9 +266,6 @@ sponsors: - login: FernandoCelmer avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=58ba6d5888fa7f355934e52db19f950e20b38162&v=4 url: https://github.com/FernandoCelmer - - login: simw - avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4 - url: https://github.com/simw - login: Rehket avatarUrl: https://avatars.githubusercontent.com/u/7015688?u=3afb0ba200feebbc7f958950e92db34df2a3c172&v=4 url: https://github.com/Rehket @@ -299,6 +299,9 @@ sponsors: - login: hgalytoby avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4 url: https://github.com/hgalytoby + - login: browniebroke + avatarUrl: https://avatars.githubusercontent.com/u/861044?u=5abfca5588f3e906b31583d7ee62f6de4b68aa24&v=4 + url: https://github.com/browniebroke - login: joshuatz avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4 url: https://github.com/joshuatz @@ -317,12 +320,12 @@ sponsors: - login: rlnchow avatarUrl: https://avatars.githubusercontent.com/u/28018479?u=a93ca9cf1422b9ece155784a72d5f2fdbce7adff&v=4 url: https://github.com/rlnchow - - login: dvlpjrs - avatarUrl: https://avatars.githubusercontent.com/u/32254642?u=fbd6ad0324d4f1eb6231cf775be1c7bd4404e961&v=4 - url: https://github.com/dvlpjrs - login: engineerjoe440 avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4 url: https://github.com/engineerjoe440 + - login: lukzmu + avatarUrl: https://avatars.githubusercontent.com/u/175964415?u=83ea9b0b7b7b0f15bcb5747d93f303447a19a00b&v=4 + url: https://github.com/lukzmu - login: conservative-dude avatarUrl: https://avatars.githubusercontent.com/u/55538308?u=f250c44942ea6e73a6bd90739b381c470c192c11&v=4 url: https://github.com/conservative-dude @@ -335,12 +338,6 @@ sponsors: - login: PelicanQ avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4 url: https://github.com/PelicanQ - - login: tochikuji - avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 - url: https://github.com/tochikuji - - login: browniebroke - avatarUrl: https://avatars.githubusercontent.com/u/861044?u=5abfca5588f3e906b31583d7ee62f6de4b68aa24&v=4 - url: https://github.com/browniebroke - login: miguelgr avatarUrl: https://avatars.githubusercontent.com/u/1484589?u=54556072b8136efa12ae3b6902032ea2a39ace4b&v=4 url: https://github.com/miguelgr @@ -368,6 +365,9 @@ sponsors: - login: ceb10n avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4 url: https://github.com/ceb10n + - login: tochikuji + avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 + url: https://github.com/tochikuji - login: moonape1226 avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4 url: https://github.com/moonape1226 @@ -428,10 +428,7 @@ sponsors: - login: hcristea avatarUrl: https://avatars.githubusercontent.com/u/7814406?u=19092923a4ea5b338567961c8270b9206a6d81bb&v=4 url: https://github.com/hcristea -- - login: larsyngvelundin - avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4 - url: https://github.com/larsyngvelundin - - login: andrecorumba +- - login: andrecorumba avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4 url: https://github.com/andrecorumba - login: rwxd @@ -446,27 +443,18 @@ sponsors: - login: Olegt0rr avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4 url: https://github.com/Olegt0rr - - login: Miles-Arts - avatarUrl: https://avatars.githubusercontent.com/u/82297475?u=c41881e4b386d9dbf737218542b120336b5731a1&v=4 - url: https://github.com/Miles-Arts - - login: sandeepsalwan1 - avatarUrl: https://avatars.githubusercontent.com/u/118837112?u=fc9b0330fa4791950661b7decd9bf56f07599b43&v=4 - url: https://github.com/sandeepsalwan1 - - login: fabioantonioastore - avatarUrl: https://avatars.githubusercontent.com/u/132024075?u=b3a267f2e2c7ce2379f82163f88111bd2a2a2f1e&v=4 - url: https://github.com/fabioantonioastore - - login: zhandos256 - avatarUrl: https://avatars.githubusercontent.com/u/60260671?u=aa9ed698bc3cd06fb553d2ef91d3895bbb00cce1&v=4 - url: https://github.com/zhandos256 + - login: larsyngvelundin + avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4 + url: https://github.com/larsyngvelundin - login: one-st-one avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4 url: https://github.com/one-st-one + - login: federicsp + avatarUrl: https://avatars.githubusercontent.com/u/62903636?u=05004f4a2c590f1d18c200e17978bf2e17acb632&v=4 + url: https://github.com/federicsp - login: Toothwitch avatarUrl: https://avatars.githubusercontent.com/u/1710406?u=5eebb23b46cd26e48643b9e5179536cad491c17a&v=4 url: https://github.com/Toothwitch - - login: ssbarnea - avatarUrl: https://avatars.githubusercontent.com/u/102495?u=c7bd9ddf127785286fc939dd18cb02db0a453bce&v=4 - url: https://github.com/ssbarnea - login: andreagrandi avatarUrl: https://avatars.githubusercontent.com/u/636391?u=13d90cb8ec313593a5b71fbd4e33b78d6da736f5&v=4 url: https://github.com/andreagrandi From c3de47858c5e73bf01b14a2588fd819f89ca6a51 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 5 Jun 2025 06:58:39 +0000 Subject: [PATCH 112/138] =?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 53271fe1c..ffeebcce1 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -44,6 +44,7 @@ hide: ### Internal +* 👥 Update FastAPI People - Sponsors. PR [#13750](https://github.com/fastapi/fastapi/pull/13750) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13749](https://github.com/fastapi/fastapi/pull/13749) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13736](https://github.com/fastapi/fastapi/pull/13736) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 🔧 Update sponsors: Add InterviewPal. PR [#13728](https://github.com/fastapi/fastapi/pull/13728) by [@tiangolo](https://github.com/tiangolo). From e71d87d8ef00c6ff5e77366a29b10af4e59144ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 5 Jun 2025 09:29:13 +0200 Subject: [PATCH 113/138] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20GitHu?= =?UTF-8?q?b=20topic=20repositories=20(#13754)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/topic_repos.yml | 384 +++++++++++++++++------------------ 1 file changed, 192 insertions(+), 192 deletions(-) diff --git a/docs/en/data/topic_repos.yml b/docs/en/data/topic_repos.yml index 169b62694..1f6ae55bd 100644 --- a/docs/en/data/topic_repos.yml +++ b/docs/en/data/topic_repos.yml @@ -1,266 +1,266 @@ - name: full-stack-fastapi-template html_url: https://github.com/fastapi/full-stack-fastapi-template - stars: 32337 + stars: 33079 owner_login: fastapi owner_html_url: https://github.com/fastapi - name: Hello-Python html_url: https://github.com/mouredev/Hello-Python - stars: 29833 + stars: 30350 owner_login: mouredev owner_html_url: https://github.com/mouredev - name: serve html_url: https://github.com/jina-ai/serve - stars: 21544 + stars: 21593 owner_login: jina-ai owner_html_url: https://github.com/jina-ai -- name: sqlmodel - html_url: https://github.com/fastapi/sqlmodel - stars: 15799 - owner_login: fastapi - owner_html_url: https://github.com/fastapi - name: HivisionIDPhotos html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos - stars: 15676 + stars: 17229 owner_login: Zeyi-Lin owner_html_url: https://github.com/Zeyi-Lin +- name: sqlmodel + html_url: https://github.com/fastapi/sqlmodel + stars: 16068 + owner_login: fastapi + owner_html_url: https://github.com/fastapi - name: Douyin_TikTok_Download_API html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API - stars: 12183 + stars: 12689 owner_login: Evil0ctal owner_html_url: https://github.com/Evil0ctal - name: fastapi-best-practices html_url: https://github.com/zhanymkanov/fastapi-best-practices - stars: 11594 + stars: 11965 owner_login: zhanymkanov owner_html_url: https://github.com/zhanymkanov - name: awesome-fastapi html_url: https://github.com/mjhea0/awesome-fastapi - stars: 9586 + stars: 9773 owner_login: mjhea0 owner_html_url: https://github.com/mjhea0 - name: FastUI html_url: https://github.com/pydantic/FastUI - stars: 8804 + stars: 8829 owner_login: pydantic owner_html_url: https://github.com/pydantic - name: nonebot2 html_url: https://github.com/nonebot/nonebot2 - stars: 6688 + stars: 6779 owner_login: nonebot owner_html_url: https://github.com/nonebot - name: FileCodeBox html_url: https://github.com/vastsa/FileCodeBox - stars: 6502 + stars: 6652 owner_login: vastsa owner_html_url: https://github.com/vastsa - name: serge html_url: https://github.com/serge-chat/serge - stars: 5720 + stars: 5722 owner_login: serge-chat owner_html_url: https://github.com/serge-chat - name: hatchet html_url: https://github.com/hatchet-dev/hatchet - stars: 5515 + stars: 5607 owner_login: hatchet-dev owner_html_url: https://github.com/hatchet-dev -- name: fastapi-users - html_url: https://github.com/fastapi-users/fastapi-users - stars: 5162 - owner_login: fastapi-users - owner_html_url: https://github.com/fastapi-users - name: polar html_url: https://github.com/polarsource/polar - stars: 5119 + stars: 5327 owner_login: polarsource owner_html_url: https://github.com/polarsource +- name: fastapi-users + html_url: https://github.com/fastapi-users/fastapi-users + stars: 5235 + owner_login: fastapi-users + owner_html_url: https://github.com/fastapi-users +- name: fastapi_mcp + html_url: https://github.com/tadata-org/fastapi_mcp + stars: 5193 + owner_login: tadata-org + owner_html_url: https://github.com/tadata-org +- name: SurfSense + html_url: https://github.com/MODSetter/SurfSense + stars: 4833 + owner_login: MODSetter + owner_html_url: https://github.com/MODSetter - name: chatgpt-web-share html_url: https://github.com/chatpire/chatgpt-web-share - stars: 4302 + stars: 4307 owner_login: chatpire owner_html_url: https://github.com/chatpire - name: strawberry html_url: https://github.com/strawberry-graphql/strawberry - stars: 4244 + stars: 4281 owner_login: strawberry-graphql owner_html_url: https://github.com/strawberry-graphql -- name: fastapi_mcp - html_url: https://github.com/tadata-org/fastapi_mcp - stars: 4178 - owner_login: tadata-org - owner_html_url: https://github.com/tadata-org - name: atrilabs-engine html_url: https://github.com/Atri-Labs/atrilabs-engine - stars: 4112 + stars: 4110 owner_login: Atri-Labs owner_html_url: https://github.com/Atri-Labs - name: dynaconf html_url: https://github.com/dynaconf/dynaconf - stars: 3985 + stars: 4008 owner_login: dynaconf owner_html_url: https://github.com/dynaconf - name: poem html_url: https://github.com/poem-web/poem - stars: 3918 + stars: 3977 owner_login: poem-web owner_html_url: https://github.com/poem-web - name: farfalle html_url: https://github.com/rashadphz/farfalle - stars: 3287 + stars: 3317 owner_login: rashadphz owner_html_url: https://github.com/rashadphz - name: fastapi-admin html_url: https://github.com/fastapi-admin/fastapi-admin - stars: 3192 + stars: 3253 owner_login: fastapi-admin owner_html_url: https://github.com/fastapi-admin - name: datamodel-code-generator html_url: https://github.com/koxudaxi/datamodel-code-generator - stars: 3141 + stars: 3228 owner_login: koxudaxi owner_html_url: https://github.com/koxudaxi -- name: opyrator - html_url: https://github.com/ml-tooling/opyrator - stars: 3116 - owner_login: ml-tooling - owner_html_url: https://github.com/ml-tooling - name: LitServe html_url: https://github.com/Lightning-AI/LitServe - stars: 3088 + stars: 3175 owner_login: Lightning-AI owner_html_url: https://github.com/Lightning-AI - name: logfire html_url: https://github.com/pydantic/logfire - stars: 3059 + stars: 3172 owner_login: pydantic owner_html_url: https://github.com/pydantic -- name: docarray - html_url: https://github.com/docarray/docarray - stars: 3052 - owner_login: docarray - owner_html_url: https://github.com/docarray +- name: opyrator + html_url: https://github.com/ml-tooling/opyrator + stars: 3122 + owner_login: ml-tooling + owner_html_url: https://github.com/ml-tooling - name: huma html_url: https://github.com/danielgtaylor/huma - stars: 3025 + stars: 3110 owner_login: danielgtaylor owner_html_url: https://github.com/danielgtaylor +- name: docarray + html_url: https://github.com/docarray/docarray + stars: 3068 + owner_login: docarray + owner_html_url: https://github.com/docarray - name: fastapi-realworld-example-app html_url: https://github.com/nsidnev/fastapi-realworld-example-app - stars: 2883 + stars: 2892 owner_login: nsidnev owner_html_url: https://github.com/nsidnev +- name: Kokoro-FastAPI + html_url: https://github.com/remsky/Kokoro-FastAPI + stars: 2883 + owner_login: remsky + owner_html_url: https://github.com/remsky - name: uvicorn-gunicorn-fastapi-docker html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker - stars: 2756 + stars: 2770 owner_login: tiangolo owner_html_url: https://github.com/tiangolo - name: tracecat html_url: https://github.com/TracecatHQ/tracecat - stars: 2587 + stars: 2740 owner_login: TracecatHQ owner_html_url: https://github.com/TracecatHQ - name: best-of-web-python html_url: https://github.com/ml-tooling/best-of-web-python - stars: 2502 + stars: 2517 owner_login: ml-tooling owner_html_url: https://github.com/ml-tooling -- name: Kokoro-FastAPI - html_url: https://github.com/remsky/Kokoro-FastAPI - stars: 2500 - owner_login: remsky - owner_html_url: https://github.com/remsky - name: RasaGPT html_url: https://github.com/paulpierre/RasaGPT - stars: 2419 + stars: 2423 owner_login: paulpierre owner_html_url: https://github.com/paulpierre - name: fastapi-react html_url: https://github.com/Buuntu/fastapi-react - stars: 2350 + stars: 2376 owner_login: Buuntu owner_html_url: https://github.com/Buuntu -- name: nextpy - html_url: https://github.com/dot-agent/nextpy - stars: 2277 - owner_login: dot-agent - owner_html_url: https://github.com/dot-agent - name: FastAPI-template html_url: https://github.com/s3rius/FastAPI-template - stars: 2273 + stars: 2301 owner_login: s3rius owner_html_url: https://github.com/s3rius -- name: 30-Days-of-Python - html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python - stars: 2183 - owner_login: codingforentrepreneurs - owner_html_url: https://github.com/codingforentrepreneurs +- name: nextpy + html_url: https://github.com/dot-agent/nextpy + stars: 2289 + owner_login: dot-agent + owner_html_url: https://github.com/dot-agent - name: sqladmin html_url: https://github.com/aminalaee/sqladmin - stars: 2141 + stars: 2196 owner_login: aminalaee owner_html_url: https://github.com/aminalaee +- name: 30-Days-of-Python + html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python + stars: 2179 + owner_login: codingforentrepreneurs + owner_html_url: https://github.com/codingforentrepreneurs - name: langserve html_url: https://github.com/langchain-ai/langserve - stars: 2070 + stars: 2098 owner_login: langchain-ai owner_html_url: https://github.com/langchain-ai - name: fastapi-utils html_url: https://github.com/fastapiutils/fastapi-utils - stars: 2063 + stars: 2077 owner_login: fastapiutils owner_html_url: https://github.com/fastapiutils -- name: solara - html_url: https://github.com/widgetti/solara - stars: 2028 - owner_login: widgetti - owner_html_url: https://github.com/widgetti - name: supabase-py html_url: https://github.com/supabase/supabase-py - stars: 1996 + stars: 2047 owner_login: supabase owner_html_url: https://github.com/supabase +- name: solara + html_url: https://github.com/widgetti/solara + stars: 2044 + owner_login: widgetti + owner_html_url: https://github.com/widgetti - name: mangum html_url: https://github.com/Kludex/mangum - stars: 1870 + stars: 1905 owner_login: Kludex owner_html_url: https://github.com/Kludex - name: python-week-2022 html_url: https://github.com/rochacbruno/python-week-2022 - stars: 1827 + stars: 1823 owner_login: rochacbruno owner_html_url: https://github.com/rochacbruno -- name: SurfSense - html_url: https://github.com/MODSetter/SurfSense - stars: 1763 - owner_login: MODSetter - owner_html_url: https://github.com/MODSetter - name: manage-fastapi html_url: https://github.com/ycd/manage-fastapi - stars: 1743 + stars: 1754 owner_login: ycd owner_html_url: https://github.com/ycd - name: agentkit html_url: https://github.com/BCG-X-Official/agentkit - stars: 1741 + stars: 1746 owner_login: BCG-X-Official owner_html_url: https://github.com/BCG-X-Official - name: ormar html_url: https://github.com/collerek/ormar - stars: 1730 + stars: 1742 owner_login: collerek owner_html_url: https://github.com/collerek - name: langchain-serve html_url: https://github.com/jina-ai/langchain-serve - stars: 1631 + stars: 1630 owner_login: jina-ai owner_html_url: https://github.com/jina-ai - name: termpair html_url: https://github.com/cs01/termpair - stars: 1610 + stars: 1611 owner_login: cs01 owner_html_url: https://github.com/cs01 - name: piccolo html_url: https://github.com/piccolo-orm/piccolo - stars: 1588 + stars: 1609 owner_login: piccolo-orm owner_html_url: https://github.com/piccolo-orm - name: coronavirus-tracker-api @@ -270,137 +270,152 @@ owner_html_url: https://github.com/ExpDev07 - name: fastapi-cache html_url: https://github.com/long2ice/fastapi-cache - stars: 1552 + stars: 1575 owner_login: long2ice owner_html_url: https://github.com/long2ice - name: openapi-python-client html_url: https://github.com/openapi-generators/openapi-python-client - stars: 1536 + stars: 1568 owner_login: openapi-generators owner_html_url: https://github.com/openapi-generators - name: fastapi-crudrouter html_url: https://github.com/awtkns/fastapi-crudrouter - stars: 1491 + stars: 1508 owner_login: awtkns owner_html_url: https://github.com/awtkns - name: slowapi html_url: https://github.com/laurentS/slowapi - stars: 1450 + stars: 1501 owner_login: laurentS owner_html_url: https://github.com/laurentS - name: awesome-fastapi-projects html_url: https://github.com/Kludex/awesome-fastapi-projects - stars: 1443 + stars: 1453 owner_login: Kludex owner_html_url: https://github.com/Kludex - name: awesome-python-resources html_url: https://github.com/DjangoEx/awesome-python-resources - stars: 1387 + stars: 1390 owner_login: DjangoEx owner_html_url: https://github.com/DjangoEx -- name: budgetml - html_url: https://github.com/ebhy/budgetml - stars: 1341 - owner_login: ebhy - owner_html_url: https://github.com/ebhy - name: fastapi-pagination html_url: https://github.com/uriyyo/fastapi-pagination - stars: 1331 + stars: 1353 owner_login: uriyyo owner_html_url: https://github.com/uriyyo +- name: budgetml + html_url: https://github.com/ebhy/budgetml + stars: 1342 + owner_login: ebhy + owner_html_url: https://github.com/ebhy - name: fastapi-boilerplate html_url: https://github.com/teamhide/fastapi-boilerplate - stars: 1299 + stars: 1325 owner_login: teamhide owner_html_url: https://github.com/teamhide +- name: vue-fastapi-admin + html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin + stars: 1306 + owner_login: mizhexiaoxiao + owner_html_url: https://github.com/mizhexiaoxiao - name: fastapi-amis-admin html_url: https://github.com/amisadmin/fastapi-amis-admin - stars: 1235 + stars: 1256 owner_login: amisadmin owner_html_url: https://github.com/amisadmin - name: fastapi-tutorial html_url: https://github.com/liaogx/fastapi-tutorial - stars: 1222 + stars: 1245 owner_login: liaogx owner_html_url: https://github.com/liaogx -- name: vue-fastapi-admin - html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin - stars: 1190 - owner_login: mizhexiaoxiao - owner_html_url: https://github.com/mizhexiaoxiao - name: fastapi-code-generator html_url: https://github.com/koxudaxi/fastapi-code-generator - stars: 1180 + stars: 1201 owner_login: koxudaxi owner_html_url: https://github.com/koxudaxi +- name: bracket + html_url: https://github.com/evroon/bracket + stars: 1201 + owner_login: evroon + owner_html_url: https://github.com/evroon - name: bolt-python html_url: https://github.com/slackapi/bolt-python - stars: 1166 + stars: 1179 owner_login: slackapi owner_html_url: https://github.com/slackapi - name: fastapi_production_template html_url: https://github.com/zhanymkanov/fastapi_production_template - stars: 1134 + stars: 1147 owner_login: zhanymkanov owner_html_url: https://github.com/zhanymkanov -- name: langchain-extract - html_url: https://github.com/langchain-ai/langchain-extract - stars: 1127 - owner_login: langchain-ai - owner_html_url: https://github.com/langchain-ai -- name: odmantic - html_url: https://github.com/art049/odmantic - stars: 1115 - owner_login: art049 - owner_html_url: https://github.com/art049 - name: prometheus-fastapi-instrumentator html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator - stars: 1112 + stars: 1145 owner_login: trallnag owner_html_url: https://github.com/trallnag - name: bedrock-chat html_url: https://github.com/aws-samples/bedrock-chat - stars: 1107 + stars: 1143 owner_login: aws-samples owner_html_url: https://github.com/aws-samples +- name: langchain-extract + html_url: https://github.com/langchain-ai/langchain-extract + stars: 1134 + owner_login: langchain-ai + owner_html_url: https://github.com/langchain-ai +- name: odmantic + html_url: https://github.com/art049/odmantic + stars: 1118 + owner_login: art049 + owner_html_url: https://github.com/art049 - name: fastapi-alembic-sqlmodel-async html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async - stars: 1094 + stars: 1110 owner_login: jonra1993 owner_html_url: https://github.com/jonra1993 +- name: fastcrud + html_url: https://github.com/benavlabs/fastcrud + stars: 1080 + owner_login: benavlabs + owner_html_url: https://github.com/benavlabs - name: restish html_url: https://github.com/rest-sh/restish - stars: 1041 + stars: 1056 owner_login: rest-sh owner_html_url: https://github.com/rest-sh -- name: fastcrud - html_url: https://github.com/igorbenav/fastcrud - stars: 1036 - owner_login: igorbenav - owner_html_url: https://github.com/igorbenav -- name: runhouse - html_url: https://github.com/run-house/runhouse - stars: 1022 - owner_login: run-house - owner_html_url: https://github.com/run-house - name: fastapi_best_architecture html_url: https://github.com/fastapi-practices/fastapi_best_architecture - stars: 997 + stars: 1050 owner_login: fastapi-practices owner_html_url: https://github.com/fastapi-practices +- name: runhouse + html_url: https://github.com/run-house/runhouse + stars: 1034 + owner_login: run-house + owner_html_url: https://github.com/run-house +- name: autollm + html_url: https://github.com/viddexa/autollm + stars: 992 + owner_login: viddexa + owner_html_url: https://github.com/viddexa - name: lanarky html_url: https://github.com/ajndkr/lanarky stars: 990 owner_login: ajndkr owner_html_url: https://github.com/ajndkr -- name: autollm - html_url: https://github.com/viddexa/autollm - stars: 990 - owner_login: viddexa - owner_html_url: https://github.com/viddexa +- name: FastAPI-boilerplate + html_url: https://github.com/benavlabs/FastAPI-boilerplate + stars: 985 + owner_login: benavlabs + owner_html_url: https://github.com/benavlabs +- name: authx + html_url: https://github.com/yezz123/authx + stars: 938 + owner_login: yezz123 + owner_html_url: https://github.com/yezz123 - name: secure html_url: https://github.com/TypeError/secure - stars: 932 + stars: 935 owner_login: TypeError owner_html_url: https://github.com/TypeError - name: langcorn @@ -408,88 +423,73 @@ stars: 925 owner_login: msoedov owner_html_url: https://github.com/msoedov -- name: FastAPI-boilerplate - html_url: https://github.com/igorbenav/FastAPI-boilerplate - stars: 925 - owner_login: igorbenav - owner_html_url: https://github.com/igorbenav -- name: authx - html_url: https://github.com/yezz123/authx - stars: 913 - owner_login: yezz123 - owner_html_url: https://github.com/yezz123 - name: energy-forecasting html_url: https://github.com/iusztinpaul/energy-forecasting - stars: 907 + stars: 913 owner_login: iusztinpaul owner_html_url: https://github.com/iusztinpaul - name: titiler html_url: https://github.com/developmentseed/titiler - stars: 873 + stars: 886 owner_login: developmentseed owner_html_url: https://github.com/developmentseed +- name: flock + html_url: https://github.com/Onelevenvy/flock + stars: 866 + owner_login: Onelevenvy + owner_html_url: https://github.com/Onelevenvy - name: httpdbg html_url: https://github.com/cle-b/httpdbg - stars: 850 + stars: 863 owner_login: cle-b owner_html_url: https://github.com/cle-b - name: marker-api html_url: https://github.com/adithya-s-k/marker-api - stars: 844 + stars: 859 owner_login: adithya-s-k owner_html_url: https://github.com/adithya-s-k - name: ludic html_url: https://github.com/getludic/ludic - stars: 842 + stars: 845 owner_login: getludic owner_html_url: https://github.com/getludic -- name: flock - html_url: https://github.com/Onelevenvy/flock - stars: 805 - owner_login: Onelevenvy - owner_html_url: https://github.com/Onelevenvy -- name: fastapi-observability - html_url: https://github.com/blueswen/fastapi-observability - stars: 797 - owner_login: blueswen - owner_html_url: https://github.com/blueswen - name: fastapi-do-zero html_url: https://github.com/dunossauro/fastapi-do-zero - stars: 786 + stars: 827 owner_login: dunossauro owner_html_url: https://github.com/dunossauro +- name: fastapi-observability + html_url: https://github.com/blueswen/fastapi-observability + stars: 823 + owner_login: blueswen + owner_html_url: https://github.com/blueswen +- name: fastapi-langgraph-agent-production-ready-template + html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template + stars: 803 + owner_login: wassim249 + owner_html_url: https://github.com/wassim249 - name: fastapi-mail html_url: https://github.com/sabuhish/fastapi-mail - stars: 781 + stars: 798 owner_login: sabuhish owner_html_url: https://github.com/sabuhish - name: starlette-admin html_url: https://github.com/jowilf/starlette-admin - stars: 764 + stars: 785 owner_login: jowilf owner_html_url: https://github.com/jowilf - name: lccn_predictor html_url: https://github.com/baoliay2008/lccn_predictor - stars: 759 + stars: 767 owner_login: baoliay2008 owner_html_url: https://github.com/baoliay2008 +- name: aktools + html_url: https://github.com/akfamily/aktools + stars: 759 + owner_login: akfamily + owner_html_url: https://github.com/akfamily - name: KonomiTV html_url: https://github.com/tsukumijima/KonomiTV - stars: 741 + stars: 748 owner_login: tsukumijima owner_html_url: https://github.com/tsukumijima -- name: FastAPI-Backend-Template - html_url: https://github.com/Aeternalis-Ingenium/FastAPI-Backend-Template - stars: 734 - owner_login: Aeternalis-Ingenium - owner_html_url: https://github.com/Aeternalis-Ingenium -- name: learn-generative-ai - html_url: https://github.com/panaverse/learn-generative-ai - stars: 731 - owner_login: panaverse - owner_html_url: https://github.com/panaverse -- name: annotated-py-projects - html_url: https://github.com/hhstore/annotated-py-projects - stars: 730 - owner_login: hhstore - owner_html_url: https://github.com/hhstore From 7421a19b7f7039ebff2f7a04f7f23eabcd2390f2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 5 Jun 2025 07:29:36 +0000 Subject: [PATCH 114/138] =?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 ffeebcce1..a795f245c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -44,6 +44,7 @@ hide: ### Internal +* 👥 Update FastAPI GitHub topic repositories. PR [#13754](https://github.com/fastapi/fastapi/pull/13754) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13750](https://github.com/fastapi/fastapi/pull/13750) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13749](https://github.com/fastapi/fastapi/pull/13749) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13736](https://github.com/fastapi/fastapi/pull/13736) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). From 37c6913ce566706b4d5e1cbe10e6401fec4c5e3f Mon Sep 17 00:00:00 2001 From: Nazmus Sakib Sibly <101848801+SakibSibly@users.noreply.github.com> Date: Thu, 5 Jun 2025 14:15:56 +0600 Subject: [PATCH 115/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Bengali=20translat?= =?UTF-8?q?ion=20for=20`docs/bn/docs/environment-variables.md`=20(#13629)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add Bengali translation for docs/bn/docs/environment-variables.md Co-authored-by: Sofie Van Landeghem --- docs/bn/docs/environment-variables.md | 298 ++++++++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 docs/bn/docs/environment-variables.md diff --git a/docs/bn/docs/environment-variables.md b/docs/bn/docs/environment-variables.md new file mode 100644 index 000000000..9122ca5bf --- /dev/null +++ b/docs/bn/docs/environment-variables.md @@ -0,0 +1,298 @@ +# এনভায়রনমেন্ট ভেরিয়েবলস + +/// tip + +আপনি যদি "এনভায়রনমেন্ট ভেরিয়েবলস" কী এবং সেগুলো কীভাবে ব্যবহার করতে হয় সেটা জানেন, তাহলে এই অংশটি স্কিপ করে যেতে পারেন। + +/// + +এনভায়রনমেন্ট ভেরিয়েবল (সংক্ষেপে "**env var**" নামেও পরিচিত) হলো এমন একটি ভেরিয়েবল যা পাইথন কোডের **বাইরে**, **অপারেটিং সিস্টেমে** থাকে এবং আপনার পাইথন কোড (বা অন্যান্য প্রোগ্রাম) দ্বারা যাকে রিড করা যায়। + +এনভায়রনমেন্ট ভেরিয়েবলস অ্যাপ্লিকেশনের **সেটিংস** পরিচালনা করতে, পাইথনের **ইনস্টলেশন** প্রক্রিয়ার অংশ হিসেবে, ইত্যাদি কাজে উপযোগী হতে পারে। + +## Env Vars তৈরী এবং ব্যবহার + +আপনি **শেল (টার্মিনাল)**-এ, পাইথনের প্রয়োজন ছাড়াই, এনভায়রনমেন্ট ভেরিয়েবলস **তৈরি** এবং ব্যবহার করতে পারবেনঃ + +//// tab | লিনাক্স, ম্যাকওএস, উইন্ডোজ Bash + +
+ +```console +// আপনি চাইলে MY_NAME নামে একটি env var তৈরি করতে পারেন +$ export MY_NAME="Wade Wilson" + +// তারপরে এটিকে চাইলে অন্যান্য প্রোগ্রামে ব্যবহার করতে পারেন +$ echo "Hello $MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +//// tab | উইন্ডোজ পাওয়ারশেল + +
+ +```console +// MY_NAME নামে env var তৈরি +$ $Env:MY_NAME = "Wade Wilson" + +// অন্যান্য প্রোগ্রামে এটিকে ব্যবহার +$ echo "Hello $Env:MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +## পাইথনে env vars রিড করা + +আপনি চাইলে পাইথনের **বাইরে**, টার্মিনালে (বা অন্য কোনো উপায়ে) এনভায়রনমেন্ট ভেরিয়েবলস তৈরি করতে পারেন, এবং পরে সেগুলো **পাইথনে রিড** (অ্যাক্সেস করতে) পারেন। + +উদাহরণস্বরূপ, আপনার `main.py` নামে একটি ফাইল থাকতে পারেঃ + +```Python hl_lines="3" +import os + +name = os.getenv("MY_NAME", "World") +print(f"Hello {name} from Python") +``` + +/// tip + +`os.getenv()` এর দ্বিতীয় আর্গুমেন্টটি হলো এর ডিফল্ট ভ্যালু যা রিটার্ন করা হবে। + +যদি এটি দেওয়া না হয়, ডিফল্টভাবে `None` ব্যবহৃত হবে, এখানে আমরা ডিফল্ট ভ্যালু হিসেবে `"World"` ব্যবহার করেছি। + +/// + +তারপরে পাইথন প্রোগ্রামটিকে নিম্নোক্তভাবে কল করা যাবেঃ + +//// tab | লিনাক্স, ম্যাকওএস, উইন্ডোজ Bash + +
+ +```console +// এখনো আমরা এনভায়রনমেন্ট ভেরিয়েবল সেট করিনি +$ python main.py + +// যেহেতু env var সেট করা হয়নি, তাই আমরা ডিফল্ট ভ্যালু পাচ্ছি + +Hello World from Python + +// কিন্তু আমরা প্রথমে যদি একটা এনভায়রনমেন্ট ভারিয়েবল তৈরি করে নেই +$ export MY_NAME="Wade Wilson" + +// এবং তারপর আবার প্রোগ্রাটিকে কল করি +$ python main.py + +// এখন এটি এনভায়রনমেন্ট ভেরিয়েবল রিড করতে পারবে + +Hello Wade Wilson from Python +``` + +
+ +//// + +//// tab | উইন্ডোজ পাওয়ারশেল + +
+ +```console +// এখনো আমরা এনভায়রনমেন্ট ভেরিয়েবল সেট করিনি +$ python main.py + +// যেহেতু env var সেট করা হয়নি, তাই আমরা ডিফল্ট ভ্যালু পাচ্ছি + +Hello World from Python + +// কিন্তু আমরা প্রথমে যদি একটা এনভায়রনমেন্ট ভারিয়েবল তৈরি করে নেই +$ $Env:MY_NAME = "Wade Wilson" + +// এবং তারপর আবার প্রোগ্রাটিকে কল করি +$ python main.py + +// এখন এটি এনভায়রনমেন্ট ভেরিয়েবল রিড করতে পারবে + +Hello Wade Wilson from Python +``` + +
+ +//// + +যেহেতু এনভায়রনমেন্ট ভেরিয়েবলস কোডের বাইরে সেট করা যায়, কিন্তু পরবর্তীতে কোড দ্বারা রিড করা যায়, এবং বাকি ফাইলগুলোর সাথে রাখতে (`git` এ কমিট) হয় না, তাই কনফিগারেশনস বা **সেটিংস** এর জন্য এগুলো সাধারণত ব্যবহৃত হয়ে থাকে। + +আপনি একটি এনভায়রনমেন্ট ভেরিয়েবল শুধুমাত্র একটি **নির্দিষ্ট প্রোগ্রাম ইনভোকেশনের** জন্যও তৈরি করতে পারেন, যা শুধুমাত্র সেই প্রোগ্রামের জন্যই এভেইলেবল থাকবে এবং শুধুমাত্র তার চলাকালীন সময় পর্যন্তই সক্রিয় থাকবে। + +এটি করতে, প্রোগ্রামটি রান করার ঠিক আগেই, একই লাইনে এনভায়রনমেন্ট ভেরিয়েবল তৈরি করুন: + +
+ +```console +// প্রোগ্রামটি কল করার সময় একই লাইনে MY_NAME এনভায়রনমেন্ট ভেরিয়েবল তৈরি করুন +$ MY_NAME="Wade Wilson" python main.py + +// এখন এটি এনভায়রনমেন্ট ভ্যরিয়েবলটিকে রিড করতে পারবে + +Hello Wade Wilson from Python + +// পরবর্তীতে এনভায়রনমেন্ট ভেরিয়েবলটিকে আর ব্যবহার করা যাচ্ছে না +$ python main.py + +Hello World from Python +``` + +
+ +/// tip + +এটি নিয়ে আরো বিস্তারিত পড়তে পারেন এখানে The Twelve-Factor App: Config। + +/// + +## টাইপস এবং ভ্যালিডেশন + +এই এনভায়রনমেন্ট ভেরিয়েবলগুলো শুধুমাত্র **টেক্সট স্ট্রিংস** হ্যান্ডেল করতে পারে, যেহেতু এগুলো পাইথনের বাইরে অবস্থিত এবং অন্যান্য প্রোগ্রাম এবং সিস্টেমের বাকি অংশের (এমনকি বিভিন্ন অপারেটিং সিস্টেম যেমন লিনাক্স, উইন্ডোজ, ম্যাকওএস) সাথে সামঞ্জস্যপূর্ণ হতে হয়। + +এর অর্থ হচ্ছে পাইথনে এনভায়রনমেন্ট ভেরিয়েবল থেকে রিড করা **যেকোনো ভ্যালু** একটি `str` হবে, এবং অন্য কোনো টাইপে কনভার্সন বা যেকোনো ভেলিডেশন কোডে আলাদাভাবে করতে হবে। + +এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে **এপ্লিকেশন সেটিংস** হ্যান্ডেল করা নিয়ে আরো বিস্তারিত জানা যাবে [Advanced User Guide - Settings and Environment Variables](./advanced/settings.md){.internal-link target=_blank}. + +## `PATH` এনভায়রনমেন্ট ভেরিয়েবল + +**`PATH`** নামে একটি **বিশেষ** এনভায়রনমেন্ট ভেরিয়েবল রয়েছে, যেটি প্রোগ্রাম রান করার জন্য অপারেটিং সিস্টেমস (লিনাক্স, ম্যাকওএস, উইন্ডোজ) দ্বারা ব্যবহৃত হয়। + +`PATH` ভেরিয়েবল এর ভ্যালু হচ্ছে একটি বিশাল স্ট্রিং যা ডিরেক্টরিকে কোলন `:` দিয়ে আলাদা করার মাধ্যমে লিনাক্সে ও ম্যাকওএস এ, এবং সেমিকোলন `;` এর মাধ্যমে উইন্ডোজ এ তৈরি করা থাকে। + +উদাহরণস্বরূপ, `PATH` ভেরিয়েবল নিচের মতো দেখতে হতে পারেঃ + +//// tab | লিনাক্স, ম্যাকওএস + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin +``` + +তারমানে হলো সিস্টেম প্রোগ্রামগুলোকে নিচের ডিরেক্টরিগুলোতে খুঁজবেঃ + +* `/usr/local/bin` +* `/usr/bin` +* `/bin` +* `/usr/sbin` +* `/sbin` + +//// + +//// tab | উইন্ডোজ + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 +``` + +তারমানে হলো সিস্টেম প্রোগ্রামগুলোকে নিচের ডিরেক্টরিগুলোতে খুঁজবেঃ + +* `C:\Program Files\Python312\Scripts` +* `C:\Program Files\Python312` +* `C:\Windows\System32` + +//// + +যখন আপনি টার্মিনালে কোনো **কমান্ড** লিখবেন, অপারেটিং সিস্টেম **প্রত্যেকটি ডিরেক্টরিতে** প্রোগ্রামটি **খুঁজবে** যেগুলো `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ লিস্ট করা আছে। + +উদাহরণস্বরূপ, যখন আপনি টার্মিনালে `python` টাইপ করবেন, অপারেটিং সিস্টেম এই লিস্ট এর **প্রথম ডিরেক্টরিতে** `python` নামের একটি প্রোগ্রাম খুঁজবে। + +যদি এটি খুঁজে পায়, তাহলে এটি প্রোগ্রামটিকে ব্যবহার করবে। অন্যথায় এটি **অন্যান্য ডিরেক্টরিগুলোতে** এটিকে খুঁজতে থাকবে। + +### পাইথন ইনস্টল এবং `PATH` আপডেট + +যখন আপনি পাইথন ইনস্টল করেন, আপনি `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান কিনা সেটা জিজ্ঞেস করা হতে পারে। + +//// tab | লিনাক্স, ম্যাকওএস + +ধরা যাক আপনি পাইথন ইনস্টল করলেন এবং এটি `/opt/custompython/bin` ডিরেক্টরিতে ইনস্টল হচ্ছে। + +যদি আপনি "Yes" সিলেক্ট করে `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান, তাহলে ইনস্টলার `/opt/custompython/bin` কে `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ এড করে দিবে। + +এটা দেখতে এমনটা হতে পারেঃ + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin +``` + +এইভাবে, আপনি যখন টার্মিনালে `python` টাইপ করেন, সিস্টেম পাইথন প্রোগ্রামটিকে `/opt/custompython/bin` (সর্বশেষ ডিরেক্টরি) তে খুঁজে পাবে এবং এটাকে ব্যবহার করবে। + +//// + +//// tab | উইন্ডোজ + +ধরা যাক আপনি পাইথন ইনস্টল করলেন এবং এটি `C:\opt\custompython\bin` ডিরেক্টরিতে ইনস্টল হচ্ছে। + +যদি আপনি "Yes" সিলেক্ট করে `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান, তাহলে ইনস্টলার `C:\opt\custompython\bin` কে `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ এড করে দিবে। + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin +``` + +এইভাবে, আপনি যখন টার্মিনালে `python` টাইপ করেন, সিস্টেম পাইথন প্রোগ্রামটিকে `C:\opt\custompython\bin` (সর্বশেষ ডিরেক্টরি) তে খুঁজে পাবে এবং এটাকে ব্যবহার করবে। + +//// + +তাই, আপনি যদি টাইপ করেনঃ + +
+ +```console +$ python +``` + +
+ +//// tab | লিনাক্স, ম্যাকওএস + +সিস্টেম `python` প্রোগ্রামকে `/opt/custompython/bin` এ **খুঁজে পাবে** এবং এটাকে রান করবে। + +এটা মোটামুটিভাবে নিচের মতো করে লেখার সমান হবেঃ + +
+ +```console +$ /opt/custompython/bin/python +``` + +
+ +//// + +//// tab | উইন্ডোজ + +সিস্টেম `python` প্রোগ্রামকে `C:\opt\custompython\bin\python` এ **খুঁজে পাবে** এবং এটাকে রান করবে। + +এটা মোটামুটিভাবে নিচের মতো করে লেখার সমান হবেঃ + +
+ +```console +$ C:\opt\custompython\bin\python +``` + +
+ +//// + +এই তথ্যগুলো [ভার্চুয়াল এনভায়রনমেন্টস](virtual-environments.md){.internal-link target=_blank} শেখার ক্ষেত্রে সহায়ক হবে। + +## উপসংহার + +এর মাধ্যমে আপনি **এনভায়রনমেন্ট ভেরিয়েবলস** কি এবং এটিকে পাইথনে কিভাবে ব্যবহার করতে হয় তার সম্পর্কে বেসিক ধারনা পেলেন। + +চাইলে এই সম্পর্কে আরো বিস্তারিত পড়তে পারেন Wikipedia for Environment Variable এ। + +অনেক ক্ষেত্রে, দেখা মাত্রই এনভায়রনমেন্ট ভেরিয়েবল কীভাবে প্রয়োজন হবে তা স্পষ্ট হয় না। কিন্তু ডেভেলপমেন্টের সময় আপনি নানা রকম পরিস্থিতিতে এগুলোর সম্মুখীন হবেন, তাই এগুলো সম্পর্কে জেনে রাখা ভালো। + +উদাহরণস্বরূপ, আপনার এই ইনফরমেশনটি পরবর্তী, [ভার্চুয়াল এনভায়রনমেন্টস](virtual-environments.md) অংশে দরকার হবে। From 37e596599e6dcfb05b4a0180079c98eb991d5597 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 5 Jun 2025 08:16:18 +0000 Subject: [PATCH 116/138] =?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 a795f245c..377698649 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Bengali translation for `docs/bn/docs/environment-variables.md`. PR [#13629](https://github.com/fastapi/fastapi/pull/13629) by [@SakibSibly](https://github.com/SakibSibly). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-params-str-validations.md` page. PR [#13546](https://github.com/fastapi/fastapi/pull/13546) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/cookie-param-models.md`. PR [#13616](https://github.com/fastapi/fastapi/pull/13616) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-models.md`. PR [#13063](https://github.com/fastapi/fastapi/pull/13063) by [@timothy-jeong](https://github.com/timothy-jeong). From eae3025ed21d1e913986e5d752bc60dfff76a85b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jun 2025 12:00:47 +0200 Subject: [PATCH 117/138] =?UTF-8?q?=E2=AC=86=20Bump=20typer=20from=200.15.?= =?UTF-8?q?3=20to=200.16.0=20(#13752)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [typer](https://github.com/fastapi/typer) from 0.15.3 to 0.16.0. - [Release notes](https://github.com/fastapi/typer/releases) - [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md) - [Commits](https://github.com/fastapi/typer/compare/0.15.3...0.16.0) --- updated-dependencies: - dependency-name: typer dependency-version: 0.16.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-docs.txt b/requirements-docs.txt index bd0082304..9de608eb2 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -3,7 +3,7 @@ mkdocs-material==9.6.1 mdx-include >=1.4.1,<2.0.0 mkdocs-redirects>=1.2.1,<1.3.0 -typer == 0.15.3 +typer == 0.16.0 pyyaml >=5.3.1,<7.0.0 # For Material for MkDocs, Chinese search jieba==0.42.1 From b7a885066033d6e6dc86f93eded8fb1d22a6bbba Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 5 Jun 2025 10:01:12 +0000 Subject: [PATCH 118/138] =?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 377698649..1810527f7 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Internal +* ⬆ Bump typer from 0.15.3 to 0.16.0. PR [#13752](https://github.com/fastapi/fastapi/pull/13752) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👥 Update FastAPI GitHub topic repositories. PR [#13754](https://github.com/fastapi/fastapi/pull/13754) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13750](https://github.com/fastapi/fastapi/pull/13750) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Contributors and Translators. PR [#13749](https://github.com/fastapi/fastapi/pull/13749) by [@tiangolo](https://github.com/tiangolo). From 38c282039a1c7fe39a41bc41400ff4c3bac9a148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 5 Jun 2025 13:51:48 +0200 Subject: [PATCH 119/138] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20add?= =?UTF-8?q?=20Dribia=20(#13771)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/en/data/sponsors.yml | 3 +++ docs/en/data/sponsors_badge.yml | 1 + docs/en/docs/img/sponsors/dribia.png | Bin 0 -> 14770 bytes 4 files changed, 5 insertions(+) create mode 100644 docs/en/docs/img/sponsors/dribia.png diff --git a/README.md b/README.md index 78ae6b10e..da9446e2b 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 14a1f3cf3..897ca7b8d 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -48,6 +48,9 @@ silver: - url: https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring title: InterviewPal - AI Interview Coach for Engineers and Devs img: https://fastapi.tiangolo.com/img/sponsors/interviewpal.png + - url: https://dribia.com/en/ + title: Dribia - Data Science within your reach + img: https://fastapi.tiangolo.com/img/sponsors/dribia.png bronze: - url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source title: Biosecurity risk assessments made easy. diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index fd34019b3..d145e7372 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -42,3 +42,4 @@ logins: - coderabbitai - permitio - LambdaTest-Inc + - dribia diff --git a/docs/en/docs/img/sponsors/dribia.png b/docs/en/docs/img/sponsors/dribia.png new file mode 100644 index 0000000000000000000000000000000000000000..a6760a47b8acba1ac4ba5f13fa479f6daf1b9b02 GIT binary patch literal 14770 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 Date: Thu, 5 Jun 2025 11:52:34 +0000 Subject: [PATCH 120/138] =?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 1810527f7..b2f083e1c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -45,6 +45,7 @@ hide: ### Internal +* 🔧 Update sponsors: add Dribia. PR [#13771](https://github.com/fastapi/fastapi/pull/13771) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump typer from 0.15.3 to 0.16.0. PR [#13752](https://github.com/fastapi/fastapi/pull/13752) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👥 Update FastAPI GitHub topic repositories. PR [#13754](https://github.com/fastapi/fastapi/pull/13754) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People - Sponsors. PR [#13750](https://github.com/fastapi/fastapi/pull/13750) by [@tiangolo](https://github.com/tiangolo). From 736cce8329e79f7df2c0634762516c8f86bf0ad0 Mon Sep 17 00:00:00 2001 From: Valentyn Date: Thu, 5 Jun 2025 15:12:04 +0300 Subject: [PATCH 121/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/query-param-models.md`=20(?= =?UTF-8?q?#13748)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/query-param-models.md page * 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks * Update docs/uk/docs/tutorial/query-param-models.md Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com> --------- Co-authored-by: Valentyn Druzhynin Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com> --- docs/uk/docs/tutorial/query-param-models.md | 68 +++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 docs/uk/docs/tutorial/query-param-models.md diff --git a/docs/uk/docs/tutorial/query-param-models.md b/docs/uk/docs/tutorial/query-param-models.md new file mode 100644 index 000000000..97eb82fa1 --- /dev/null +++ b/docs/uk/docs/tutorial/query-param-models.md @@ -0,0 +1,68 @@ +# Моделі Query параметрів + +Якщо у Вас є група **query параметрів**, які пов’язані між собою, Ви можете створити **Pydantic-модель** для їх оголошення. + +Це дозволить Вам **повторно використовувати модель** у **різних місцях**, а також оголошувати перевірки та метадані для всіх параметрів одночасно. 😎 + +/// note | Примітка + +Ця можливість підтримується, починаючи з версії FastAPI `0.115.0`. 🤓 + +/// + +## Query параметри з Pydantic-моделлю + +Оголосіть **query параметри**, які Вам потрібні, у **Pydantic-моделі**, а потім оголосіть цей параметр як `Query`: + +{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *} + +**FastAPI** буде **витягувати** дані для **кожного поля** з **query параметрів** у запиті та передавати їх у визначену вами Pydantic-модель. + +## Перевірте документацію + +Ви можете побачити параметри запиту в UI документації за `/docs`: + +
+ +
+ +## Заборона зайвих Query параметрів + +У деяких особливих випадках (ймовірно, не дуже поширених) Ви можете захотіти **обмежити** query параметри, які дозволено отримувати. + +Ви можете використати конфігурацію моделі Pydantic, щоб заборонити (`forbid`) будь-які зайві (`extra`) поля: + +{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *} + +Якщо клієнт спробує надіслати **зайві** дані у **query параметрах**, він отримає **помилку**. + +Наприклад, якщо клієнт спробує надіслати query параметр `tool` зі значенням `plumbus`, як у цьому запиті: + +```http +https://example.com/items/?limit=10&tool=plumbus +``` + +Він отримає відповідь з **помилкою**, яка повідомить, що query параметр `tool ` не дозволено: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["query", "tool"], + "msg": "Extra inputs are not permitted", + "input": "plumbus" + } + ] +} +``` + +## Підсумок + +Ви можете використовувати **Pydantic-моделі** для оголошення **query параметрів** у **FastAPI**. 😎 + +/// tip | Підказка + +Спойлер: Ви також можете використовувати Pydantic-моделі для оголошення cookie та заголовків, але про це Ви дізнаєтеся пізніше в цьому посібнику. 🤫 + +/// From 2e2180809411b0235b24bba6a40b8151ade593d0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 5 Jun 2025 12:12:28 +0000 Subject: [PATCH 122/138] =?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 b2f083e1c..c4150413d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-param-models.md`. PR [#13748](https://github.com/fastapi/fastapi/pull/13748) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Bengali translation for `docs/bn/docs/environment-variables.md`. PR [#13629](https://github.com/fastapi/fastapi/pull/13629) by [@SakibSibly](https://github.com/SakibSibly). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-params-str-validations.md` page. PR [#13546](https://github.com/fastapi/fastapi/pull/13546) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/cookie-param-models.md`. PR [#13616](https://github.com/fastapi/fastapi/pull/13616) by [@EgorOnishchuk](https://github.com/EgorOnishchuk). From 2116d8aa564c9a70100225781f76ff2a7687bcd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Thu, 5 Jun 2025 14:27:20 +0200 Subject: [PATCH 123/138] =?UTF-8?q?=F0=9F=8D=B1=20Update=20sponsors:=20Dri?= =?UTF-8?q?bia=20badge=20size=20(#13773)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/img/sponsors/dribia.png | Bin 14770 -> 19211 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/docs/img/sponsors/dribia.png b/docs/en/docs/img/sponsors/dribia.png index a6760a47b8acba1ac4ba5f13fa479f6daf1b9b02..f40e140863503d7d35622acc061c60acce9b0d5b 100644 GIT binary patch literal 19211 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 Date: Thu, 5 Jun 2025 12:27:46 +0000 Subject: [PATCH 124/138] =?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 c4150413d..394b3fde6 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -46,6 +46,7 @@ hide: ### Internal +* 🍱 Update sponsors: Dribia badge size. PR [#13773](https://github.com/fastapi/fastapi/pull/13773) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: add Dribia. PR [#13771](https://github.com/fastapi/fastapi/pull/13771) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump typer from 0.15.3 to 0.16.0. PR [#13752](https://github.com/fastapi/fastapi/pull/13752) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👥 Update FastAPI GitHub topic repositories. PR [#13754](https://github.com/fastapi/fastapi/pull/13754) by [@tiangolo](https://github.com/tiangolo). From 9c4a1d2105c84e8115378fce68a4751a38d58834 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Jun 2025 18:10:20 +0200 Subject: [PATCH 125/138] =?UTF-8?q?=E2=AC=86=20Bump=20griffe-typingdoc=20f?= =?UTF-8?q?rom=200.2.7=20to=200.2.8=20(#13751)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [griffe-typingdoc](https://github.com/mkdocstrings/griffe-typingdoc) from 0.2.7 to 0.2.8. - [Release notes](https://github.com/mkdocstrings/griffe-typingdoc/releases) - [Changelog](https://github.com/mkdocstrings/griffe-typingdoc/blob/main/CHANGELOG.md) - [Commits](https://github.com/mkdocstrings/griffe-typingdoc/compare/0.2.7...0.2.8) --- updated-dependencies: - dependency-name: griffe-typingdoc dependency-version: 0.2.8 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> --- requirements-docs.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-docs.txt b/requirements-docs.txt index 9de608eb2..606314926 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -12,7 +12,7 @@ pillow==11.1.0 # For image processing by Material for MkDocs cairosvg==2.7.1 mkdocstrings[python]==0.26.1 -griffe-typingdoc==0.2.7 +griffe-typingdoc==0.2.8 # For griffe, it formats with black black==25.1.0 mkdocs-macros-plugin==1.3.7 From f7ab09884dd39e8c9bd090b97d66f51fd3a7f401 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 5 Jun 2025 16:10:42 +0000 Subject: [PATCH 126/138] =?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 394b3fde6..80beb2189 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -46,6 +46,7 @@ hide: ### Internal +* ⬆ Bump griffe-typingdoc from 0.2.7 to 0.2.8. PR [#13751](https://github.com/fastapi/fastapi/pull/13751) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🍱 Update sponsors: Dribia badge size. PR [#13773](https://github.com/fastapi/fastapi/pull/13773) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: add Dribia. PR [#13771](https://github.com/fastapi/fastapi/pull/13771) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump typer from 0.15.3 to 0.16.0. PR [#13752](https://github.com/fastapi/fastapi/pull/13752) by [@dependabot[bot]](https://github.com/apps/dependabot). From 7b3463de32cd751b68de885771fa9e07395fa537 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 6 Jun 2025 16:08:32 +0200 Subject: [PATCH 127/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13757)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.11 → v0.11.12](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.11...v0.11.12) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 445676b8b..21413fc66 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.11 + rev: v0.11.12 hooks: - id: ruff args: From 9ab43cc5eda66c7622ea8f4ecf70f76b7499d772 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 6 Jun 2025 14:08:55 +0000 Subject: [PATCH 128/138] =?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 80beb2189..2769abd8c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -46,6 +46,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13757](https://github.com/fastapi/fastapi/pull/13757) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ Bump griffe-typingdoc from 0.2.7 to 0.2.8. PR [#13751](https://github.com/fastapi/fastapi/pull/13751) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🍱 Update sponsors: Dribia badge size. PR [#13773](https://github.com/fastapi/fastapi/pull/13773) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: add Dribia. PR [#13771](https://github.com/fastapi/fastapi/pull/13771) by [@tiangolo](https://github.com/tiangolo). From 4b12a2818a7eb4ac45da8afedeb29d7030104f03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charlie=20=E2=9C=A8?= <18888351756@163.com> Date: Mon, 9 Jun 2025 12:15:17 +0800 Subject: [PATCH 129/138] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Remove=20redundant?= =?UTF-8?q?=20words=20in=20docs/zh/docs/python-types.md=20(#13774)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/python-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/zh/docs/python-types.md b/docs/zh/docs/python-types.md index 5126cb847..ba767da87 100644 --- a/docs/zh/docs/python-types.md +++ b/docs/zh/docs/python-types.md @@ -228,7 +228,7 @@ John Doe ## Pydantic 模型 -Pydantic 是一个用来用来执行数据校验的 Python 库。 +Pydantic 是一个用来执行数据校验的 Python 库。 你可以将数据的"结构"声明为具有属性的类。 From 37c8e7d76b4b47eb2c4cced6b4de59eb3d5f08eb Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 9 Jun 2025 04:15:43 +0000 Subject: [PATCH 130/138] =?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 2769abd8c..b5d7f8d3a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* ✏️ Remove redundant words in docs/zh/docs/python-types.md. PR [#13774](https://github.com/fastapi/fastapi/pull/13774) by [@CharleeWa](https://github.com/CharleeWa). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-param-models.md`. PR [#13748](https://github.com/fastapi/fastapi/pull/13748) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Bengali translation for `docs/bn/docs/environment-variables.md`. PR [#13629](https://github.com/fastapi/fastapi/pull/13629) by [@SakibSibly](https://github.com/SakibSibly). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-params-str-validations.md` page. PR [#13546](https://github.com/fastapi/fastapi/pull/13546) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). From 14a55d864d7c30c7933b4fb5ea16e724a59b54f2 Mon Sep 17 00:00:00 2001 From: Valentyn Date: Mon, 9 Jun 2025 22:35:48 +0300 Subject: [PATCH 131/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/schema-extra-example.md`?= =?UTF-8?q?=20(#13769)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 🌐 Add Ukrainian translation for docs/uk/docs/tutorial/schema-extra-example.md page * 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks --------- Co-authored-by: Valentyn Druzhynin Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/uk/docs/tutorial/schema-extra-example.md | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 docs/uk/docs/tutorial/schema-extra-example.md diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md new file mode 100644 index 000000000..853fd5e65 --- /dev/null +++ b/docs/uk/docs/tutorial/schema-extra-example.md @@ -0,0 +1,222 @@ +# Декларування прикладів вхідних даних + +Ви можете задати приклади даних, які Ваш застосунок може отримувати. + +Ось кілька способів, як це зробити. + +## Додаткові дані JSON-схеми в моделях Pydantic + +Ви можете задати `examples` для моделі Pydantic, які буде додано до згенерованої JSON-схеми. + +//// tab | Pydantic v2 + +{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} + +//// + +//// tab | Pydantic v1 + +{* ../../docs_src/schema_extra_example/tutorial001_pv1_py310.py hl[13:23] *} + +//// + +Ця додаткова інформація буде додана як є до **JSON-схеми**, і вона буде використовуватися в документації до API. + +//// tab | Pydantic v2 + +У версії Pydantic 2 використовується атрибут `model_config`, який приймає `dict`, як описано в документації Pydantic: Конфігурація. + +Ви можете встановити `"json_schema_extra"` як `dict`, що містить будь-які додаткові дані, які Ви хочете відобразити у згенерованій JSON-схемі, включаючи `examples`. + +//// + +//// tab | Pydantic v1 + +У версії Pydantic 1 використовується внутрішній клас `Config` і параметр `schema_extra`, як описано в документації Pydantic: Налаштування схеми. + +Ви можете задати `schema_extra` як `dict`, що містить будь-які додаткові дані, які Ви хочете бачити у згенерованій JSON-схемі, включаючи `examples`. + +//// + +/// tip | Підказка + +Ви можете використати ту ж техніку, щоб розширити JSON-схему і додати власну додаткову інформацію. + +Наприклад, Ви можете використати її для додавання метаданих для інтерфейсу користувача на фронтенді тощо. + +/// + +/// info | Інформація + +OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку `examples`, що є частиною стандарту **JSON-схеми**. + +До цього підтримувався лише ключ `example` з одним прикладом. Він все ще підтримується в OpenAPI 3.1.0, але є застарілим і не входить до стандарту JSON Schema. Тому рекомендується перейти з `example` на `examples`. 🤓 + +Більше про це можна прочитати в кінці цієї сторінки. + +/// + +## Додаткові аргументи `Field` + +Коли ви використовуєте `Field()` у моделях Pydantic, Ви також можете вказати додаткові `examples`: + +{* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *} + +## `examples` у JSON-схемі — OpenAPI + +При використанні будь-кого з наступного: + +* `Path()` +* `Query()` +* `Header()` +* `Cookie()` +* `Body()` +* `Form()` +* `File()` + +Ви також можете задати набір `examples` з додатковою інформацією, яка буде додана до їхніх **JSON-схем** у **OpenAPI**. + +### `Body` з `examples` + +Тут ми передаємо `examples`, які містять один приклад очікуваних даних у `Body()`: + +{* ../../docs_src/schema_extra_example/tutorial003_an_py310.py hl[22:29] *} + +### Приклад у UI документації + +За допомогою будь-якого з наведених вище методів це виглядатиме так у документації за `/docs`: + + + +### `Body` з кількома `examples` + +Звичайно, Ви також можете передати кілька `examples`: + +{* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *} + +Коли Ви це робите, приклади будуть частиною внутрішньої **JSON-схеми** для цих даних. + +Втім, на момент написання цього (26 серпня 2023), Swagger UI — інструмент, який відповідає за відображення UI документації — не підтримує показ кількох прикладів у **JSON-схеми**. Але нижче можна прочитати про обхідний шлях. + +### Специфічні для OpenAPI `examples` + +Ще до того, як **JSON-схема** почала підтримувати `examples`, OpenAPI вже мала підтримку поля з такою ж назвою — `examples`. + +Це **специфічне для OpenAPI** поле `examples` розміщується в іншій частині специфікації OpenAPI — у **деталях кожної *операції шляху***, а не всередині самої JSON-схеми. + +Swagger UI вже давно підтримує це поле `examples`. Тому Ви можете використовувати його, щоб **відображати** кілька **прикладів у документації**. + +Це поле `examples` у специфікації OpenAPI — це `dict` (словник) з **кількома прикладами** (а не список `list`), кожен із яких може містити додаткову інформацію, що буде додана до **OpenAPI**. + +Воно не включається до JSON Schema кожного параметра, а розміщується зовні, безпосередньо в *операції шляху*. + +### Використання параметра `openapi_examples` + +Ви можете оголосити специфічні для OpenAPI `examples` у FastAPI за допомогою параметра `openapi_examples` для: + +* `Path()` +* `Query()` +* `Header()` +* `Cookie()` +* `Body()` +* `Form()` +* `File()` + +Ключі словника (`dict`) ідентифікують кожен приклад, а кожне значення `dict` — кожен специфічний словник `dict` в `examples` може містити: + +* `summary`: короткий опис прикладу. +* `description`: розгорнутий опис (може містити Markdown). +* `value`: сам приклад, наприклад, словник (`dict`). +* `externalValue`: альтернатива `value`, URL-адреса, що вказує на приклад. Проте ця опція може не підтримуватися більшістю інструментів, на відміну від `value`. + +Використання виглядає так: + +{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *} + +### Приклади OpenAPI у UI документації + +З параметром `openapi_examples`, доданим до `Body()`, документація `/docs` виглядатиме так: + + + +## Технічні деталі + +/// tip | Підказка + +Якщо Ви вже використовуєте **FastAPI** версії **0.99.0 або вище**, Ви можете **пропустити** цей розділ. + +Він більш актуальний для старих версій, до появи OpenAPI 3.1.0. + +Можна вважати це коротким **історичним екскурсом** у OpenAPI та JSON Schema. 🤓 + +/// + +/// warning | Попередження + +Це дуже технічна інформація про стандарти **JSON Schema** і **OpenAPI**. + +Якщо вищезгадані ідеї вже працюють у Вас — можете не заглиблюватися в ці деталі. + +/// + +До OpenAPI 3.1.0 специфікація використовувала стару та модифіковану версію **JSON Schema**. + +Оскільки JSON Schema раніше не підтримувала `examples`, OpenAPI додала власне поле `examples`. + +OpenAPI також додала `example` і `examples` до інших частин специфікації: + +* `Parameter Object` (в специфікації) використовується FastAPI для: + * `Path()` + * `Query()` + * `Header()` + * `Cookie()` +* `Request Body Object`, в полі `content`, в `Media Type Object` (в специфікації) використовується FastAPI для: + * `Body()` + * `File()` + * `Form()` + +/// info | Інформація + +Цей старий параметр `examples`, специфічний для OpenAPI, тепер називається `openapi_examples`, починаючи з FastAPI версії `0.103.0`. + +/// + +### Поле `examples` у JSON Schema + +Пізніше JSON Schema додала поле `examples` у нову версію специфікації. + +І вже OpenAPI 3.1.0 базується на цій новій версії (JSON Schema 2020-12), яка включає поле `examples`. + +Тепер це поле `examples` є пріоритетним і замінює старе (і кастомне) поле `example`, яке стало застарілим. + +Нове поле `examples` у JSON Schema — це **просто список (`list`)** прикладів, без додаткових метаданих (на відміну від OpenAPI). + +/// info | Інформація + +Навіть після того, як з'явився OpenAPI 3.1.0, який підтримував examples у JSON Schema, інструмент Swagger UI ще деякий час не підтримував цю версію (підтримка з’явилась з версії 5.0.0 🎉). + +Через це версії FastAPI до 0.99.0 все ще використовували версії OpenAPI нижчі за 3.1.0. + +/// + +### `Examples` в Pydantic і FastAPI + +Коли Ви додаєте `examples` у модель Pydantic через `schema_extra` або `Field(examples=["something"])`, ці приклади додаються до **JSON Schema** цієї моделі. + +І ця **JSON Schema** Pydantic-моделі включається до **OpenAPI** Вашого API, а потім використовується в UI документації (docs UI). + +У версіях FastAPI до 0.99.0 (починаючи з 0.99.0 використовується новіший OpenAPI 3.1.0), коли Ви використовували `example` або `examples` з іншими утилітами (`Query()`, `Body()` тощо), ці приклади не додавалися до JSON Schema, який описує ці дані (навіть не до власної версії JSON Schema у OpenAPI). Натомість вони додавалися безпосередньо до опису *обробника шляху* *(path operation)* в OpenAPI (тобто поза межами частин, які використовують JSON Schema). + +Але тепер, коли FastAPI 0.99.0 і вище використовують OpenAPI 3.1.0, а той — JSON Schema 2020-12, разом із Swagger UI 5.0.0 і вище — все стало більш узгодженим, і examples тепер включаються до JSON Schema. + +### Swagger UI та специфічні для OpenAPI `examples` + +Раніше (станом на 26 серпня 2023 року) Swagger UI не підтримував кілька прикладів у JSON Schema, тому користувачі не мали можливості показати декілька прикладів у документації. + +Щоб вирішити це, FastAPI починаючи з версії 0.103.0 **додав підтримку** старого **OpenAPI-специфічного** поля `examples` через новий параметр `openapi_examples`. 🤓 + +### Підсумок + +Раніше я казав, що не люблю історію... а тепер ось я — розповідаю "технічні історичні" лекції. 😅 + +Коротко: **оновіться до FastAPI 0.99.0 або вище** — і все стане значно **простішим, узгодженим та інтуїтивно зрозумілим**, і Вам не доведеться знати всі ці історичні деталі. 😎 From b8a3cccb75e11997b9b48b32db20f1f29b54f75a Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 9 Jun 2025 19:36:09 +0000 Subject: [PATCH 132/138] =?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 b5d7f8d3a..a9747b9da 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/schema-extra-example.md`. PR [#13769](https://github.com/fastapi/fastapi/pull/13769) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * ✏️ Remove redundant words in docs/zh/docs/python-types.md. PR [#13774](https://github.com/fastapi/fastapi/pull/13774) by [@CharleeWa](https://github.com/CharleeWa). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-param-models.md`. PR [#13748](https://github.com/fastapi/fastapi/pull/13748) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * 🌐 Add Bengali translation for `docs/bn/docs/environment-variables.md`. PR [#13629](https://github.com/fastapi/fastapi/pull/13629) by [@SakibSibly](https://github.com/SakibSibly). From cdd5d6ce709bfe16c9f6268d41a6a192b222f84b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 21:40:54 +0200 Subject: [PATCH 133/138] =?UTF-8?q?=E2=AC=86=20[pre-commit.ci]=20pre-commi?= =?UTF-8?q?t=20autoupdate=20(#13781)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.11.12 → v0.11.13](https://github.com/astral-sh/ruff-pre-commit/compare/v0.11.12...v0.11.13) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 21413fc66..7af88b5aa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.11.12 + rev: v0.11.13 hooks: - id: ruff args: From 98fa4bd4374f736b1e516c29cb5447182455ac61 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 9 Jun 2025 19:41:14 +0000 Subject: [PATCH 134/138] =?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 a9747b9da..267384c6b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -48,6 +48,7 @@ hide: ### Internal +* ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13781](https://github.com/fastapi/fastapi/pull/13781) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13757](https://github.com/fastapi/fastapi/pull/13757) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ Bump griffe-typingdoc from 0.2.7 to 0.2.8. PR [#13751](https://github.com/fastapi/fastapi/pull/13751) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🍱 Update sponsors: Dribia badge size. PR [#13773](https://github.com/fastapi/fastapi/pull/13773) by [@tiangolo](https://github.com/tiangolo). From 44d5abffc164b787832e2e3a83990e0a027a7eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 10 Jun 2025 18:52:33 +0200 Subject: [PATCH 135/138] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20rem?= =?UTF-8?q?ove=20Porter=20(#13783)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - docs/en/data/sponsors.yml | 3 --- docs/en/overrides/main.html | 6 ------ 3 files changed, 10 deletions(-) diff --git a/README.md b/README.md index da9446e2b..44fa2d3ac 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,6 @@ The key features are: - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 897ca7b8d..b06e51477 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -5,9 +5,6 @@ gold: - 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 - - url: https://www.porter.run - title: Deploy FastAPI on AWS with a few clicks - img: https://fastapi.tiangolo.com/img/sponsors/porter.png - url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files" img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 89c8171d0..21a1d6906 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -38,12 +38,6 @@
-
From 5ba94612c1d5bab8ff7cdc627bebf76edfea36ba Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 10 Jun 2025 16:52:55 +0000 Subject: [PATCH 136/138] =?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 267384c6b..54c1275c2 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -48,6 +48,7 @@ hide: ### Internal +* 🔧 Update sponsors: remove Porter. PR [#13783](https://github.com/fastapi/fastapi/pull/13783) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13781](https://github.com/fastapi/fastapi/pull/13781) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#13757](https://github.com/fastapi/fastapi/pull/13757) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆ Bump griffe-typingdoc from 0.2.7 to 0.2.8. PR [#13751](https://github.com/fastapi/fastapi/pull/13751) by [@dependabot[bot]](https://github.com/apps/dependabot). From 095dcc8a633a5a14059bbf7ed5d63c0d7744e482 Mon Sep 17 00:00:00 2001 From: ChaeYeong Hwang <79563565+NinaHwang@users.noreply.github.com> Date: Thu, 12 Jun 2025 09:32:09 +0200 Subject: [PATCH 137/138] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/advanced/sub-applications.md`=20(#4543?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * This PR translates advanced/sub-applications.md in Korean. Test complete related: #2017 * Update sub-applications.md * Update sub-applications.md * Update sub-applications.md * remove .DS_Store * 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks * Update docs/ko/docs/advanced/sub-applications.md * Update docs/ko/docs/advanced/sub-applications.md * Update docs/ko/docs/advanced/sub-applications.md --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Sebastián Ramírez Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com> --- docs/ko/docs/advanced/sub-applications.md | 67 +++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 docs/ko/docs/advanced/sub-applications.md diff --git a/docs/ko/docs/advanced/sub-applications.md b/docs/ko/docs/advanced/sub-applications.md new file mode 100644 index 000000000..c5835de15 --- /dev/null +++ b/docs/ko/docs/advanced/sub-applications.md @@ -0,0 +1,67 @@ +# 하위 응용프로그램 - 마운트 + +만약 각각의 독립적인 OpenAPI와 문서 UI를 갖는 두 개의 독립적인 FastAPI 응용프로그램이 필요하다면, 메인 어플리케이션에 하나 (또는 그 이상의) 하위-응용프로그램(들)을 “마운트"해서 사용할 수 있습니다. + +## **FastAPI** 응용프로그램 마운트 + +“마운트"이란 완전히 “독립적인" 응용프로그램을 특정 경로에 추가하여 해당 하위 응용프로그램에서 선언된 *경로 동작*을 통해 해당 경로 아래에 있는 모든 작업들을 처리할 수 있도록 하는 것을 의미합니다. + +### 최상단 응용프로그램 + +먼저, 메인, 최상단의 **FastAPI** 응용프로그램과 이것의 *경로 동작*을 생성합니다: + +{* ../../docs_src/sub_applications/tutorial001.py hl[3, 6:8] *} + +### 하위 응용프로그램 + +다음으로, 하위 응용프로그램과 이것의 *경로 동작*을 생성합니다: + +이 하위 응용프로그램은 또 다른 표준 FastAPI 응용프로그램입니다. 다만 이것은 “마운트”될 것입니다: + +{* ../../docs_src/sub_applications/tutorial001.py hl[11, 14:16] *} + +### 하위 응용프로그램 마운트 + +최상단 응용프로그램, `app`에 하위 응용프로그램, `subapi`를 마운트합니다. + +이 예시에서, 하위 응용프로그램션은 `/subapi` 경로에 마운트 될 것입니다: + +{* ../../docs_src/sub_applications/tutorial001.py hl[11, 19] *} + +### 자동으로 생성된 API 문서 확인 + +이제, `uvicorn`으로 메인 응용프로그램을 실행하십시오. 당신의 파일이 `main.py`라면, 이렇게 실행합니다: + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +그리고
http://127.0.0.1:8000/docs에서 문서를 여십시오. + +메인 응용프로그램의 *경로 동작*만을 포함하는, 메인 응용프로그램에 대한 자동 API 문서를 확인할 수 있습니다: + + + +다음으로, http://127.0.0.1:8000/subapi/docs에서 하위 응용프로그램의 문서를 여십시오. + +하위 경로 접두사 `/subapi` 아래에 선언된 *경로 동작* 을 포함하는, 하위 응용프로그램에 대한 자동 API 문서를 확인할 수 있습니다: + + + +두 사용자 인터페이스 중 어느 하나를 사용해야하는 경우, 브라우저는 특정 응용프로그램 또는 하위 응용프로그램과 각각 통신할 수 있기 때문에 올바르게 동작할 것입니다. + +### 기술적 세부사항: `root_path` + +위에 설명된 것과 같이 하위 응용프로그램을 마운트하는 경우, FastAPI는 `root_path`라고 하는 ASGI 명세의 매커니즘을 사용하여 하위 응용프로그램에 대한 마운트 경로 통신을 처리합니다. + +이를 통해, 하위 응용프로그램은 문서 UI를 위해 경로 접두사를 사용해야 한다는 사실을 인지합니다. + +하위 응용프로그램에도 역시 다른 하위 응용프로그램을 마운트하는 것이 가능하며 FastAPI가 모든 `root_path` 들을 자동적으로 처리하기 때문에 모든 것은 올바르게 동작할 것입니다. + +`root_path`와 이것을 사용하는 방법에 대해서는 [프록시의 뒷단](./behind-a-proxy.md){.internal-link target=_blank} 섹션에서 배울 수 있습니다. From 1f79531a5b96654e41df14bdcff322ec3c3d707c Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 12 Jun 2025 07:32:29 +0000 Subject: [PATCH 138/138] =?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 54c1275c2..46dbf7536 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -24,6 +24,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/advanced/sub-applications.md`. PR [#4543](https://github.com/fastapi/fastapi/pull/4543) by [@NinaHwang](https://github.com/NinaHwang). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/schema-extra-example.md`. PR [#13769](https://github.com/fastapi/fastapi/pull/13769) by [@valentinDruzhinin](https://github.com/valentinDruzhinin). * ✏️ Remove redundant words in docs/zh/docs/python-types.md. PR [#13774](https://github.com/fastapi/fastapi/pull/13774) by [@CharleeWa](https://github.com/CharleeWa). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/query-param-models.md`. PR [#13748](https://github.com/fastapi/fastapi/pull/13748) by [@valentinDruzhinin](https://github.com/valentinDruzhinin).