@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+La CLI detectará automáticamente tu aplicación de FastAPI y la desplegará en la nube. Si no has iniciado sesión, se abrirá tu navegador para completar el proceso de autenticación.
+
¡Eso es todo! Ahora puedes acceder a tu app en esa URL. ✨
#### Acerca de FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md
index 583cc380e..f45b4912a 100644
--- a/docs/es/docs/tutorial/bigger-applications.md
+++ b/docs/es/docs/tutorial/bigger-applications.md
@@ -396,9 +396,9 @@ Incluirá todas las rutas de ese router como parte de ella.
/// note | Detalles Técnicos
-En realidad creará internamente una *path operation* para cada *path operation* que fue declarada en el `APIRouter`.
+FastAPI mantiene activo el `APIRouter` original y sus `APIRoute`s cuando el router se incluye en la aplicación principal.
-Así, detrás de escena, funcionará como si todo fuera la misma única app.
+Eso significa que las subclases personalizadas de `APIRouter` y `APIRoute` aún pueden participar después de incluir el router.
///
@@ -406,7 +406,7 @@ Así, detrás de escena, funcionará como si todo fuera la misma única app.
No tienes que preocuparte por el rendimiento al incluir routers.
-Esto tomará microsegundos y solo sucederá al inicio.
+Esto está diseñado para ser liviano y evitar añadir sobrecarga a cada request.
Así que no afectará el rendimiento. ⚡
@@ -461,7 +461,7 @@ Los `APIRouter`s no están "montados", no están aislados del resto de la aplica
Esto se debe a que queremos incluir sus *path operations* en el esquema de OpenAPI y las interfaces de usuario.
-Como no podemos simplemente aislarlos y "montarlos" independientemente del resto, las *path operations* se "clonan" (se vuelven a crear), no se incluyen directamente.
+FastAPI mantiene los routers y *path operations* originales activos, y combina los prefijos del router, dependencias, tags, responses y otros metadatos al manejar requests y generar OpenAPI.
///
@@ -532,4 +532,16 @@ De la misma manera que puedes incluir un `APIRouter` en una aplicación `FastAPI
router.include_router(other_router)
```
-Asegúrate de hacerlo antes de incluir `router` en la app de `FastAPI`, para que las *path operations* de `other_router` también se incluyan.
+Puedes hacerlo antes o después de incluir `router` en la app de `FastAPI`. FastAPI seguirá incluyendo las *path operations* de `other_router` en el ruteo y en OpenAPI.
+
+Lo mismo aplica a las *path operations* añadidas después a los routers. También serán visibles a través de la inclusión anterior.
+
+/// warning | Detalles Técnicos
+
+Evita mutar directamente `router.routes` después de incluir un router. FastAPI trata la inclusión de routers como “en vivo”, así que el router original y sus rutas siguen formando parte del ruteo y de la generación de OpenAPI.
+
+Usa APIs documentadas como los decoradores de *path operations* y `.include_router()` para agregar rutas y routers.
+
+Trata `router.routes` como un árbol de rutas de nivel bajo que puede contener definiciones de rutas y routers incluidos, y evita depender de él como una lista plana de *path operations* finales.
+
+///
diff --git a/docs/es/docs/tutorial/body-multiple-params.md b/docs/es/docs/tutorial/body-multiple-params.md
index c78dd2881..e1b0d4b1c 100644
--- a/docs/es/docs/tutorial/body-multiple-params.md
+++ b/docs/es/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ Por ejemplo:
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Información
+/// note | Nota
`Body` también tiene todos los mismos parámetros de validación y metadatos extras que `Query`, `Path` y otros que verás luego.
@@ -123,7 +123,7 @@ Por defecto, **FastAPI** esperará su cuerpo directamente.
Pero si deseas que espere un JSON con una clave `item` y dentro de ella los contenidos del modelo, como lo hace cuando declaras parámetros de cuerpo extra, puedes usar el parámetro especial `Body` `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
como en:
diff --git a/docs/es/docs/tutorial/body-nested-models.md b/docs/es/docs/tutorial/body-nested-models.md
index 742f78d42..14151a036 100644
--- a/docs/es/docs/tutorial/body-nested-models.md
+++ b/docs/es/docs/tutorial/body-nested-models.md
@@ -136,7 +136,7 @@ Esto esperará (convertirá, validará, documentará, etc.) un cuerpo JSON como:
}
```
-/// info | Información
+/// note | Nota
Nota cómo la clave `images` ahora tiene una lista de objetos de imagen.
@@ -148,7 +148,7 @@ Puedes definir modelos anidados tan profundamente como desees:
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Información
+/// note | Nota
Observa cómo `Offer` tiene una lista de `Item`s, que a su vez tienen una lista opcional de `Image`s
diff --git a/docs/es/docs/tutorial/body.md b/docs/es/docs/tutorial/body.md
index 7c3b8e9d9..a87512da2 100644
--- a/docs/es/docs/tutorial/body.md
+++ b/docs/es/docs/tutorial/body.md
@@ -8,7 +8,7 @@ Tu API casi siempre tiene que enviar un **response** body. Pero los clientes no
Para declarar un **request** body, usas modelos de [Pydantic](https://docs.pydantic.dev/) con todo su poder y beneficios.
-/// info | Información
+/// note | Nota
Para enviar datos, deberías usar uno de estos métodos: `POST` (el más común), `PUT`, `DELETE` o `PATCH`.
diff --git a/docs/es/docs/tutorial/cookie-param-models.md b/docs/es/docs/tutorial/cookie-param-models.md
index 4e6038a46..3fbf0bcb5 100644
--- a/docs/es/docs/tutorial/cookie-param-models.md
+++ b/docs/es/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@ Puedes ver las cookies definidas en la UI de la documentación en `/docs`:
-/// info | Información
+/// note | Nota
Ten en cuenta que, como los **navegadores manejan las cookies** de maneras especiales y detrás de escenas, **no** permiten fácilmente que **JavaScript** las toque.
diff --git a/docs/es/docs/tutorial/cookie-params.md b/docs/es/docs/tutorial/cookie-params.md
index 598872c0a..eecd61907 100644
--- a/docs/es/docs/tutorial/cookie-params.md
+++ b/docs/es/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@ Pero recuerda que cuando importas `Query`, `Path`, `Cookie` y otros desde `fasta
///
-/// info | Información
+/// note | Nota
Para declarar cookies, necesitas usar `Cookie`, porque de lo contrario los parámetros serían interpretados como parámetros de query.
///
-/// info | Información
+/// note | Nota
Ten en cuenta que, como **los navegadores manejan las cookies** de formas especiales y por detrás, **no** permiten fácilmente que **JavaScript** las toque.
diff --git a/docs/es/docs/tutorial/debugging.md b/docs/es/docs/tutorial/debugging.md
index b5d0704e0..d91a32616 100644
--- a/docs/es/docs/tutorial/debugging.md
+++ b/docs/es/docs/tutorial/debugging.md
@@ -62,7 +62,7 @@ from myapp import app
# Algún código adicional
```
-en ese caso, la variable creada automáticamente dentro de `myapp.py` no tendrá la variable `__name__` con un valor de `"__main__"`.
+en ese caso, la variable creada automáticamente `__name__` dentro de `myapp.py` no tendrá el valor `"__main__"`.
Así que, la línea:
@@ -72,7 +72,7 @@ Así que, la línea:
no se ejecutará.
-/// info | Información
+/// note | Nota
Para más información, revisa [la documentación oficial de Python](https://docs.python.org/3/library/__main__.html).
@@ -88,7 +88,7 @@ Por ejemplo, en Visual Studio Code, puedes:
* Ir al panel de "Debug".
* "Add configuration...".
-* Seleccionar "Python".
+* Seleccionar "Python"
* Ejecutar el depurador con la opción "`Python: Current File (Integrated Terminal)`".
Luego, iniciará el servidor con tu código **FastAPI**, deteniéndose en tus puntos de interrupción, etc.
diff --git a/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index 72e4e973e..3c5796b8b 100644
--- a/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@ También puede ayudar a evitar confusiones para nuevos desarrolladores que vean
///
-/// info | Información
+/// note | Nota
En este ejemplo usamos headers personalizados inventados `X-Key` y `X-Token`.
diff --git a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
index 084d72aa4..552c98ed0 100644
--- a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info | Información
+/// note | Nota
Solo **un response** será enviado al cliente. Podría ser uno de los responses de error o será el response de la *path operation*.
diff --git a/docs/es/docs/tutorial/dependencies/index.md b/docs/es/docs/tutorial/dependencies/index.md
index ed5783f39..f725f4061 100644
--- a/docs/es/docs/tutorial/dependencies/index.md
+++ b/docs/es/docs/tutorial/dependencies/index.md
@@ -1,6 +1,6 @@
# Dependencias { #dependencies }
-**FastAPI** tiene un sistema de **Inyección de Dependencias** muy poderoso pero intuitivo.
+**FastAPI** tiene un sistema de **Inyección de Dependencias** muy poderoso pero intuitivo.
Está diseñado para ser muy simple de usar, y para hacer que cualquier desarrollador integre otros componentes con **FastAPI** de forma muy sencilla.
@@ -51,7 +51,7 @@ En este caso, esta dependencia espera:
Y luego solo devuelve un `dict` que contiene esos valores.
-/// info | Información
+/// note | Nota
FastAPI agregó soporte para `Annotated` (y comenzó a recomendarlo) en la versión 0.95.0.
@@ -106,7 +106,7 @@ common_parameters --> read_users
De esta manera escribes código compartido una vez y **FastAPI** se encarga de llamarlo para tus *path operations*.
-/// check | Revisa
+/// tip | Consejo
Nota que no tienes que crear una clase especial y pasarla en algún lugar a **FastAPI** para "registrarla" o algo similar.
diff --git a/docs/es/docs/tutorial/dependencies/sub-dependencies.md b/docs/es/docs/tutorial/dependencies/sub-dependencies.md
index 95f3fe817..2432707f7 100644
--- a/docs/es/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/es/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@ Entonces podemos usar la dependencia con:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | Información
+/// note | Nota
Fíjate que solo estamos declarando una dependencia en la *path operation function*, `query_or_cookie_extractor`.
diff --git a/docs/es/docs/tutorial/first-steps.md b/docs/es/docs/tutorial/first-steps.md
index 1fcfdc140..5aaf8bdfa 100644
--- a/docs/es/docs/tutorial/first-steps.md
+++ b/docs/es/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ lo cual sería equivalente a:
from backend.main import app
```
-### `fastapi dev` con path { #fastapi-dev-with-path }
+### `fastapi dev` con path o con la opción de CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
También puedes pasar el path del archivo al comando `fastapi dev`, y adivinará el objeto app de FastAPI que debe usar:
@@ -188,29 +188,19 @@ También puedes pasar el path del archivo al comando `fastapi dev`, y adivinará
$ fastapi dev main.py
```
-Pero tendrías que recordar pasar el path correcto cada vez que llames al comando `fastapi`.
-
-Además, otras herramientas podrían no ser capaces de encontrarlo, por ejemplo la [Extensión de VS Code](../editor-support.md) o [FastAPI Cloud](https://fastapicloud.com), así que se recomienda usar el `entrypoint` en `pyproject.toml`.
-
-### Despliega tu app (opcional) { #deploy-your-app-optional }
-
-Opcionalmente puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com), ve y únete a la lista de espera si aún no lo has hecho. 🚀
-
-Si ya tienes una cuenta de **FastAPI Cloud** (te invitamos desde la lista de espera 😉), puedes desplegar tu aplicación con un solo comando.
-
-Antes de desplegar, asegúrate de haber iniciado sesión:
-
-
+O, también puedes pasar la opción `--entrypoint` al comando `fastapi dev`:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+Pero tendrías que recordar pasar el path o entrypoint correctos cada vez que llames al comando `fastapi`.
+
+Además, otras herramientas podrían no ser capaces de encontrarlo, por ejemplo la [Extensión de VS Code](../editor-support.md) o [FastAPI Cloud](https://fastapicloud.com), así que se recomienda usar el `entrypoint` en `pyproject.toml`.
-Luego despliega tu app:
+### Despliega tu app (opcional) { #deploy-your-app-optional }
+
+Opcionalmente puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com) con un solo comando. 🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+La CLI detectará automáticamente tu aplicación de FastAPI y la desplegará en la nube. Si no has iniciado sesión, se abrirá tu navegador para completar el proceso de autenticación.
+
¡Eso es todo! Ahora puedes acceder a tu app en esa URL. ✨
## Recapitulación, paso a paso { #recap-step-by-step }
@@ -270,7 +262,7 @@ https://example.com/items/foo
/items/foo
```
-/// info | Información
+/// note | Nota
Un "path" también es comúnmente llamado "endpoint" o "ruta".
@@ -322,7 +314,7 @@ El `@app.get("/")` le dice a **FastAPI** que la función justo debajo se encarga
* el path `/`
* usando una get operación
-/// info | Información sobre `@decorator`
+/// note | Información sobre `@decorator`
Esa sintaxis `@algo` en Python se llama un "decorador".
diff --git a/docs/es/docs/tutorial/metadata.md b/docs/es/docs/tutorial/metadata.md
index 35bc98a26..9dd9088da 100644
--- a/docs/es/docs/tutorial/metadata.md
+++ b/docs/es/docs/tutorial/metadata.md
@@ -74,7 +74,7 @@ Usa el parámetro `tags` con tus *path operations* (y `APIRouter`s) para asignar
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | Información
+/// note | Nota
Lee más sobre etiquetas en [Configuración de Path Operation](path-operation-configuration.md#tags).
diff --git a/docs/es/docs/tutorial/path-operation-configuration.md b/docs/es/docs/tutorial/path-operation-configuration.md
index 21fd503bb..30dc9c19f 100644
--- a/docs/es/docs/tutorial/path-operation-configuration.md
+++ b/docs/es/docs/tutorial/path-operation-configuration.md
@@ -72,13 +72,13 @@ Puedes especificar la descripción del response con el parámetro `response_desc
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Información
+/// note | Nota
Ten en cuenta que `response_description` se refiere específicamente al response, mientras que `description` se refiere a la *path operation* en general.
///
-/// check | Revisa
+/// tip | Consejo
OpenAPI especifica que cada *path operation* requiere una descripción de response.
diff --git a/docs/es/docs/tutorial/path-params-numeric-validations.md b/docs/es/docs/tutorial/path-params-numeric-validations.md
index 5e7b9a978..24cd5117e 100644
--- a/docs/es/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/es/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@ Primero, importa `Path` de `fastapi`, e importa `Annotated`:
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Información
+/// note | Nota
FastAPI agregó soporte para `Annotated` (y comenzó a recomendar su uso) en la versión 0.95.0.
@@ -131,7 +131,7 @@ Y también puedes declarar validaciones numéricas:
* `lt`: `l`ess `t`han
* `le`: `l`ess than or `e`qual
-/// info | Información
+/// note | Nota
`Query`, `Path` y otras clases que verás más adelante son subclases de una clase común `Param`.
diff --git a/docs/es/docs/tutorial/path-params.md b/docs/es/docs/tutorial/path-params.md
index f1aa4ef8b..94465013e 100644
--- a/docs/es/docs/tutorial/path-params.md
+++ b/docs/es/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@ Puedes declarar el tipo de un parámetro de path en la función, usando anotacio
En este caso, `item_id` se declara como un `int`.
-/// check | Revisa
+/// tip | Consejo
Esto te dará soporte del editor dentro de tu función, con chequeo de errores, autocompletado, etc.
@@ -34,7 +34,7 @@ Si ejecutas este ejemplo y abres tu navegador en [http://127.0.0.1:8000/items/3]
{"item_id":3}
```
-/// check | Revisa
+/// tip | Consejo
Nota que el valor que tu función recibió (y devolvió) es `3`, como un `int` de Python, no un string `"3"`.
@@ -66,7 +66,7 @@ porque el parámetro de path `item_id` tenía un valor de `"foo"`, que no es un
El mismo error aparecería si proporcionaras un `float` en lugar de un `int`, como en: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Revisa
+/// tip | Consejo
Entonces, con la misma declaración de tipo de Python, **FastAPI** te ofrece validación de datos.
@@ -82,7 +82,7 @@ Y cuando abras tu navegador en [http://127.0.0.1:8000/docs](http://127.0.0.1:800
-/// check | Revisa
+/// tip | Consejo
Nuevamente, solo con esa misma declaración de tipo de Python, **FastAPI** te ofrece documentación automática e interactiva (integrando Swagger UI).
@@ -130,7 +130,7 @@ La primera siempre será utilizada ya que el path coincide primero.
## Valores predefinidos { #predefined-values }
-Si tienes una *path operation* que recibe un *path parameter*, pero quieres que los valores posibles válidos del *path parameter* estén predefinidos, puedes usar un `Enum` estándar de Python.
+Si tienes una *path operation* que recibe un *path parameter*, pero quieres que los valores posibles válidos del *path parameter* estén predefinidos, puedes usar un `Enum` estándar de Python.
### Crear una clase `Enum` { #create-an-enum-class }
diff --git a/docs/es/docs/tutorial/query-params-str-validations.md b/docs/es/docs/tutorial/query-params-str-validations.md
index 44beba2d3..01c2e4051 100644
--- a/docs/es/docs/tutorial/query-params-str-validations.md
+++ b/docs/es/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ Para lograr eso, primero importa:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Información
+/// note | Nota
FastAPI añadió soporte para `Annotated` (y empezó a recomendarlo) en la versión 0.95.0.
@@ -298,7 +298,7 @@ También puedes usar `list` directamente en lugar de `list[str]`:
Ten en cuenta que en este caso, FastAPI no comprobará el contenido de la list.
-Por ejemplo, `list[int]` comprobaría (y documentaría) que el contenido de la list son enteros. Pero `list` sola no lo haría.
+Por ejemplo, `list[int]` comprobaría (and documentaría) que el contenido de la list son enteros. Pero `list` sola no lo haría.
///
@@ -382,7 +382,7 @@ Por ejemplo, este validador personalizado comprueba que el ID del ítem empiece
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Información
+/// note | Nota
Esto está disponible con Pydantic versión 2 o superior. 😎
diff --git a/docs/es/docs/tutorial/query-params.md b/docs/es/docs/tutorial/query-params.md
index 2dbb04ef4..f6664d115 100644
--- a/docs/es/docs/tutorial/query-params.md
+++ b/docs/es/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ De la misma manera, puedes declarar parámetros de query opcionales, establecien
En este caso, el parámetro de función `q` será opcional y será `None` por defecto.
-/// check | Revisa
+/// tip | Consejo
Además, nota que **FastAPI** es lo suficientemente inteligente para notar que el parámetro de path `item_id` es un parámetro de path y `q` no lo es, por lo tanto, es un parámetro de query.
diff --git a/docs/es/docs/tutorial/request-files.md b/docs/es/docs/tutorial/request-files.md
index 8bfc7a772..f7470ca88 100644
--- a/docs/es/docs/tutorial/request-files.md
+++ b/docs/es/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Puedes definir archivos que serán subidos por el cliente utilizando `File`.
-/// info | Información
+/// note | Nota
Para recibir archivos subidos, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ Crea parámetros de archivo de la misma manera que lo harías para `Body` o `For
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Información
+/// note | Nota
`File` es una clase que hereda directamente de `Form`.
diff --git a/docs/es/docs/tutorial/request-form-models.md b/docs/es/docs/tutorial/request-form-models.md
index b20421bd0..e0685d4be 100644
--- a/docs/es/docs/tutorial/request-form-models.md
+++ b/docs/es/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Puedes usar **modelos de Pydantic** para declarar **campos de formulario** en FastAPI.
-/// info | Información
+/// note | Nota
Para usar formularios, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/es/docs/tutorial/request-forms-and-files.md b/docs/es/docs/tutorial/request-forms-and-files.md
index f7b5000b7..434a665c9 100644
--- a/docs/es/docs/tutorial/request-forms-and-files.md
+++ b/docs/es/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Puedes definir archivos y campos de formulario al mismo tiempo usando `File` y `Form`.
-/// info | Información
+/// note | Nota
Para recibir archivos subidos y/o form data, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/es/docs/tutorial/request-forms.md b/docs/es/docs/tutorial/request-forms.md
index 7b78aee69..60722a261 100644
--- a/docs/es/docs/tutorial/request-forms.md
+++ b/docs/es/docs/tutorial/request-forms.md
@@ -1,8 +1,8 @@
-# Datos de formulario { #form-data }
+# Form Data { #form-data }
Cuando necesitas recibir campos de formulario en lugar de JSON, puedes usar `Form`.
-/// info | Información
+/// note | Nota
Para usar formularios, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -32,7 +32,7 @@ La especificación requiere que los campos se
Con `Form` puedes declarar las mismas configuraciones que con `Body` (y `Query`, `Path`, `Cookie`), incluyendo validación, ejemplos, un alias (por ejemplo, `user-name` en lugar de `username`), etc.
-/// info | Información
+/// note | Nota
`Form` es una clase que hereda directamente de `Body`.
@@ -70,4 +70,4 @@ Esto no es una limitación de **FastAPI**, es parte del protocolo HTTP.
## Recapitulación { #recap }
-Usa `Form` para declarar parámetros de entrada de datos de formulario.
+Usa `Form` para declarar parámetros de entrada de form data.
diff --git a/docs/es/docs/tutorial/response-model.md b/docs/es/docs/tutorial/response-model.md
index fc9028bee..2c97a6764 100644
--- a/docs/es/docs/tutorial/response-model.md
+++ b/docs/es/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ Aquí estamos declarando un modelo `UserIn`, contendrá una contraseña en texto
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Información
+/// note | Nota
Para usar `EmailStr`, primero instala [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -251,7 +251,7 @@ Entonces, si envías un request a esa *path operation* para el ítem con ID `foo
}
```
-/// info | Información
+/// note | Nota
También puedes usar:
diff --git a/docs/es/docs/tutorial/response-status-code.md b/docs/es/docs/tutorial/response-status-code.md
index a070819bb..4b9f0e234 100644
--- a/docs/es/docs/tutorial/response-status-code.md
+++ b/docs/es/docs/tutorial/response-status-code.md
@@ -18,7 +18,7 @@ Observa que `status_code` es un parámetro del método "decorador" (`get`, `post
El parámetro `status_code` recibe un número con el código de estado HTTP.
-/// info | Información
+/// note | Nota
`status_code` también puede recibir un `IntEnum`, como por ejemplo el [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) de Python.
diff --git a/docs/es/docs/tutorial/schema-extra-example.md b/docs/es/docs/tutorial/schema-extra-example.md
index 73d0cdbe4..fba7215ef 100644
--- a/docs/es/docs/tutorial/schema-extra-example.md
+++ b/docs/es/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@ Por ejemplo, podrías usarlo para añadir metadatos para una interfaz de usuario
///
-/// info | Información
+/// note | Nota
OpenAPI 3.1.0 (usado desde FastAPI 0.99.0) añadió soporte para `examples`, que es parte del estándar de **JSON Schema**.
@@ -155,7 +155,7 @@ OpenAPI también añadió los campos `example` y `examples` a otras partes de la
* `File()`
* `Form()`
-/// info | Información
+/// note | Nota
Este viejo parámetro `examples` específico de OpenAPI ahora es `openapi_examples` desde FastAPI `0.103.0`.
@@ -171,7 +171,7 @@ Y ahora este nuevo campo `examples` tiene precedencia sobre el viejo campo únic
Este nuevo campo `examples` en JSON Schema es **solo una `list`** de ejemplos, no un dict con metadatos adicionales como en los otros lugares en OpenAPI (descritos arriba).
-/// info | Información
+/// note | Nota
Incluso después de que OpenAPI 3.1.0 fue lanzado con esta nueva integración más sencilla con JSON Schema, por un tiempo, Swagger UI, la herramienta que proporciona la documentación automática, no soportaba OpenAPI 3.1.0 (lo hace desde la versión 5.0.0 🎉).
diff --git a/docs/es/docs/tutorial/security/first-steps.md b/docs/es/docs/tutorial/security/first-steps.md
index 8118906e5..e4755f951 100644
--- a/docs/es/docs/tutorial/security/first-steps.md
+++ b/docs/es/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@ Copia el ejemplo en un archivo `main.py`:
## Ejecútalo { #run-it }
-/// info | Información
+/// note | Nota
El paquete [`python-multipart`](https://github.com/Kludex/python-multipart) se instala automáticamente con **FastAPI** cuando ejecutas el comando `pip install "fastapi[standard]"`.
@@ -60,7 +60,7 @@ Verás algo así:
-/// check | ¡Botón de autorización!
+/// tip | ¡Botón de autorización!
Ya tienes un nuevo y brillante botón de "Authorize".
@@ -118,7 +118,7 @@ Así que, revisémoslo desde ese punto de vista simplificado:
En este ejemplo vamos a usar **OAuth2**, con el flujo **Password**, usando un token **Bearer**. Hacemos eso utilizando la clase `OAuth2PasswordBearer`.
-/// info | Información
+/// note | Nota
Un token "bearer" no es la única opción.
@@ -148,7 +148,7 @@ Este parámetro no crea ese endpoint / *path operation*, pero declara que la URL
Pronto también crearemos la verdadera *path operation*.
-/// info | Información
+/// note | Nota
Si eres un "Pythonista" muy estricto, tal vez no te guste el estilo del nombre del parámetro `tokenUrl` en lugar de `token_url`.
@@ -176,7 +176,7 @@ Esta dependencia proporcionará un `str` que se asigna al parámetro `token` de
**FastAPI** sabrá que puede usar esta dependencia para definir un "security scheme" en el esquema OpenAPI (y en los docs automáticos del API).
-/// info | Detalles técnicos
+/// note | Detalles técnicos
**FastAPI** sabrá que puede usar la clase `OAuth2PasswordBearer` (declarada en una dependencia) para definir el esquema de seguridad en OpenAPI porque hereda de `fastapi.security.oauth2.OAuth2`, que a su vez hereda de `fastapi.security.base.SecurityBase`.
diff --git a/docs/es/docs/tutorial/security/get-current-user.md b/docs/es/docs/tutorial/security/get-current-user.md
index 67b6c5835..fd331f68e 100644
--- a/docs/es/docs/tutorial/security/get-current-user.md
+++ b/docs/es/docs/tutorial/security/get-current-user.md
@@ -50,7 +50,7 @@ Aquí **FastAPI** no se confundirá porque estás usando `Depends`.
///
-/// check | Revisa
+/// tip | Consejo
El modo en que este sistema de dependencias está diseñado nos permite tener diferentes dependencias (diferentes "dependables") que todas devuelven un modelo `User`.
diff --git a/docs/es/docs/tutorial/security/oauth2-jwt.md b/docs/es/docs/tutorial/security/oauth2-jwt.md
index af1140d1b..efd309df9 100644
--- a/docs/es/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/es/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | Información
+/// note | Nota
Si planeas usar algoritmos de firma digital como RSA o ECDSA, deberías instalar la dependencia del paquete de criptografía `pyjwt[crypto]`.
@@ -213,7 +213,7 @@ Usando las credenciales:
Usuario: `johndoe`
Contraseña: `secret`
-/// check | Revisa
+/// tip | Consejo
Observa que en ninguna parte del código está la contraseña en texto claro "`secret`", solo tenemos la versión con hash.
diff --git a/docs/es/docs/tutorial/security/simple-oauth2.md b/docs/es/docs/tutorial/security/simple-oauth2.md
index 15c7146bd..2a98fff6c 100644
--- a/docs/es/docs/tutorial/security/simple-oauth2.md
+++ b/docs/es/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ Normalmente se utilizan para declarar permisos de seguridad específicos, por ej
* `instagram_basic` es usado por Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` es usado por Google.
-/// info | Información
+/// note | Nota
En OAuth2 un "scope" es solo un string que declara un permiso específico requerido.
@@ -72,7 +72,7 @@ Si necesitas imponerlo, utiliza `OAuth2PasswordRequestFormStrict` en lugar de `O
* Un `client_id` opcional (no lo necesitamos para nuestro ejemplo).
* Un `client_secret` opcional (no lo necesitamos para nuestro ejemplo).
-/// info | Información
+/// note | Nota
`OAuth2PasswordRequestForm` no es una clase especial para **FastAPI** como lo es `OAuth2PasswordBearer`.
@@ -94,7 +94,7 @@ No estamos usando `scopes` en este ejemplo, pero la funcionalidad está ahí si
///
-Ahora, obtén los datos del usuario desde la base de datos (falsa), usando el `username` del campo del form.
+Ahora, obtén los datos del usuario desde la base de datos (falsa), usando el `username` del campo del formulario.
Si no existe tal usuario, devolvemos un error diciendo "Incorrect username or password".
@@ -144,7 +144,7 @@ UserInDB(
)
```
-/// info | Información
+/// note | Nota
Para una explicación más completa de `**user_dict` revisa en [la documentación para **Extra Models**](../extra-models.md#about-user-in-dict).
@@ -196,7 +196,7 @@ Así que, en nuestro endpoint, solo obtendremos un usuario si el usuario existe,
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Información
+/// note | Nota
El header adicional `WWW-Authenticate` con el valor `Bearer` que estamos devolviendo aquí también es parte de la especificación.
diff --git a/docs/es/docs/tutorial/server-sent-events.md b/docs/es/docs/tutorial/server-sent-events.md
index 0a008c0de..79716ac85 100644
--- a/docs/es/docs/tutorial/server-sent-events.md
+++ b/docs/es/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@ Puedes enviar datos en streaming al cliente usando **Server-Sent Events** (SSE).
Esto es similar a [Stream JSON Lines](stream-json-lines.md), pero usa el formato `text/event-stream`, que los navegadores soportan de forma nativa con la [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Información
+/// note | Nota
Añadido en FastAPI 0.135.0.
diff --git a/docs/es/docs/tutorial/stream-json-lines.md b/docs/es/docs/tutorial/stream-json-lines.md
index e7fe18f5e..356b4e0bf 100644
--- a/docs/es/docs/tutorial/stream-json-lines.md
+++ b/docs/es/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
Podrías tener una secuencia de datos que quieras enviar en un "**stream**", podrías hacerlo con **JSON Lines**.
-/// info | Información
+/// note | Nota
Añadido en FastAPI 0.134.0.
@@ -48,7 +48,7 @@ Una response tendría un tipo de contenido `application/jsonl` (en lugar de `app
Es muy similar a un array JSON (equivalente de una list de Python), pero en lugar de estar envuelto en `[]` y tener `,` entre los ítems, tiene **un objeto JSON por línea**, separados por un carácter de nueva línea.
-/// info | Información
+/// note | Nota
El punto importante es que tu app podrá producir cada línea a su turno, mientras el cliente consume las líneas anteriores.
diff --git a/docs/es/docs/tutorial/testing.md b/docs/es/docs/tutorial/testing.md
index a40d90c5e..9612b6cba 100644
--- a/docs/es/docs/tutorial/testing.md
+++ b/docs/es/docs/tutorial/testing.md
@@ -1,4 +1,4 @@
-# Testing { #testing }
+# Pruebas { #testing }
Gracias a [Starlette](https://www.starlette.dev/testclient/), escribir pruebas para aplicaciones de **FastAPI** es fácil y agradable.
@@ -8,7 +8,7 @@ Con él, puedes usar [pytest](https://docs.pytest.org/) directamente con **FastA
## Usando `TestClient` { #using-testclient }
-/// info | Información
+/// note | Nota
Para usar `TestClient`, primero instala [`httpx`](https://www.python-httpx.org).
@@ -142,7 +142,7 @@ Por ejemplo:
Para más información sobre cómo pasar datos al backend (usando `httpx` o el `TestClient`) revisa la [documentación de HTTPX](https://www.python-httpx.org).
-/// info | Información
+/// note | Nota
Ten en cuenta que el `TestClient` recibe datos que pueden ser convertidos a JSON, no modelos de Pydantic.
diff --git a/docs/fr/docs/advanced/additional-responses.md b/docs/fr/docs/advanced/additional-responses.md
index e7b684e36..bcf562f30 100644
--- a/docs/fr/docs/advanced/additional-responses.md
+++ b/docs/fr/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@ Gardez à l'esprit que vous devez renvoyer directement `JSONResponse`.
///
-/// info
+/// note | Remarque
La clé `model` ne fait pas partie d'OpenAPI.
@@ -183,7 +183,7 @@ Notez que vous devez retourner l'image en utilisant directement un `FileResponse
///
-/// info
+/// note | Remarque
À moins que vous ne spécifiiez explicitement un type de média différent dans votre paramètre `responses`, FastAPI supposera que la réponse a le même type de média que la classe de réponse principale (par défaut `application/json`).
diff --git a/docs/fr/docs/advanced/advanced-dependencies.md b/docs/fr/docs/advanced/advanced-dependencies.md
index d5066ca25..4ff72581c 100644
--- a/docs/fr/docs/advanced/advanced-dependencies.md
+++ b/docs/fr/docs/advanced/advanced-dependencies.md
@@ -78,7 +78,7 @@ Les dépendances avec `yield` ont évolué au fil du temps pour couvrir différe
### Dépendances avec `yield` et `scope` { #dependencies-with-yield-and-scope }
-Dans la version 0.121.0, **FastAPI** a ajouté la prise en charge de `Depends(scope="function")` pour les dépendances avec `yield`.
+Dans la version 0.121.0, FastAPI a ajouté la prise en charge de `Depends(scope="function")` pour les dépendances avec `yield`.
Avec `Depends(scope="function")`, le code d’arrêt après `yield` s’exécute immédiatement après la fin de la *fonction de chemin d'accès*, avant que la réponse ne soit renvoyée au client.
@@ -98,7 +98,7 @@ Par exemple, si vous aviez une session de base de données dans une dépendance
Ce comportement a été annulé en 0.118.0, afin que le code d’arrêt après `yield` s’exécute après l’envoi de la réponse.
-/// info
+/// note | Remarque
Comme vous le verrez ci‑dessous, c’est très similaire au comportement avant la version 0.106.0, mais avec plusieurs améliorations et corrections de bogues pour des cas limites.
diff --git a/docs/fr/docs/advanced/custom-response.md b/docs/fr/docs/advanced/custom-response.md
index a1a60ebf6..8fd2e627f 100644
--- a/docs/fr/docs/advanced/custom-response.md
+++ b/docs/fr/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@ Pour renvoyer une réponse avec du HTML directement depuis **FastAPI**, utilisez
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info
+/// note | Remarque
Le paramètre `response_class` sera aussi utilisé pour définir le « media type » de la réponse.
@@ -65,7 +65,7 @@ Une `Response` renvoyée directement par votre *fonction de chemin d'accès* ne
///
-/// info
+/// note | Remarque
Bien sûr, l'en-tête `Content-Type` réel, le code d'état, etc., proviendront de l'objet `Response` que vous avez renvoyé.
diff --git a/docs/fr/docs/advanced/dataclasses.md b/docs/fr/docs/advanced/dataclasses.md
index b63a995d9..057e49df2 100644
--- a/docs/fr/docs/advanced/dataclasses.md
+++ b/docs/fr/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ Et bien sûr, cela prend en charge la même chose :
Cela fonctionne de la même manière qu'avec les modèles Pydantic. Et, en réalité, c'est mis en œuvre de la même façon en interne, en utilisant Pydantic.
-/// info
+/// note | Remarque
Gardez à l'esprit que les dataclasses ne peuvent pas tout ce que peuvent faire les modèles Pydantic.
diff --git a/docs/fr/docs/advanced/events.md b/docs/fr/docs/advanced/events.md
index c585dd563..5b90c7b2e 100644
--- a/docs/fr/docs/advanced/events.md
+++ b/docs/fr/docs/advanced/events.md
@@ -120,7 +120,7 @@ Pour ajouter une fonction qui doit être exécutée lorsque l'application s'arr
Ici, la fonction gestionnaire de l'événement `shutdown` écrira une ligne de texte « Application shutdown » dans un fichier `log.txt`.
-/// info
+/// note | Remarque
Dans la fonction `open()`, le `mode="a"` signifie « append » (ajouter) ; la ligne sera donc ajoutée après ce qui se trouve déjà dans ce fichier, sans écraser le contenu précédent.
@@ -152,7 +152,7 @@ Juste un détail technique pour les nerds curieux. 🤓
Sous le capot, dans la spécification technique ASGI, cela fait partie du [protocole Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), et il y définit des événements appelés `startup` et `shutdown`.
-/// info
+/// note | Remarque
Vous pouvez en lire plus sur les gestionnaires `lifespan` de Starlette dans la [documentation « Lifespan » de Starlette](https://www.starlette.dev/lifespan/).
diff --git a/docs/fr/docs/advanced/generate-clients.md b/docs/fr/docs/advanced/generate-clients.md
index 69402aefe..5625b0648 100644
--- a/docs/fr/docs/advanced/generate-clients.md
+++ b/docs/fr/docs/advanced/generate-clients.md
@@ -1,4 +1,4 @@
-# Générer des SDK { #generating-sdks }
+# Générer des SDKs { #generating-sdks }
Parce que **FastAPI** est basé sur la spécification **OpenAPI**, ses API peuvent être décrites dans un format standard compris par de nombreux outils.
@@ -31,7 +31,6 @@ Leur sponsoring démontre également un fort engagement envers la **communauté*
Par exemple, vous pourriez essayer :
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
Certaines de ces solutions peuvent aussi être open source ou proposer des niveaux gratuits, afin que vous puissiez les essayer sans engagement financier. D’autres générateurs de SDK commerciaux existent et peuvent être trouvés en ligne. 🤓
diff --git a/docs/fr/docs/advanced/openapi-callbacks.md b/docs/fr/docs/advanced/openapi-callbacks.md
index 369a638c8..e21254bc1 100644
--- a/docs/fr/docs/advanced/openapi-callbacks.md
+++ b/docs/fr/docs/advanced/openapi-callbacks.md
@@ -167,13 +167,13 @@ Remarquez que l’URL de callback utilisée contient l’URL reçue en paramètr
À ce stade, vous avez le(s) *chemin(s) d'accès de callback* nécessaire(s) (celui/ceux que la *personne développeuse externe* doit implémenter dans l’*API externe*) dans le routeur de callback que vous avez créé ci-dessus.
-Utilisez maintenant le paramètre `callbacks` dans *le décorateur de chemin d'accès de votre API* pour passer l’attribut `.routes` (qui est en fait juste une `list` de routes/*chemins d'accès*) depuis ce routeur de callback :
+Utilisez maintenant le paramètre `callbacks` dans *le décorateur de chemin d'accès de votre API* pour passer l’attribut `.routes` depuis ce routeur de callback :
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | Astuce
-Remarquez que vous ne passez pas le routeur lui-même (`invoices_callback_router`) à `callback=`, mais l’attribut `.routes`, comme dans `invoices_callback_router.routes`.
+Remarquez que vous ne passez pas le routeur lui-même (`invoices_callback_router`) à `callbacks=`, mais son attribut `.routes`, comme dans `invoices_callback_router.routes`. FastAPI utilisera ces routes pour générer la documentation OpenAPI du callback.
///
diff --git a/docs/fr/docs/advanced/openapi-webhooks.md b/docs/fr/docs/advanced/openapi-webhooks.md
index c36c2f82b..722455063 100644
--- a/docs/fr/docs/advanced/openapi-webhooks.md
+++ b/docs/fr/docs/advanced/openapi-webhooks.md
@@ -16,13 +16,13 @@ Et vos utilisateurs définissent aussi, d'une manière ou d'une autre (par exemp
Toute la logique de gestion des URL des webhooks et le code qui envoie effectivement ces requêtes vous incombent. Vous l'implémentez comme vous le souhaitez dans votre propre code.
-## Documenter des webhooks avec FastAPI et OpenAPI { #documenting-webhooks-with-fastapi-and-openapi }
+## Documenter des webhooks avec **FastAPI** et OpenAPI { #documenting-webhooks-with-fastapi-and-openapi }
-Avec FastAPI, en utilisant OpenAPI, vous pouvez définir les noms de ces webhooks, les types d'opérations HTTP que votre application peut envoyer (par exemple `POST`, `PUT`, etc.) et les corps des requêtes que votre application enverra.
+Avec **FastAPI**, en utilisant OpenAPI, vous pouvez définir les noms de ces webhooks, les types d'opérations HTTP que votre application peut envoyer (par exemple `POST`, `PUT`, etc.) et les **corps** des requêtes que votre application enverra.
-Cela peut grandement faciliter la tâche de vos utilisateurs pour implémenter leurs API afin de recevoir vos requêtes de webhook ; ils pourront même peut-être générer automatiquement une partie de leur propre code d'API.
+Cela peut grandement faciliter la tâche de vos utilisateurs pour **implémenter leurs API** afin de recevoir vos requêtes de **webhook** ; ils pourront même peut-être générer automatiquement une partie de leur propre code d'API.
-/// info
+/// note | Remarque
Les webhooks sont disponibles dans OpenAPI 3.1.0 et versions ultérieures, pris en charge par FastAPI `0.99.0` et versions ultérieures.
@@ -30,13 +30,13 @@ Les webhooks sont disponibles dans OpenAPI 3.1.0 et versions ultérieures, pris
## Créer une application avec des webhooks { #an-app-with-webhooks }
-Lorsque vous créez une application FastAPI, il existe un attribut `webhooks` que vous pouvez utiliser pour définir des webhooks, de la même manière que vous définiriez des chemins d'accès, par exemple avec `@app.webhooks.post()`.
+Lorsque vous créez une application **FastAPI**, il existe un attribut `webhooks` que vous pouvez utiliser pour définir des webhooks, de la même manière que vous définiriez des chemins d'accès, par exemple avec `@app.webhooks.post()`.
{* ../../docs_src/openapi_webhooks/tutorial001_py310.py hl[9:12,15:20] *}
-Les webhooks que vous définissez apparaîtront dans le schéma OpenAPI et dans l'interface de documentation automatique.
+Les webhooks que vous définissez apparaîtront dans le schéma **OpenAPI** et dans l'**interface de documentation** automatique.
-/// info
+/// note | Remarque
L'objet `app.webhooks` est en fait simplement un `APIRouter`, le même type que vous utiliseriez pour structurer votre application en plusieurs fichiers.
@@ -50,6 +50,6 @@ C'est parce qu'on s'attend à ce que vos utilisateurs définissent, par un autre
Vous pouvez maintenant démarrer votre application et aller sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
-Vous verrez que votre documentation contient les chemins d'accès habituels et désormais aussi des webhooks :
+Vous verrez que votre documentation contient les *chemins d'accès* habituels et désormais aussi des **webhooks** :
diff --git a/docs/fr/docs/advanced/path-operation-advanced-configuration.md b/docs/fr/docs/advanced/path-operation-advanced-configuration.md
index 67a5d46d4..0c56a1406 100644
--- a/docs/fr/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/fr/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@ Vous devez vous assurer qu’il est unique pour chaque opération.
### Utiliser le nom de la fonction de chemin d’accès comme operationId { #using-the-path-operation-function-name-as-the-operationid }
-Si vous souhaitez utiliser les noms de fonction de vos API comme `operationId`, vous pouvez les parcourir tous et remplacer l’`operation_id` de chaque chemin d’accès en utilisant leur `APIRoute.name`.
+Si vous souhaitez utiliser les noms de fonction de vos API comme `operationId`, vous pouvez passer une fonction personnalisée `generate_unique_id_function` à `FastAPI`.
-Vous devez le faire après avoir ajouté tous vos chemins d’accès.
+Cette fonction reçoit chaque `APIRoute` et renvoie l’`operationId` à utiliser pour ce chemin d’accès.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Astuce
-
-Si vous appelez manuellement `app.openapi()`, vous devez mettre à jour les `operationId` avant cela.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Alertes
diff --git a/docs/fr/docs/advanced/response-directly.md b/docs/fr/docs/advanced/response-directly.md
index 5ef479584..3c3827d66 100644
--- a/docs/fr/docs/advanced/response-directly.md
+++ b/docs/fr/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@ Vous aurez normalement une bien meilleure performance en utilisant un [Modèle d
Vous pouvez renvoyer une `Response` ou n'importe laquelle de ses sous-classes.
-/// info
+/// note | Remarque
`JSONResponse` est elle-même une sous-classe de `Response`.
diff --git a/docs/fr/docs/advanced/security/oauth2-scopes.md b/docs/fr/docs/advanced/security/oauth2-scopes.md
index f27b95b4b..af63ce553 100644
--- a/docs/fr/docs/advanced/security/oauth2-scopes.md
+++ b/docs/fr/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ Ils sont généralement utilisés pour déclarer des permissions de sécurité s
* `instagram_basic` est utilisé par Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` est utilisé par Google.
-/// info
+/// note | Remarque
Dans OAuth2, un « scope » est simplement une chaîne qui déclare une permission spécifique requise.
@@ -126,7 +126,7 @@ Nous le faisons ici pour montrer comment **FastAPI** gère des scopes déclarés
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | Détails techniques
+/// note | Détails techniques
`Security` est en réalité une sous-classe de `Depends`, et elle n’a qu’un paramètre supplémentaire que nous verrons plus tard.
diff --git a/docs/fr/docs/advanced/stream-data.md b/docs/fr/docs/advanced/stream-data.md
index 3b22910a1..e4939f256 100644
--- a/docs/fr/docs/advanced/stream-data.md
+++ b/docs/fr/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@ Si vous voulez diffuser des données pouvant être structurées en JSON, vous de
Mais si vous voulez diffuser des données binaires pures ou des chaînes, voici comment procéder.
-/// info
+/// note | Remarque
Ajouté dans FastAPI 0.134.0.
@@ -90,7 +90,7 @@ Par exemple, ils n'ont pas de `await file.read()`, ni de `async for chunk in fil
Et dans de nombreux cas, leur lecture serait une opération bloquante (pouvant bloquer la boucle d'événements), car ils sont lus depuis le disque ou le réseau.
-/// info
+/// note | Remarque
L'exemple ci-dessus est en réalité une exception, car l'objet `io.BytesIO` est déjà en mémoire ; sa lecture ne bloquera donc rien.
diff --git a/docs/fr/docs/advanced/strict-content-type.md b/docs/fr/docs/advanced/strict-content-type.md
index d5c749e9d..bd4ba3b80 100644
--- a/docs/fr/docs/advanced/strict-content-type.md
+++ b/docs/fr/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ Si vous devez prendre en charge des clients qui n’envoient pas d’en-tête `C
Avec ce paramètre, les requêtes sans en-tête `Content-Type` verront leur corps analysé comme JSON, ce qui correspond au comportement des anciennes versions de FastAPI.
-/// info
+/// note | Remarque
Ce comportement et cette configuration ont été ajoutés dans FastAPI 0.132.0.
diff --git a/docs/fr/docs/advanced/websockets.md b/docs/fr/docs/advanced/websockets.md
index 737bbc72e..b544c6d06 100644
--- a/docs/fr/docs/advanced/websockets.md
+++ b/docs/fr/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ Ils fonctionnent de la même manière que pour les autres endpoints/*chemins d'a
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note | Remarque
Comme il s'agit d'un WebSocket, il n'est pas vraiment logique de lever une `HTTPException`, nous levons plutôt une `WebSocketException`.
diff --git a/docs/fr/docs/advanced/wsgi.md b/docs/fr/docs/advanced/wsgi.md
index fe39729f7..a1e56a45d 100644
--- a/docs/fr/docs/advanced/wsgi.md
+++ b/docs/fr/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@ Pour cela, vous pouvez utiliser `WSGIMiddleware` et l'utiliser pour envelopper v
## Utiliser `WSGIMiddleware` { #using-wsgimiddleware }
-/// info
+/// note | Remarque
Cela nécessite l'installation de `a2wsgi`, par exemple avec `pip install a2wsgi`.
diff --git a/docs/fr/docs/deployment/docker.md b/docs/fr/docs/deployment/docker.md
index 1567e1d58..5184d51df 100644
--- a/docs/fr/docs/deployment/docker.md
+++ b/docs/fr/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info
+/// note | Remarque
Il existe d'autres formats et outils pour définir et installer des dépendances de paquets.
@@ -556,7 +556,7 @@ Si vous utilisez des conteneurs (par ex. Docker, Kubernetes), alors il existe de
Si vous avez **plusieurs conteneurs**, probablement chacun exécutant un **seul processus** (par exemple, dans un cluster **Kubernetes**), alors vous voudrez probablement avoir un **conteneur séparé** effectuant le travail des **étapes préalables** dans un seul conteneur, exécutant un seul processus, **avant** d'exécuter les conteneurs worker répliqués.
-/// info
+/// note | Remarque
Si vous utilisez Kubernetes, ce sera probablement un [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/).
diff --git a/docs/fr/docs/deployment/fastapicloud.md b/docs/fr/docs/deployment/fastapicloud.md
index 836e91489..82c16330e 100644
--- a/docs/fr/docs/deployment/fastapicloud.md
+++ b/docs/fr/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-Vous pouvez déployer votre application FastAPI sur [FastAPI Cloud](https://fastapicloud.com) avec une **seule commande**, allez vous inscrire sur la liste d’attente si ce n’est pas déjà fait. 🚀
-
-## Se connecter { #login }
-
-Vous devez vous assurer que vous avez déjà un compte **FastAPI Cloud** (nous vous avons invité depuis la liste d’attente 😉).
-
-Connectez-vous ensuite :
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## Déployer { #deploy }
-
-Déployez maintenant votre application, avec une **seule commande** :
+Vous pouvez déployer votre application FastAPI sur [FastAPI Cloud](https://fastapicloud.com) avec une **seule commande**. 🚀
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
+La CLI détecte automatiquement votre application FastAPI et la déploie dans le cloud. Si vous n’êtes pas connecté, votre navigateur s’ouvrira pour terminer le processus d’authentification.
+
C’est tout ! Vous pouvez maintenant accéder à votre application à cette URL. ✨
## À propos de FastAPI Cloud { #about-fastapi-cloud }
@@ -62,4 +44,4 @@ Suivez les guides de votre fournisseur cloud pour déployer des applications Fas
## Déployer votre propre serveur { #deploy-your-own-server }
-Je vous expliquerai également plus loin dans ce guide de **Déploiement** tous les détails, afin que vous compreniez ce qui se passe, ce qui doit être fait, et comment déployer des applications FastAPI par vous-même, y compris sur vos propres serveurs. 🤓
+Je vous expliquerai également plus loin dans ce guide de **Déploiement** tous les détails, afin que vous compreniez ce qui se passe, ce qui doit être fait, ou comment déployer des applications FastAPI par vous-même, y compris sur vos propres serveurs. 🤓
diff --git a/docs/fr/docs/deployment/manually.md b/docs/fr/docs/deployment/manually.md
index 4b87df993..90dd31d85 100644
--- a/docs/fr/docs/deployment/manually.md
+++ b/docs/fr/docs/deployment/manually.md
@@ -56,7 +56,6 @@ Il existe plusieurs alternatives, notamment :
* [Hypercorn](https://hypercorn.readthedocs.io/) : un serveur ASGI compatible avec HTTP/2 et Trio entre autres fonctionnalités.
* [Daphne](https://github.com/django/daphne) : le serveur ASGI conçu pour Django Channels.
* [Granian](https://github.com/emmett-framework/granian) : un serveur HTTP Rust pour les applications Python.
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/) : NGINX Unit est un environnement d'exécution d'applications web léger et polyvalent.
## Machine serveur et programme serveur { #server-machine-and-server-program }
diff --git a/docs/fr/docs/deployment/server-workers.md b/docs/fr/docs/deployment/server-workers.md
index c0eca2dcc..4271621c8 100644
--- a/docs/fr/docs/deployment/server-workers.md
+++ b/docs/fr/docs/deployment/server-workers.md
@@ -17,7 +17,7 @@ Comme vous l'avez vu dans le chapitre précédent sur les [Concepts de déploiem
Ici, je vais vous montrer comment utiliser Uvicorn avec des processus workers en utilisant la commande `fastapi` ou directement la commande `uvicorn`.
-/// info | Info
+/// note | Remarque
Si vous utilisez des conteneurs, par exemple avec Docker ou Kubernetes, je vous en dirai plus à ce sujet dans le prochain chapitre : [FastAPI dans des conteneurs - Docker](docker.md).
diff --git a/docs/fr/docs/how-to/extending-openapi.md b/docs/fr/docs/how-to/extending-openapi.md
index bdf4eeba9..dab3e5868 100644
--- a/docs/fr/docs/how-to/extending-openapi.md
+++ b/docs/fr/docs/how-to/extending-openapi.md
@@ -25,9 +25,17 @@ Et cette fonction `get_openapi()` reçoit comme paramètres :
* `openapi_version` : La version de la spécification OpenAPI utilisée. Par défaut, la plus récente : `3.1.0`.
* `summary` : Un court résumé de l'API.
* `description` : La description de votre API ; elle peut inclure du markdown et sera affichée dans la documentation.
-* `routes` : Une liste de routes ; chacune correspond à un *chemin d'accès* enregistré. Elles sont extraites de `app.routes`.
+* `routes` : Les routes de l'application, extraites de `app.routes`. FastAPI les utilise pour collecter les *chemins d'accès* enregistrés, y compris ceux provenant des routeurs inclus.
-/// info
+/// tip | Détails techniques
+
+`app.routes` est un arbre de routes de plus bas niveau. Il peut inclure des routes candidates que FastAPI utilise en interne pour les routeurs inclus, et pas uniquement des objets `APIRoute` finaux.
+
+Vous pouvez néanmoins passer `app.routes` à `get_openapi()`. FastAPI parcourra cet arbre de routes pour collecter les chemins d'accès effectifs.
+
+///
+
+/// note | Remarque
Le paramètre `summary` est disponible à partir d'OpenAPI 3.1.0, pris en charge par FastAPI 0.99.0 et versions ultérieures.
diff --git a/docs/fr/docs/how-to/separate-openapi-schemas.md b/docs/fr/docs/how-to/separate-openapi-schemas.md
index fd767d738..aef467ed6 100644
--- a/docs/fr/docs/how-to/separate-openapi-schemas.md
+++ b/docs/fr/docs/how-to/separate-openapi-schemas.md
@@ -85,7 +85,7 @@ Le cas d'usage principal est probablement que vous avez déjà du code client/SD
Dans ce cas, vous pouvez désactiver cette fonctionnalité dans **FastAPI**, avec le paramètre `separate_input_output_schemas=False`.
-/// info | info
+/// note | Remarque
La prise en charge de `separate_input_output_schemas` a été ajoutée dans FastAPI `0.102.0`. 🤓
diff --git a/docs/fr/docs/index.md b/docs/fr/docs/index.md
index 4c5bea3e4..3cfcdfd29 100644
--- a/docs/fr/docs/index.md
+++ b/docs/fr/docs/index.md
@@ -143,7 +143,7 @@ Les principales fonctionnalités sont :
---
-« _Si quelqu’un cherche à construire une API Python de production, je recommande vivement **FastAPI**. Il est **magnifiquement conçu**, **simple à utiliser** et **hautement scalable** — il est devenu un **composant clé** de notre stratégie de développement API-first._ »
+« _Si quelqu’un cherche à construire une API Python de production, je recommande vivement **FastAPI**. Il est **magnifiquement conçu**, **simple à utiliser** et **hautement scalable**, il est devenu un **composant clé** de notre stratégie de développement API-first et alimente de nombreuses automatisations et services tels que notre Virtual TAC Engineer._ »
Deon Pillsbury -
Cisco (ref)
@@ -492,9 +492,7 @@ Pour un exemple plus complet comprenant plus de fonctionnalités, voir le
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+La CLI détectera automatiquement votre application FastAPI et la déploiera dans le cloud. Si vous n'êtes pas connecté, votre navigateur s'ouvrira pour terminer le processus d'authentification.
+
C'est tout ! Vous pouvez maintenant accéder à votre application à cette URL. ✨
#### À propos de FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/fr/docs/tutorial/bigger-applications.md b/docs/fr/docs/tutorial/bigger-applications.md
index d5e1bb567..0e331e139 100644
--- a/docs/fr/docs/tutorial/bigger-applications.md
+++ b/docs/fr/docs/tutorial/bigger-applications.md
@@ -396,9 +396,9 @@ Cela inclura toutes les routes de ce routeur comme faisant partie de l'applicati
/// note | Détails techniques
-En interne, cela créera en fait un *chemin d'accès* pour chaque *chemin d'accès* qui a été déclaré dans le `APIRouter`.
+FastAPI conserve le `APIRouter` original et ses `APIRoute` actifs lorsque le routeur est inclus dans l'application principale.
-Donc, en coulisses, cela fonctionnera comme si tout faisait partie d'une seule et même application.
+Cela signifie que des sous-classes personnalisées de `APIRouter` et `APIRoute` peuvent toujours intervenir après l'inclusion du routeur.
///
@@ -406,7 +406,7 @@ Donc, en coulisses, cela fonctionnera comme si tout faisait partie d'une seule e
Vous n'avez pas à vous soucier de la performance lors de l'inclusion de routeurs.
-Cela prendra des microsecondes et ne se produira qu'au démarrage.
+C'est conçu pour être léger et pour éviter d'ajouter une surcharge à chaque requête.
Donc cela n'affectera pas la performance. ⚡
@@ -461,7 +461,7 @@ Les `APIRouter` ne sont pas « montés », ils ne sont pas isolés du reste de l
C'est parce que nous voulons inclure leurs *chemins d'accès* dans le schéma OpenAPI et les interfaces utilisateur.
-Comme nous ne pouvons pas simplement les isoler et les « monter » indépendamment du reste, les *chemins d'accès* sont « clonés » (recréés), pas inclus directement.
+FastAPI conserve les routeurs et chemins d'accès originaux actifs, et combine les préfixes de routeur, dépendances, tags, réponses et autres métadonnées lors du traitement des requêtes et de la génération d'OpenAPI.
///
@@ -482,7 +482,7 @@ from app.main import app
De cette façon, la commande `fastapi` saura où trouver votre app.
-/// note | Remarque
+/// Note | Remarque
Vous pourriez aussi passer le chemin à la commande, comme :
@@ -532,4 +532,16 @@ De la même manière que vous pouvez inclure un `APIRouter` dans une application
router.include_router(other_router)
```
-Vous devez vous assurer de le faire avant d'inclure `router` dans l'application `FastAPI`, afin que les *chemins d'accès* de `other_router` soient également inclus.
+Vous pouvez le faire avant ou après avoir inclus `router` dans l'application `FastAPI`. FastAPI inclura quand même les *chemins d'accès* de `other_router` dans le routage et dans OpenAPI.
+
+Il en va de même pour les *chemins d'accès* ajoutés plus tard aux routeurs. Ils seront visibles via l'inclusion antérieure également.
+
+/// warning | Détails techniques
+
+Évitez de modifier directement `router.routes` après avoir inclus un routeur. FastAPI considère l'inclusion d'un routeur comme « en direct », de sorte que le routeur original et ses routes restent utilisés pour le routage et la génération d'OpenAPI.
+
+Utilisez les API documentées comme les décorateurs de *chemin d'accès* et `.include_router()` pour ajouter des routes et des routeurs.
+
+Considérez `router.routes` comme un arbre de routes de plus bas niveau pouvant contenir des définitions de routes et des routeurs inclus, et évitez de vous y fier comme à une liste plate de *chemins d'accès* finaux.
+
+///
diff --git a/docs/fr/docs/tutorial/body-multiple-params.md b/docs/fr/docs/tutorial/body-multiple-params.md
index 1c1ab0fca..d8d1af94f 100644
--- a/docs/fr/docs/tutorial/body-multiple-params.md
+++ b/docs/fr/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ Par exemple :
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info
+/// note | Remarque
`Body` possède également les mêmes paramètres supplémentaires de validation et de métadonnées que `Query`, `Path` et d'autres que vous verrez plus tard.
@@ -123,7 +123,7 @@ Par défaut, **FastAPI** attendra alors son contenu directement.
Mais si vous voulez qu'il attende un JSON avec une clé `item` contenant le contenu du modèle, comme lorsqu'on déclare des paramètres supplémentaires du corps de la requête, vous pouvez utiliser le paramètre spécial `embed` de `Body` :
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
comme dans :
diff --git a/docs/fr/docs/tutorial/body-nested-models.md b/docs/fr/docs/tutorial/body-nested-models.md
index 2d4064310..014551bc7 100644
--- a/docs/fr/docs/tutorial/body-nested-models.md
+++ b/docs/fr/docs/tutorial/body-nested-models.md
@@ -135,7 +135,7 @@ Cela attendra (convertira, validera, documentera, etc.) un corps JSON comme :
]
}
```
-/// info
+/// note | Remarque
Remarquez que la clé `images` contient maintenant une liste d'objets image.
@@ -147,7 +147,7 @@ Vous pouvez définir des modèles imbriqués à une profondeur arbitraire :
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info
+/// note | Remarque
Remarquez que `Offer` a une liste d’`Item`, qui à leur tour ont une liste optionnelle d’`Image`.
diff --git a/docs/fr/docs/tutorial/body.md b/docs/fr/docs/tutorial/body.md
index 6a9466798..55d184259 100644
--- a/docs/fr/docs/tutorial/body.md
+++ b/docs/fr/docs/tutorial/body.md
@@ -8,7 +8,7 @@ Votre API aura presque toujours à envoyer un corps de **réponse**. Mais un cli
Pour déclarer un corps de **requête**, on utilise les modèles de [Pydantic](https://docs.pydantic.dev/) en profitant de tous leurs avantages et fonctionnalités.
-/// info
+/// note | Remarque
Pour envoyer de la donnée, vous devez utiliser : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`.
diff --git a/docs/fr/docs/tutorial/cookie-param-models.md b/docs/fr/docs/tutorial/cookie-param-models.md
index c6fc2f826..2b8edbab7 100644
--- a/docs/fr/docs/tutorial/cookie-param-models.md
+++ b/docs/fr/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@ Vous pouvez voir les cookies définis dans l'interface de la documentation à `/
-/// info
+/// note | Remarque
Gardez à l'esprit que, comme les **navigateurs gèrent les cookies** de manière particulière et en arrière-plan, ils **n'autorisent pas** facilement **JavaScript** à y accéder.
diff --git a/docs/fr/docs/tutorial/cookie-params.md b/docs/fr/docs/tutorial/cookie-params.md
index 8f77d35dc..1d3801219 100644
--- a/docs/fr/docs/tutorial/cookie-params.md
+++ b/docs/fr/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@ Mais rappelez-vous que lorsque vous importez `Query`, `Path`, `Cookie` et d'autr
///
-/// info
+/// note | Remarque
Pour déclarer des cookies, vous devez utiliser `Cookie`, sinon les paramètres seraient interprétés comme des paramètres de requête.
///
-/// info
+/// note | Remarque
Gardez à l'esprit que, comme **les navigateurs gèrent les cookies** de manière particulière et en coulisses, ils **n'autorisent pas** facilement **JavaScript** à y accéder.
diff --git a/docs/fr/docs/tutorial/debugging.md b/docs/fr/docs/tutorial/debugging.md
index 6452b43fa..1a3e9c509 100644
--- a/docs/fr/docs/tutorial/debugging.md
+++ b/docs/fr/docs/tutorial/debugging.md
@@ -72,7 +72,7 @@ Ainsi, la ligne :
ne sera pas exécutée.
-/// info
+/// note | Remarque
Pour plus d'informations, consultez [la documentation officielle de Python](https://docs.python.org/3/library/__main__.html).
diff --git a/docs/fr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/fr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index b32728a30..ce3c7923e 100644
--- a/docs/fr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/fr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@ Cela peut également éviter toute confusion pour les nouveaux développeurs qui
///
-/// info | Info
+/// note | Remarque
Dans cet exemple, nous utilisons des en-têtes personnalisés fictifs `X-Key` et `X-Token`.
diff --git a/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md
index 53d4ae4cf..8da931d11 100644
--- a/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info
+/// note | Remarque
Une **seule réponse** sera envoyée au client. Il peut s'agir d'une des réponses d'erreur ou de la réponse provenant du *chemin d'accès*.
diff --git a/docs/fr/docs/tutorial/dependencies/index.md b/docs/fr/docs/tutorial/dependencies/index.md
index 03eea57e3..84b4b70b6 100644
--- a/docs/fr/docs/tutorial/dependencies/index.md
+++ b/docs/fr/docs/tutorial/dependencies/index.md
@@ -6,7 +6,7 @@ Il est conçu pour être très simple à utiliser, et pour faciliter l’intégr
## Qu’est-ce que « l’injection de dépendances » { #what-is-dependency-injection }
-L’**« injection de dépendances »** signifie, en programmation, qu’il existe un moyen pour votre code (dans ce cas, vos fonctions de chemins d’accès) de déclarer ce dont il a besoin pour fonctionner et utiliser : « dépendances ».
+L’**« injection de dépendances »** signifie, en programmation, qu’il existe un moyen pour votre code (dans ce cas, vos fonctions de chemin d’accès) de déclarer ce dont il a besoin pour fonctionner et utiliser : « dépendances ».
Ensuite, ce système (dans ce cas **FastAPI**) se charge de faire tout le nécessaire pour fournir à votre code ces dépendances requises (« injecter » les dépendances).
@@ -37,7 +37,7 @@ C’est tout.
**2 lignes**.
-Et elle a la même forme et structure que toutes vos fonctions de chemins d’accès.
+Et elle a la même forme et structure que toutes vos fonctions de chemin d’accès.
Vous pouvez la considérer comme une fonction de chemin d’accès sans le « décorateur » (sans le `@app.get("/some-path")`).
@@ -51,7 +51,7 @@ Dans ce cas, cette dépendance attend :
Puis elle retourne simplement un `dict` contenant ces valeurs.
-/// info
+/// note | Remarque
FastAPI a ajouté la prise en charge de `Annotated` (et a commencé à le recommander) dans la version 0.95.0.
@@ -79,7 +79,7 @@ Ce paramètre doit être quelque chose comme une fonction.
Vous ne l’appelez pas directement (n’ajoutez pas de parenthèses à la fin), vous le passez simplement en paramètre à `Depends()`.
-Et cette fonction prend des paramètres de la même manière que les fonctions de chemins d’accès.
+Et cette fonction prend des paramètres de la même manière que les fonctions de chemin d’accès.
/// tip | Astuce
@@ -106,7 +106,7 @@ common_parameters --> read_users
De cette façon vous écrivez le code partagé une seule fois et **FastAPI** se charge de l’appeler pour vos chemins d’accès.
-/// check | Vérifications
+/// tip | Astuce
Notez que vous n’avez pas à créer une classe spéciale et à la passer quelque part à **FastAPI** pour l’« enregistrer » ou quoi que ce soit de similaire.
@@ -142,11 +142,11 @@ Cela sera particulièrement utile lorsque vous l’utiliserez dans une **grande
## Utiliser `async` ou non { #to-async-or-not-to-async }
-Comme les dépendances seront aussi appelées par **FastAPI** (tout comme vos fonctions de chemins d’accès), les mêmes règles s’appliquent lors de la définition de vos fonctions.
+Comme les dépendances seront aussi appelées par **FastAPI** (tout comme vos fonctions de chemin d’accès), les mêmes règles s’appliquent lors de la définition de vos fonctions.
Vous pouvez utiliser `async def` ou un `def` normal.
-Et vous pouvez déclarer des dépendances avec `async def` à l’intérieur de fonctions de chemins d’accès `def` normales, ou des dépendances `def` à l’intérieur de fonctions de chemins d’accès `async def`, etc.
+Et vous pouvez déclarer des dépendances avec `async def` à l’intérieur de fonctions de chemin d’accès `def` normales, ou des dépendances `def` à l’intérieur de fonctions de chemin d’accès `async def`, etc.
Peu importe. **FastAPI** saura quoi faire.
@@ -166,7 +166,7 @@ Ainsi, la documentation interactive contiendra aussi toutes les informations iss
## Utilisation simple { #simple-usage }
-Si vous y regardez de près, les fonctions de chemins d’accès sont déclarées pour être utilisées chaque fois qu’un « chemin » et une « opération » correspondent, puis **FastAPI** se charge d’appeler la fonction avec les bons paramètres, en extrayant les données de la requête.
+Si vous y regardez de près, les fonctions de chemin d’accès sont déclarées pour être utilisées chaque fois qu’un « chemin » et une « opération » correspondent, puis **FastAPI** se charge d’appeler la fonction avec les bons paramètres, en extrayant les données de la requête.
En réalité, tous (ou la plupart) des frameworks web fonctionnent de cette manière.
@@ -184,7 +184,7 @@ D’autres termes courants pour cette même idée « d’injection de dépendanc
## Plug-ins **FastAPI** { #fastapi-plug-ins }
-Les intégrations et « plug-ins » peuvent être construits en utilisant le système d’**injection de dépendances**. Mais en réalité, il n’y a **pas besoin de créer des « plug-ins »**, car en utilisant des dépendances il est possible de déclarer un nombre infini d’intégrations et d’interactions qui deviennent disponibles pour vos fonctions de chemins d’accès.
+Les intégrations et « plug-ins » peuvent être construits en utilisant le système d’**injection de dépendances**. Mais en réalité, il n’y a **pas besoin de créer des « plug-ins »**, car en utilisant des dépendances il est possible de déclarer un nombre infini d’intégrations et d’interactions qui deviennent disponibles pour vos fonctions de chemin d’accès.
Et les dépendances peuvent être créées de manière très simple et intuitive, ce qui vous permet d’importer juste les packages Python dont vous avez besoin, et de les intégrer à vos fonctions d’API en quelques lignes de code, *littéralement*.
diff --git a/docs/fr/docs/tutorial/dependencies/sub-dependencies.md b/docs/fr/docs/tutorial/dependencies/sub-dependencies.md
index 473ff02ba..c1ba81630 100644
--- a/docs/fr/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/fr/docs/tutorial/dependencies/sub-dependencies.md
@@ -1,8 +1,8 @@
# Sous-dépendances { #sub-dependencies }
-Vous pouvez créer des dépendances qui ont des sous-dépendances.
+Vous pouvez créer des dépendances qui ont des **sous-dépendances**.
-Elles peuvent être aussi profondes que nécessaire.
+Elles peuvent être aussi **profondes** que nécessaire.
**FastAPI** se chargera de les résoudre.
@@ -35,7 +35,7 @@ Nous pouvons ensuite utiliser la dépendance avec :
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info
+/// note | Remarque
Notez que nous ne déclarons qu'une seule dépendance dans la *fonction de chemin d'accès*, `query_or_cookie_extractor`.
diff --git a/docs/fr/docs/tutorial/first-steps.md b/docs/fr/docs/tutorial/first-steps.md
index 0a82004d2..3d88fe5a9 100644
--- a/docs/fr/docs/tutorial/first-steps.md
+++ b/docs/fr/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ ce qui équivaudrait à :
from backend.main import app
```
-### `fastapi dev` avec un chemin { #fastapi-dev-with-path }
+### `fastapi dev` avec un chemin ou avec l’option CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
Vous pouvez également passer le chemin du fichier à la commande `fastapi dev`, et elle devinera l’objet d’application FastAPI à utiliser :
@@ -188,29 +188,19 @@ Vous pouvez également passer le chemin du fichier à la commande `fastapi dev`,
$ fastapi dev main.py
```
-Mais vous devrez vous souvenir de passer le chemin correct à chaque exécution de la commande `fastapi`.
-
-De plus, d’autres outils pourraient ne pas être capables de le trouver, par exemple l’[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandé d’utiliser le `entrypoint` dans `pyproject.toml`.
-
-### Déployer votre application (optionnel) { #deploy-your-app-optional }
-
-Vous pouvez, si vous le souhaitez, déployer votre application FastAPI sur [FastAPI Cloud](https://fastapicloud.com), allez rejoindre la liste d’attente si ce n’est pas déjà fait. 🚀
-
-Si vous avez déjà un compte **FastAPI Cloud** (nous vous avons invité depuis la liste d’attente 😉), vous pouvez déployer votre application avec une seule commande.
-
-Avant de déployer, vous devez vous assurer que vous êtes connecté :
-
-
+Ou bien, vous pouvez aussi passer l’option `--entrypoint` à la commande `fastapi dev` :
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+Mais vous devrez vous souvenir de passer le chemin\entrypoint correct à chaque exécution de la commande `fastapi`.
+
+De plus, d’autres outils pourraient ne pas être capables de le trouver, par exemple l’[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandé d’utiliser le `entrypoint` dans `pyproject.toml`.
-Puis déployez votre application :
+### Déployer votre application (optionnel) { #deploy-your-app-optional }
+
+Vous pouvez éventuellement déployer votre application FastAPI sur [FastAPI Cloud](https://fastapicloud.com) avec une seule commande. 🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+Le CLI détectera automatiquement votre application FastAPI et la déploiera dans le cloud. Si vous n’êtes pas connecté, votre navigateur s’ouvrira pour terminer le processus d’authentification.
+
C’est tout ! Vous pouvez maintenant accéder à votre application à cette URL. ✨
## Récapitulatif, étape par étape { #recap-step-by-step }
@@ -270,7 +262,7 @@ https://example.com/items/foo
/items/foo
```
-/// info
+/// note | Remarque
Un « chemin » est aussi couramment appelé « endpoint » ou « route ».
@@ -322,7 +314,7 @@ Le `@app.get("/")` indique à **FastAPI** que la fonction juste en dessous est c
* le chemin `/`
* en utilisant une get opération
-/// info | `@decorator` Info
+/// note | Informations sur `@decorator`
Cette syntaxe `@something` en Python est appelée un « décorateur ».
diff --git a/docs/fr/docs/tutorial/metadata.md b/docs/fr/docs/tutorial/metadata.md
index 87f72fefa..75a8542f8 100644
--- a/docs/fr/docs/tutorial/metadata.md
+++ b/docs/fr/docs/tutorial/metadata.md
@@ -74,7 +74,7 @@ Utilisez le paramètre `tags` avec vos *chemins d'accès* (et `APIRouter`s) pour
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info
+/// note | Remarque
En savoir plus sur les tags dans [Configuration de chemins d'accès](path-operation-configuration.md#tags).
diff --git a/docs/fr/docs/tutorial/path-operation-configuration.md b/docs/fr/docs/tutorial/path-operation-configuration.md
index 185adb6dd..572d38e01 100644
--- a/docs/fr/docs/tutorial/path-operation-configuration.md
+++ b/docs/fr/docs/tutorial/path-operation-configuration.md
@@ -72,13 +72,13 @@ Vous pouvez spécifier la description de la réponse avec le paramètre `respons
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info
+/// note | Remarque
Notez que `response_description` se réfère spécifiquement à la réponse, tandis que `description` se réfère au *chemin d'accès* en général.
///
-/// check | Vérifications
+/// tip | Astuce
OpenAPI spécifie que chaque *chemin d'accès* requiert une description de réponse.
diff --git a/docs/fr/docs/tutorial/path-params-numeric-validations.md b/docs/fr/docs/tutorial/path-params-numeric-validations.md
index b61b42ef7..c308541a1 100644
--- a/docs/fr/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/fr/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@ Tout d'abord, importez `Path` de `fastapi`, et importez `Annotated` :
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info
+/// note | Remarque
FastAPI a ajouté le support pour `Annotated` (et a commencé à le recommander) dans la version 0.95.0.
@@ -131,7 +131,7 @@ Et vous pouvez également déclarer des validations numériques :
* `lt` : `l`ess `t`han
* `le` : `l`ess than or `e`qual
-/// info
+/// note | Remarque
`Query`, `Path`, et d'autres classes que vous verrez plus tard sont des sous-classes d'une classe commune `Param`.
diff --git a/docs/fr/docs/tutorial/path-params.md b/docs/fr/docs/tutorial/path-params.md
index f84c4c035..e8d20bb74 100644
--- a/docs/fr/docs/tutorial/path-params.md
+++ b/docs/fr/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@ Vous pouvez déclarer le type d'un paramètre de chemin dans la fonction, en uti
Ici, `item_id` est déclaré comme `int`.
-/// check | Vérifications
+/// tip | Astuce
Cela vous apporte la prise en charge par l'éditeur dans votre fonction, avec vérifications d'erreurs, autocomplétion, etc.
@@ -34,7 +34,7 @@ Si vous exécutez cet exemple et ouvrez votre navigateur sur [http://127.0.0.1:8
{"item_id":3}
```
-/// check | Vérifications
+/// tip | Astuce
Remarquez que la valeur reçue par votre fonction (et renvoyée) est `3`, en tant qu'entier (`int`) Python, pas la chaîne de caractères « 3 ».
@@ -66,7 +66,7 @@ car le paramètre de chemin `item_id` a pour valeur « foo », qui n'est pas un
La même erreur apparaîtrait si vous fournissiez un `float` au lieu d'un `int`, comme ici : [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Vérifications
+/// tip | Astuce
Ainsi, avec la même déclaration de type Python, **FastAPI** vous fournit la validation de données.
@@ -82,7 +82,7 @@ Et lorsque vous ouvrez votre navigateur sur [http://127.0.0.1:8000/docs](http://
-/// check | Vérifications
+/// tip | Astuce
À nouveau, simplement avec cette même déclaration de type Python, **FastAPI** vous fournit une documentation interactive automatique (intégrant Swagger UI).
diff --git a/docs/fr/docs/tutorial/query-params-str-validations.md b/docs/fr/docs/tutorial/query-params-str-validations.md
index 57d358758..fc979334e 100644
--- a/docs/fr/docs/tutorial/query-params-str-validations.md
+++ b/docs/fr/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ Pour ce faire, importez d’abord :
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info
+/// note | Remarque
FastAPI a ajouté la prise en charge de `Annotated` (et a commencé à le recommander) dans la version 0.95.0.
@@ -381,7 +381,7 @@ Par exemple, ce validateur personnalisé vérifie que l’ID d’item commence p
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info
+/// note | Remarque
C’est disponible avec Pydantic version 2 ou supérieure. 😎
diff --git a/docs/fr/docs/tutorial/query-params.md b/docs/fr/docs/tutorial/query-params.md
index 8ecbc2853..cf8474162 100644
--- a/docs/fr/docs/tutorial/query-params.md
+++ b/docs/fr/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ De la même façon, vous pouvez déclarer des paramètres de requête optionnels
Dans ce cas, le paramètre de fonction `q` sera optionnel et vaudra `None` par défaut.
-/// check | Vérifications
+/// tip | Astuce
Notez également que **FastAPI** est suffisamment intelligent pour remarquer que le paramètre de chemin `item_id` est un paramètre de chemin et que `q` ne l'est pas, c'est donc un paramètre de requête.
diff --git a/docs/fr/docs/tutorial/request-files.md b/docs/fr/docs/tutorial/request-files.md
index e55f8e57f..591a4e2e9 100644
--- a/docs/fr/docs/tutorial/request-files.md
+++ b/docs/fr/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Vous pouvez définir des fichiers à téléverser par le client en utilisant `File`.
-/// info
+/// note | Remarque
Pour recevoir des fichiers téléversés, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ Créez des paramètres de fichier de la même manière que pour `Body` ou `Form`
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info
+/// note | Remarque
`File` est une classe qui hérite directement de `Form`.
@@ -44,7 +44,7 @@ Pour déclarer des fichiers dans le corps de la requête, vous devez utiliser `F
Les fichiers seront téléversés en « données de formulaire ».
-Si vous déclarez le type de votre paramètre de *fonction de chemin d'accès* comme `bytes`, **FastAPI** lira le fichier pour vous et vous recevrez le contenu sous forme de `bytes`.
+Si vous déclarez le type de votre *fonction de chemin d'accès* comme `bytes`, **FastAPI** lira le fichier pour vous et vous recevrez le contenu sous forme de `bytes`.
Gardez à l'esprit que cela signifie que tout le contenu sera stocké en mémoire. Cela fonctionnera bien pour de petits fichiers.
diff --git a/docs/fr/docs/tutorial/request-form-models.md b/docs/fr/docs/tutorial/request-form-models.md
index 0f1e6dcfd..ae1da248d 100644
--- a/docs/fr/docs/tutorial/request-form-models.md
+++ b/docs/fr/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Vous pouvez utiliser des **modèles Pydantic** pour déclarer des **champs de formulaire** dans FastAPI.
-/// info
+/// note | Remarque
Pour utiliser les formulaires, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/fr/docs/tutorial/request-forms-and-files.md b/docs/fr/docs/tutorial/request-forms-and-files.md
index 2e3f5b58b..4b930dea2 100644
--- a/docs/fr/docs/tutorial/request-forms-and-files.md
+++ b/docs/fr/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Vous pouvez définir des fichiers et des champs de formulaire en même temps à l'aide de `File` et `Form`.
-/// info
+/// note | Remarque
Pour recevoir des fichiers téléversés et/ou des données de formulaire, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/fr/docs/tutorial/request-forms.md b/docs/fr/docs/tutorial/request-forms.md
index 9596f68ce..bdc8c6fb0 100644
--- a/docs/fr/docs/tutorial/request-forms.md
+++ b/docs/fr/docs/tutorial/request-forms.md
@@ -2,11 +2,11 @@
Lorsque vous devez recevoir des champs de formulaire au lieu de JSON, vous pouvez utiliser `Form`.
-/// info
+/// note | Remarque
Pour utiliser les formulaires, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart).
-Assurez-vous de créer un [environnement virtuel](../virtual-environments.md), de l'activer, puis installez-le, par exemple :
+Vous devez créer un [environnement virtuel](../virtual-environments.md), l'activer, puis installer le paquet, par exemple :
```console
$ pip install python-multipart
@@ -32,7 +32,7 @@ La spécification exige que les champs soient
Avec `Form`, vous pouvez déclarer les mêmes configurations que pour `Body` (ainsi que `Query`, `Path`, `Cookie`), y compris la validation, des exemples, un alias (p. ex. `user-name` au lieu de `username`), etc.
-/// info
+/// note | Remarque
`Form` est une classe qui hérite directement de `Body`.
diff --git a/docs/fr/docs/tutorial/response-model.md b/docs/fr/docs/tutorial/response-model.md
index e3926a0c1..322b17044 100644
--- a/docs/fr/docs/tutorial/response-model.md
+++ b/docs/fr/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ Ici, nous déclarons un modèle `UserIn`, il contiendra un mot de passe en clair
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Info
+/// note | Remarque
Pour utiliser `EmailStr`, installez d'abord [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -251,7 +251,7 @@ Ainsi, si vous envoyez une requête à ce *chemin d'accès* pour l'article avec
}
```
-/// info | Info
+/// note | Remarque
Vous pouvez également utiliser :
diff --git a/docs/fr/docs/tutorial/response-status-code.md b/docs/fr/docs/tutorial/response-status-code.md
index c8e45cd40..e4a666ebf 100644
--- a/docs/fr/docs/tutorial/response-status-code.md
+++ b/docs/fr/docs/tutorial/response-status-code.md
@@ -18,7 +18,7 @@ Remarquez que `status_code` est un paramètre de la méthode « decorator » (`g
Le paramètre `status_code` reçoit un nombre correspondant au code d'état HTTP.
-/// info
+/// note | Remarque
`status_code` peut aussi recevoir un `IntEnum`, comme le [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) de Python.
diff --git a/docs/fr/docs/tutorial/schema-extra-example.md b/docs/fr/docs/tutorial/schema-extra-example.md
index 404edff46..6f254aafe 100644
--- a/docs/fr/docs/tutorial/schema-extra-example.md
+++ b/docs/fr/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@ Par exemple, vous pourriez l'utiliser pour ajouter des métadonnées pour une in
///
-/// info
+/// note | Remarque
OpenAPI 3.1.0 (utilisé depuis FastAPI 0.99.0) a ajouté la prise en charge de `examples`, qui fait partie du standard **JSON Schema**.
@@ -155,7 +155,7 @@ OpenAPI a également ajouté les champs `example` et `examples` à d'autres part
* `File()`
* `Form()`
-/// info
+/// note | Remarque
Ce paramètre `examples` ancien et spécifique à OpenAPI est désormais `openapi_examples` depuis FastAPI `0.103.0`.
@@ -171,7 +171,7 @@ Et désormais, ce nouveau champ `examples` a priorité sur l'ancien champ unique
Ce nouveau champ `examples` dans JSON Schema est **juste une `list`** d'exemples, et non pas un dict avec des métadonnées supplémentaires comme dans les autres endroits d'OpenAPI (décrits ci-dessus).
-/// info
+/// note | Remarque
Même après la sortie d'OpenAPI 3.1.0 avec cette nouvelle intégration plus simple avec JSON Schema, pendant un temps, Swagger UI, l'outil qui fournit la documentation automatique, ne prenait pas en charge OpenAPI 3.1.0 (il le fait depuis la version 5.0.0 🎉).
diff --git a/docs/fr/docs/tutorial/security/first-steps.md b/docs/fr/docs/tutorial/security/first-steps.md
index c1d36d501..73cf4f38c 100644
--- a/docs/fr/docs/tutorial/security/first-steps.md
+++ b/docs/fr/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@ Copiez l'exemple dans un fichier `main.py` :
## Exécuter { #run-it }
-/// info
+/// note | Remarque
Le package [`python-multipart`](https://github.com/Kludex/python-multipart) est installé automatiquement avec **FastAPI** lorsque vous exécutez la commande `pip install "fastapi[standard]"`.
@@ -60,7 +60,7 @@ Vous verrez quelque chose comme ceci :
-/// check | Bouton « Authorize » !
+/// tip | Bouton « Authorize » !
Vous avez déjà un tout nouveau bouton « Authorize ».
@@ -118,7 +118,7 @@ Voyons cela selon ce point de vue simplifié :
Dans cet exemple, nous allons utiliser **OAuth2**, avec le flux **Password**, en utilisant un token **Bearer**. Nous le faisons avec la classe `OAuth2PasswordBearer`.
-/// info
+/// note | Remarque
Un token « bearer » n'est pas la seule option.
@@ -148,7 +148,7 @@ Ce paramètre ne crée pas cet endpoint / *chemin d'accès*, mais déclare que l
Nous créerons bientôt aussi le véritable chemin d'accès.
-/// info
+/// note | Remarque
Si vous êtes un « Pythonista » très strict, vous pourriez ne pas apprécier le style du nom de paramètre `tokenUrl` au lieu de `token_url`.
@@ -176,7 +176,7 @@ Cette dépendance fournira une `str` qui est affectée au paramètre `token` de
**FastAPI** saura qu'il peut utiliser cette dépendance pour définir un « schéma de sécurité » dans le schéma OpenAPI (et la documentation API automatique).
-/// info | Détails techniques
+/// note | Détails techniques
**FastAPI** saura qu'il peut utiliser la classe `OAuth2PasswordBearer` (déclarée dans une dépendance) pour définir le schéma de sécurité dans OpenAPI parce qu'elle hérite de `fastapi.security.oauth2.OAuth2`, qui hérite à son tour de `fastapi.security.base.SecurityBase`.
diff --git a/docs/fr/docs/tutorial/security/get-current-user.md b/docs/fr/docs/tutorial/security/get-current-user.md
index 5f73efea9..97cffc666 100644
--- a/docs/fr/docs/tutorial/security/get-current-user.md
+++ b/docs/fr/docs/tutorial/security/get-current-user.md
@@ -52,7 +52,7 @@ Ici, **FastAPI** ne s'y trompera pas car vous utilisez `Depends`.
///
-/// check | Vérifications
+/// tip | Astuce
La manière dont ce système de dépendances est conçu nous permet d'avoir différentes dépendances (différents « dependables ») qui retournent toutes un modèle `User`.
diff --git a/docs/fr/docs/tutorial/security/oauth2-jwt.md b/docs/fr/docs/tutorial/security/oauth2-jwt.md
index eec5ab13c..810f1eef1 100644
--- a/docs/fr/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/fr/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info
+/// note | Remarque
Si vous prévoyez d'utiliser des algorithmes de signature numérique comme RSA ou ECDSA, vous devez installer la dépendance de bibliothèque de cryptographie `pyjwt[crypto]`.
@@ -213,7 +213,7 @@ En utilisant les identifiants :
Nom d'utilisateur : `johndoe`
Mot de passe : `secret`
-/// check | Vérifications
+/// tip | Astuce
Remarquez qu'à aucun endroit du code le mot de passe en clair « secret » n'apparaît, nous n'avons que la version hachée.
diff --git a/docs/fr/docs/tutorial/security/simple-oauth2.md b/docs/fr/docs/tutorial/security/simple-oauth2.md
index f47d94aa2..b0f974f0d 100644
--- a/docs/fr/docs/tutorial/security/simple-oauth2.md
+++ b/docs/fr/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ Ils sont normalement utilisés pour déclarer des permissions de sécurité spé
* `instagram_basic` est utilisé par Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` est utilisé par Google.
-/// info
+/// note | Remarque
En OAuth2, un « scope » est simplement une chaîne qui déclare une permission spécifique requise.
@@ -72,7 +72,7 @@ Si vous avez besoin de l'imposer, utilisez `OAuth2PasswordRequestFormStrict` au
* Un `client_id` optionnel (nous n'en avons pas besoin pour notre exemple).
* Un `client_secret` optionnel (nous n'en avons pas besoin pour notre exemple).
-/// info
+/// note | Remarque
La classe `OAuth2PasswordRequestForm` n'est pas une classe spéciale pour **FastAPI** comme l'est `OAuth2PasswordBearer`.
@@ -144,7 +144,7 @@ UserInDB(
)
```
-/// info
+/// note | Remarque
Pour une explication plus complète de `**user_dict`, consultez [la documentation pour **Modèles supplémentaires**](../extra-models.md#about-user-in-dict).
@@ -196,7 +196,7 @@ Ainsi, dans notre endpoint, nous n'obtiendrons un utilisateur que si l'utilisate
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info
+/// note | Remarque
L'en‑tête supplémentaire `WWW-Authenticate` avec la valeur `Bearer` que nous renvoyons ici fait également partie de la spécification.
diff --git a/docs/fr/docs/tutorial/server-sent-events.md b/docs/fr/docs/tutorial/server-sent-events.md
index f4ed506f6..d62e3bfa7 100644
--- a/docs/fr/docs/tutorial/server-sent-events.md
+++ b/docs/fr/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@ Vous pouvez diffuser des données vers le client en utilisant les **Server-Sent
C'est similaire à [Diffuser des JSON Lines](stream-json-lines.md), mais cela utilise le format `text/event-stream`, pris en charge nativement par les navigateurs via l’API [`EventSource`](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Info
+/// note | Remarque
Ajouté dans FastAPI 0.135.0.
diff --git a/docs/fr/docs/tutorial/stream-json-lines.md b/docs/fr/docs/tutorial/stream-json-lines.md
index aed0205cb..c06c0e006 100644
--- a/docs/fr/docs/tutorial/stream-json-lines.md
+++ b/docs/fr/docs/tutorial/stream-json-lines.md
@@ -1,8 +1,8 @@
# Diffuser des JSON Lines { #stream-json-lines }
-Vous pouvez avoir une séquence de données que vous souhaitez envoyer en « flux » ; vous pouvez le faire avec « JSON Lines ».
+Vous pouvez avoir une séquence de données que vous souhaitez envoyer en « flux », vous pouvez le faire avec « JSON Lines ».
-/// info
+/// note | Remarque
Ajouté dans FastAPI 0.134.0.
@@ -48,7 +48,7 @@ Une réponse aurait un type de contenu `application/jsonl` (au lieu de `applicat
C'est très similaire à un tableau JSON (équivalent d'une liste Python), mais au lieu d'être entouré de `[]` et d'avoir des `,` entre les éléments, il y a un objet JSON par ligne, ils sont séparés par un caractère de saut de ligne.
-/// info
+/// note | Remarque
Le point important est que votre application pourra produire chaque ligne à son tour, tandis que le client consomme les lignes précédentes.
diff --git a/docs/fr/docs/tutorial/testing.md b/docs/fr/docs/tutorial/testing.md
index 5cb2ee629..517603425 100644
--- a/docs/fr/docs/tutorial/testing.md
+++ b/docs/fr/docs/tutorial/testing.md
@@ -8,7 +8,7 @@ Avec cela, vous pouvez utiliser [pytest](https://docs.pytest.org/) directement a
## Utiliser `TestClient` { #using-testclient }
-/// info
+/// note | Remarque
Pour utiliser `TestClient`, installez d’abord [`httpx`](https://www.python-httpx.org).
@@ -144,7 +144,7 @@ Par exemple :
Pour plus d’informations sur la manière de transmettre des données au backend (en utilisant `httpx` ou le `TestClient`), consultez la [documentation HTTPX](https://www.python-httpx.org).
-/// info
+/// note | Remarque
Notez que le `TestClient` reçoit des données qui peuvent être converties en JSON, pas des modèles Pydantic.
diff --git a/docs/ja/docs/advanced/additional-responses.md b/docs/ja/docs/advanced/additional-responses.md
index 1d7c2f80e..ad0b1d4c9 100644
--- a/docs/ja/docs/advanced/additional-responses.md
+++ b/docs/ja/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@ FastAPI はそのモデルから JSON Schema を生成し、OpenAPI の適切な
///
-/// info | 情報
+/// note | 備考
`model` キーは OpenAPI の一部ではありません。
@@ -183,7 +183,7 @@ FastAPI はそこから Pydantic モデルを取得して JSON Schema を生成
///
-/// info | 情報
+/// note | 備考
`responses` パラメータで明示的に別のメディアタイプを指定しない限り、FastAPI はレスポンスがメインのレスポンスクラスと同じメディアタイプ(デフォルトは `application/json`)であるとみなします。
diff --git a/docs/ja/docs/advanced/advanced-dependencies.md b/docs/ja/docs/advanced/advanced-dependencies.md
index 5181e39d8..13c796373 100644
--- a/docs/ja/docs/advanced/advanced-dependencies.md
+++ b/docs/ja/docs/advanced/advanced-dependencies.md
@@ -98,7 +98,7 @@ FastAPI 0.118.0 より前では、`yield` を使う依存関係を使用する
この挙動は 0.118.0 で元に戻され、`yield` の後の終了コードはレスポンス送信後に実行されるようになりました。
-/// info | 情報
+/// note | 備考
以下で見るように、これはバージョン 0.106.0 より前の挙動ととても似ていますが、いくつかのコーナーケースに対する改良とバグ修正が含まれています。
diff --git a/docs/ja/docs/advanced/custom-response.md b/docs/ja/docs/advanced/custom-response.md
index e66b1f494..34178a50e 100644
--- a/docs/ja/docs/advanced/custom-response.md
+++ b/docs/ja/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@ FastAPI はデフォルトでJSONレスポンスを返します。
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | 情報
+/// note | 備考
パラメータ `response_class` は、レスポンスの「メディアタイプ」を定義するためにも使用されます。
@@ -65,7 +65,7 @@ FastAPI はデフォルトでJSONレスポンスを返します。
///
-/// info | 情報
+/// note | 備考
もちろん、実際の `Content-Type` ヘッダーやステータスコードなどは、返した `Response` オブジェクトに由来します。
diff --git a/docs/ja/docs/advanced/dataclasses.md b/docs/ja/docs/advanced/dataclasses.md
index e3ad7afb6..42627c4ed 100644
--- a/docs/ja/docs/advanced/dataclasses.md
+++ b/docs/ja/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ FastAPI は **Pydantic** の上に構築されており、これまでにリク
これは Pydantic モデルの場合と同じように動作します。内部的にも同様に Pydantic を使って実現されています。
-/// info | 情報
+/// note | 備考
dataclasses は、Pydantic モデルができることをすべては行えない点に留意してください。
diff --git a/docs/ja/docs/advanced/events.md b/docs/ja/docs/advanced/events.md
index e2cbe2eb0..f7dcf3b58 100644
--- a/docs/ja/docs/advanced/events.md
+++ b/docs/ja/docs/advanced/events.md
@@ -120,7 +120,7 @@ async with lifespan(app):
ここでは、`shutdown` のイベントハンドラ関数が、テキスト行 `"Application shutdown"` をファイル `log.txt` に書き込みます。
-/// info | 情報
+/// note | 情報
`open()` 関数の `mode="a"` は「追加」(append)を意味します。つまり、そのファイルに既にある内容を上書きせず、行が後ろに追記されます。
@@ -152,7 +152,7 @@ async with lifespan(app):
内部的には、ASGI の技術仕様において、これは [Lifespan プロトコル](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) の一部であり、`startup` と `shutdown` というイベントが定義されています。
-/// info | 情報
+/// note | 情報
Starlette の `lifespan` ハンドラについては、[Starlette の Lifespan ドキュメント](https://www.starlette.dev/lifespan/)で詳しく読むことができます。
diff --git a/docs/ja/docs/advanced/generate-clients.md b/docs/ja/docs/advanced/generate-clients.md
index eee8575f6..42a60b787 100644
--- a/docs/ja/docs/advanced/generate-clients.md
+++ b/docs/ja/docs/advanced/generate-clients.md
@@ -31,7 +31,6 @@ FastAPI は自動的に **OpenAPI 3.1** の仕様を生成します。したが
例えば、次のようなものがあります:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
これらのソリューションの中にはオープンソースや無料枠を提供するものもあり、金銭的コミットメントなしで試すことができます。他の商用 SDK ジェネレータも存在し、オンラインで見つけられます。🤓
diff --git a/docs/ja/docs/advanced/openapi-callbacks.md b/docs/ja/docs/advanced/openapi-callbacks.md
index 31d17e270..5bc90c68e 100644
--- a/docs/ja/docs/advanced/openapi-callbacks.md
+++ b/docs/ja/docs/advanced/openapi-callbacks.md
@@ -167,13 +167,13 @@ JSON ボディは次のような内容です:
これで、上で作成したコールバック用ルーター内に、必要なコールバックの *path operation(s)*(*外部開発者* が *外部 API* に実装すべきもの)が用意できました。
-次に、*あなたの API の path operation デコレータ*の `callbacks` パラメータに、そのコールバック用ルーターの属性 `.routes`(実体はルート/*path operations* の `list`)を渡します:
+次に、*あなたの API の path operation デコレータ*の `callbacks` パラメータに、そのコールバック用ルーターの属性 `.routes` を渡します:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | 豆知識
-`callback=` に渡すのはルーター本体(`invoices_callback_router`)ではなく、属性 `.routes`(`invoices_callback_router.routes`)である点に注意してください。
+`callbacks=` に渡すのはルーター本体(`invoices_callback_router`)ではなく、属性 `.routes`(`invoices_callback_router.routes`)である点に注意してください。FastAPI はそれらのルートを使ってコールバックの OpenAPI ドキュメントを生成します。
///
diff --git a/docs/ja/docs/advanced/openapi-webhooks.md b/docs/ja/docs/advanced/openapi-webhooks.md
index 7f7a72680..f559de13b 100644
--- a/docs/ja/docs/advanced/openapi-webhooks.md
+++ b/docs/ja/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@ Webhook の URL を登録する方法や実際にリクエストを送るコー
これにより、ユーザーがあなたの **Webhook** リクエストを受け取るための**API を実装**するのが大幅に簡単になります。場合によっては、ユーザーが自分たちの API コードを自動生成できるかもしれません。
-/// info | 情報
+/// note | 備考
Webhook は OpenAPI 3.1.0 以上で利用可能で、FastAPI `0.99.0` 以上が対応しています。
@@ -36,7 +36,7 @@ Webhook は OpenAPI 3.1.0 以上で利用可能で、FastAPI `0.99.0` 以上が
定義した webhook は **OpenAPI** スキーマおよび自動生成される **ドキュメント UI** に反映されます。
-/// info | 情報
+/// note | 備考
`app.webhooks` オブジェクトは実際には単なる `APIRouter` で、複数ファイルでアプリを構成する際に使うものと同じ型です。
diff --git a/docs/ja/docs/advanced/path-operation-advanced-configuration.md b/docs/ja/docs/advanced/path-operation-advanced-configuration.md
index 65b56dba4..bc08092f8 100644
--- a/docs/ja/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/ja/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@ OpenAPIの「エキスパート」でなければ、これはおそらく必要
### *path operation関数* の名前をoperationIdとして使用する { #using-the-path-operation-function-name-as-the-operationid }
-APIの関数名を `operationId` として利用したい場合、すべてのAPI関数をイテレーションし、各 *path operation* の `operation_id` を `APIRoute.name` で上書きすれば可能です。
+API の関数名を `operationId` として使いたい場合は、`FastAPI` にカスタムの `generate_unique_id_function` を渡せます。
-すべての *path operation* を追加した後に行うべきです。
+この関数は各 `APIRoute` を受け取り、その *path operation* で使う `operationId` を返します。
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | 豆知識
-
-`app.openapi()` を手動で呼び出す場合、その前に `operationId` を更新するべきです。
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | 注意
diff --git a/docs/ja/docs/advanced/response-directly.md b/docs/ja/docs/advanced/response-directly.md
index b5c9fc5cb..366eed2b9 100644
--- a/docs/ja/docs/advanced/response-directly.md
+++ b/docs/ja/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@
実際は、`Response` やそのサブクラスを返すことができます。
-/// info
+/// note
`JSONResponse` それ自体は、`Response` のサブクラスです。
diff --git a/docs/ja/docs/advanced/security/oauth2-scopes.md b/docs/ja/docs/advanced/security/oauth2-scopes.md
index 3afc26e3a..cab7f8deb 100644
--- a/docs/ja/docs/advanced/security/oauth2-scopes.md
+++ b/docs/ja/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OpenAPI(例: API ドキュメント)では、「セキュリティスキー
- `instagram_basic` は Facebook / Instagram で使われています。
- `https://www.googleapis.com/auth/drive` は Google で使われています。
-/// info | 情報
+/// note | 備考
OAuth2 において「スコープ」は、必要な特定の権限を宣言する単なる文字列です。
@@ -126,7 +126,7 @@ OAuth2 にとっては、単に文字列に過ぎません。
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | 技術詳細
+/// note | 技術詳細
`Security` は実際には `Depends` のサブクラスで、後述する追加パラメータが 1 つあるだけです。
diff --git a/docs/ja/docs/advanced/stream-data.md b/docs/ja/docs/advanced/stream-data.md
index 52bbfd3fd..820f2d8b6 100644
--- a/docs/ja/docs/advanced/stream-data.md
+++ b/docs/ja/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@ JSON として構造化できるデータをストリームしたい場合は、
しかし、純粋なバイナリデータや文字列をストリームしたい場合は、次のようにできます。
-/// info | 情報
+/// note | 情報
FastAPI 0.134.0 で追加されました。
@@ -90,7 +90,7 @@ FastAPI は各データチャンクをそのまま `StreamingResponse` に渡し
また、多くの場合、ディスクやネットワークから読み出すため、読み取りはブロッキング(イベントループをブロックし得る)処理になります。
-/// info | 情報
+/// note | 情報
上記の例は例外で、`io.BytesIO` は既にメモリ上にあるため、読み取りが何かをブロックすることはありません。
diff --git a/docs/ja/docs/advanced/strict-content-type.md b/docs/ja/docs/advanced/strict-content-type.md
index 994cb8672..a21832fec 100644
--- a/docs/ja/docs/advanced/strict-content-type.md
+++ b/docs/ja/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
この設定では、`Content-Type` ヘッダーがないリクエストでもボディが JSON として解析されます。これは古いバージョンの FastAPI と同じ挙動です。
-/// info | 情報
+/// note | 備考
この挙動と設定は FastAPI 0.132.0 で追加されました。
diff --git a/docs/ja/docs/advanced/websockets.md b/docs/ja/docs/advanced/websockets.md
index 802110b58..b310adfe9 100644
--- a/docs/ja/docs/advanced/websockets.md
+++ b/docs/ja/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ WebSocketエンドポイントでは、`fastapi` から以下をインポート
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info | 情報
+/// note | 備考
これはWebSocketであるため、`HTTPException` を発生させることはあまり意味がありません。代わりに `WebSocketException` を発生させます。
diff --git a/docs/ja/docs/advanced/wsgi.md b/docs/ja/docs/advanced/wsgi.md
index 6895eb658..bab1ae3bf 100644
--- a/docs/ja/docs/advanced/wsgi.md
+++ b/docs/ja/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@
## `WSGIMiddleware` の使用 { #using-wsgimiddleware }
-/// info | 情報
+/// note | 備考
これには `a2wsgi` のインストールが必要です。例: `pip install a2wsgi`。
diff --git a/docs/ja/docs/deployment/docker.md b/docs/ja/docs/deployment/docker.md
index 6248e69b7..91ca7d8d8 100644
--- a/docs/ja/docs/deployment/docker.md
+++ b/docs/ja/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | 情報
+/// note | 備考
パッケージの依存関係を定義しインストールするためのフォーマットやツールは他にもあります。
@@ -417,7 +417,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
コンテナという観点から、[デプロイのコンセプト](concepts.md)に共通するいくつかについて、もう一度説明しましょう。
-コンテナは主に、アプリケーションの**ビルドとデプロイ**のプロセスを簡素化するためのツールですが、これらの**デプロイのコンセプト**を扱うための特定のアプローチを強制するものではなく、いくつかの戦略があります。
+コンテナは主に、アプリケーションの**ビルドとデプロイ**のプロセスを簡素化するための工具ですが、これらの**デプロイのコンセプト**を扱うための特定のアプローチを強制するものではなく、いくつかの戦略があります。
**良いニュース**は、それぞれの異なる戦略には、すべてのデプロイメントのコンセプトをカバーする方法があるということです。🎉
@@ -562,7 +562,7 @@ Docker Composeで**単一サーバ**(クラスタではない)にデプロ
複数の**コンテナ**があり、おそらくそれぞれが**単一のプロセス**を実行している場合(例えば、**Kubernetes**クラスタなど)、レプリケートされたワーカーコンテナを実行する**前に**、単一のコンテナで**事前のステップ**の作業を行う**別のコンテナ**を持ちたいと思うでしょう。
-/// info | 情報
+/// note | 備考
もしKubernetesを使用している場合, これはおそらく[Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)でしょう。
diff --git a/docs/ja/docs/deployment/fastapicloud.md b/docs/ja/docs/deployment/fastapicloud.md
index 3dd5685a2..d8c1cb2ec 100644
--- a/docs/ja/docs/deployment/fastapicloud.md
+++ b/docs/ja/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-[FastAPI Cloud](https://fastapicloud.com) に **コマンド1つ** でデプロイできます。まだならウェイティングリストにご登録ください。🚀
-
-## ログイン { #login }
-
-すでに **FastAPI Cloud** アカウントをお持ちであることを確認してください(ウェイティングリストからご招待しています 😉)。
-
-次にログインします:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## デプロイ { #deploy }
-
-では、**コマンド1つ** でアプリをデプロイします:
+[FastAPI Cloud](https://fastapicloud.com) に **コマンド1つ** で FastAPI アプリをデプロイできます。🚀
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
+CLI は FastAPI アプリケーションを自動検出してクラウドにデプロイします。ログインしていない場合は、認証を完了するためにブラウザが開きます。
+
以上です!その URL からアプリにアクセスできます。✨
## FastAPI Cloud について { #about-fastapi-cloud }
diff --git a/docs/ja/docs/deployment/manually.md b/docs/ja/docs/deployment/manually.md
index 1c0d59a71..1d2e79709 100644
--- a/docs/ja/docs/deployment/manually.md
+++ b/docs/ja/docs/deployment/manually.md
@@ -56,7 +56,6 @@ FastAPI は、Python の Web フレームワークとサーバーのための標
* [Hypercorn](https://hypercorn.readthedocs.io/): HTTP/2 や Trio に対応する ASGI サーバーなど。
* [Daphne](https://github.com/django/daphne): Django Channels のために作られた ASGI サーバー。
* [Granian](https://github.com/emmett-framework/granian): Python アプリケーション向けの Rust 製 HTTP サーバー。
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): 軽量で多用途な Web アプリケーションランタイム。
## サーバーマシンとサーバープログラム { #server-machine-and-server-program }
diff --git a/docs/ja/docs/deployment/server-workers.md b/docs/ja/docs/deployment/server-workers.md
index c4c6e9355..55cf2d247 100644
--- a/docs/ja/docs/deployment/server-workers.md
+++ b/docs/ja/docs/deployment/server-workers.md
@@ -17,7 +17,7 @@
ここでは、`fastapi` コマンド、または `uvicorn` コマンドを直接使って、**ワーカープロセス**付きの **Uvicorn** を使う方法を紹介します。
-/// info | 情報
+/// note
DockerやKubernetesなどのコンテナを使用している場合は、次の章で詳しく説明します: [コンテナ内のFastAPI - Docker](docker.md)。
diff --git a/docs/ja/docs/how-to/extending-openapi.md b/docs/ja/docs/how-to/extending-openapi.md
index e9ef9923f..9b2fabc60 100644
--- a/docs/ja/docs/how-to/extending-openapi.md
+++ b/docs/ja/docs/how-to/extending-openapi.md
@@ -25,9 +25,17 @@
- `openapi_version`: 使用する OpenAPI 仕様のバージョン。デフォルトは最新の `3.1.0`。
- `summary`: API の短い概要。
- `description`: API の説明。Markdown を含めることができ、ドキュメントに表示されます。
-- `routes`: ルートのリスト。登録済みの各 path operation です。`app.routes` から取得されます。
+- `routes`: アプリケーションのルート。`app.routes` から取得されます。FastAPI はこれらを使用して、登録済みの path operation(取り込んだルーター由来のものも含む)を収集します。
-/// info | 情報
+/// tip | 技術詳細
+
+`app.routes` はより低レベルなルートツリーです。最終的な `APIRoute` オブジェクトだけでなく、FastAPI が内部で使用する、取り込まれたルーター向けの候補ルートも含まれることがあります。
+
+それでも `app.routes` を `get_openapi()` に渡せます。FastAPI はそのルートツリーを走査して、有効な path operation を収集します。
+
+///
+
+/// note | 備考
パラメータ `summary` は OpenAPI 3.1.0 以降で利用可能で、FastAPI 0.99.0 以降が対応しています。
diff --git a/docs/ja/docs/how-to/separate-openapi-schemas.md b/docs/ja/docs/how-to/separate-openapi-schemas.md
index 46df2aafb..dbbb76300 100644
--- a/docs/ja/docs/how-to/separate-openapi-schemas.md
+++ b/docs/ja/docs/how-to/separate-openapi-schemas.md
@@ -41,7 +41,7 @@
ドキュメントから試してレスポンスを確認すると、コードでは一方の `description` フィールドに何も追加していないにもかかわらず、JSON レスポンスにはデフォルト値(`null`)が含まれています:
-

+
つまりそのフィールドには **常に値があります**。値が `None`(JSON では `null`)になることがあるだけです。
@@ -72,7 +72,7 @@
一方、`Item-Output` では、`description` は **必須**(赤いアスタリスクあり)です。
-

+
この **Pydantic v2** の機能により、API ドキュメントはより **正確** になり、自動生成されたクライアントや SDK もより正確になります。これにより、より良い **開発者エクスペリエンス** と一貫性が得られます。🎉
@@ -85,7 +85,7 @@
その場合は、**FastAPI** のパラメータ `separate_input_output_schemas=False` でこの機能を無効化できます。
-/// info | 情報
+/// note | 備考
`separate_input_output_schemas` のサポートは FastAPI `0.102.0` で追加されました。🤓
diff --git a/docs/ja/docs/index.md b/docs/ja/docs/index.md
index ac4d1242e..0c588e59c 100644
--- a/docs/ja/docs/index.md
+++ b/docs/ja/docs/index.md
@@ -492,9 +492,7 @@ item: Item
### アプリをデプロイ(任意) { #deploy-your-app-optional }
-必要に応じて FastAPI アプリを [FastAPI Cloud](https://fastapicloud.com) にデプロイできます。まだの場合はウェイティングリストに参加してください。 🚀
-
-すでに **FastAPI Cloud** アカウント(ウェイティングリストから招待されました 😉)がある場合は、1 コマンドでアプリケーションをデプロイできます。
+1 コマンドで FastAPI アプリを [FastAPI Cloud](https://fastapicloud.com) にデプロイできます。 🚀
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+CLI は自動的に FastAPI アプリケーションを検出し、クラウドへデプロイします。ログインしていない場合は、認証を完了するためにブラウザが開きます。
+
これで完了です!その URL でアプリにアクセスできます。 ✨
#### FastAPI Cloud について { #about-fastapi-cloud }
diff --git a/docs/ja/docs/tutorial/bigger-applications.md b/docs/ja/docs/tutorial/bigger-applications.md
index 3cd80d797..9d4239449 100644
--- a/docs/ja/docs/tutorial/bigger-applications.md
+++ b/docs/ja/docs/tutorial/bigger-applications.md
@@ -396,9 +396,9 @@ from .routers.users import router
/// note | 技術詳細
-実際には、`APIRouter` で宣言された各 *path operation* ごとに内部的に *path operation* が作成されます。
+FastAPI は、ルーターをメインアプリに取り込んだ後も、元の `APIRouter` とその `APIRoute` を有効なまま保持します。
-つまり裏側では、すべてが同じ単一のアプリであるかのように動作します。
+そのため、カスタムの `APIRouter` や `APIRoute` のサブクラスも、取り込み後に引き続き機能します。
///
@@ -406,7 +406,7 @@ from .routers.users import router
ルーターを取り込んでもパフォーマンスを心配する必要はありません。
-これは起動時にマイクロ秒で行われます。
+これは軽量に設計され、各リクエストにオーバーヘッドを追加しないようになっています。
したがってパフォーマンスには影響しません。⚡
@@ -461,7 +461,7 @@ from .routers.users import router
これは、それらの *path operations* を OpenAPI スキーマやユーザーインターフェースに含めたいからです。
-完全に分離して独立に「マウント」できないため、*path operations* は直接取り込まれるのではなく「クローン(再作成)」されます。
+FastAPI は元のルーターと *path operations* を有効なまま保持し、リクエスト処理や OpenAPI 生成の際に、ルーターの prefix、dependencies、tags、responses、その他のメタデータを組み合わせます。
///
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-`router` を `FastAPI` アプリに取り込む前にこれを実行して、`other_router` の *path operations* も含まれるようにしてください。
+これは、`router` を `FastAPI` アプリに取り込む前でも後でも実行できます。FastAPI は `other_router` の *path operations* をルーティングと OpenAPI に含めます。
+
+同様に、後からルーターに追加された *path operations* も、以前の取り込みを通して見えるようになります。
+
+/// warning | 注意
+
+`router` を取り込んだ後に、`router.routes` を直接ミューテートするのは避けてください。FastAPI はルーターの取り込みをライブとして扱うため、元のルーターとそのルートはルーティングと OpenAPI 生成の一部のままです。
+
+ルートやルーターを追加するには、path operation デコレータや `.include_router()` などのドキュメント化された API を使用してください。
+
+`router.routes` は、ルート定義や取り込まれたルーターを含みうる低レベルのルートツリーとして扱い、最終的な *path operations* のフラットな一覧として当てにしないでください。
+
+///
diff --git a/docs/ja/docs/tutorial/body-multiple-params.md b/docs/ja/docs/tutorial/body-multiple-params.md
index 0f81f4c46..1a150d192 100644
--- a/docs/ja/docs/tutorial/body-multiple-params.md
+++ b/docs/ja/docs/tutorial/body-multiple-params.md
@@ -110,7 +110,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | 情報
+/// note | 備考
`Body`もまた、後述する `Query` や `Path` などと同様に、すべての追加検証パラメータとメタデータパラメータを持っています。
@@ -125,7 +125,7 @@ Pydanticモデル`Item`の単一の`item`ボディパラメータしかないと
しかし、追加のボディパラメータを宣言したときのように、キー `item` を持つ JSON と、その中のモデル内容を期待したい場合は、特別な `Body` パラメータ `embed` を使うことができます:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
以下において:
diff --git a/docs/ja/docs/tutorial/body-nested-models.md b/docs/ja/docs/tutorial/body-nested-models.md
index 5187eb14e..a92df6b7a 100644
--- a/docs/ja/docs/tutorial/body-nested-models.md
+++ b/docs/ja/docs/tutorial/body-nested-models.md
@@ -135,8 +135,7 @@ Pydanticモデルを`list`や`set`などのサブタイプとして使用する
]
}
```
-
-/// info | 情報
+/// note | 備考
`images`キーが画像オブジェクトのリストを持つようになったことに注目してください。
@@ -148,7 +147,7 @@ Pydanticモデルを`list`や`set`などのサブタイプとして使用する
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | 情報
+/// note | 備考
`Offer`は`Item`のリストであり、それらがさらにオプションの`Image`のリストを持っていることに注目してください。
diff --git a/docs/ja/docs/tutorial/body.md b/docs/ja/docs/tutorial/body.md
index 9f100738c..78fcf5f0a 100644
--- a/docs/ja/docs/tutorial/body.md
+++ b/docs/ja/docs/tutorial/body.md
@@ -8,7 +8,7 @@ APIはほとんどの場合 **レスポンス** ボディを送信する必要
**リクエスト**ボディを宣言するには、[Pydantic](https://docs.pydantic.dev/) モデルを使用し、その強力な機能とメリットをすべて利用します。
-/// info | 情報
+/// note | 備考
データを送信するには、`POST`(より一般的)、`PUT`、`DELETE`、`PATCH` のいずれかを使用すべきです。
diff --git a/docs/ja/docs/tutorial/cookie-param-models.md b/docs/ja/docs/tutorial/cookie-param-models.md
index 89ae42438..a90ffdbb7 100644
--- a/docs/ja/docs/tutorial/cookie-param-models.md
+++ b/docs/ja/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@
-/// info | 情報
+/// note | 備考
**ブラウザがクッキーを処理し**ていますが、特別な方法で内部的に処理を行っているために、**JavaScript**からは簡単に操作**できない**ことに留意してください。
diff --git a/docs/ja/docs/tutorial/cookie-params.md b/docs/ja/docs/tutorial/cookie-params.md
index 1e5a0d3cf..894eb9edb 100644
--- a/docs/ja/docs/tutorial/cookie-params.md
+++ b/docs/ja/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@
///
-/// info | 情報
+/// note | 備考
クッキーを宣言するには、`Cookie`を使う必要があります。なぜなら、そうしないとパラメータがクエリのパラメータとして解釈されてしまうからです。
///
-/// info | 情報
+/// note | 備考
**ブラウザがクッキーを**特殊な方法で裏側で扱うため、**JavaScript** から簡単には触れられないことを念頭に置いてください。
diff --git a/docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index 573ccc1f9..56eefa3c8 100644
--- a/docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,11 +28,11 @@
///
-/// info | 情報
+/// note | 備考
この例では、架空のカスタムヘッダー `X-Key` と `X-Token` を使用しています。
-しかし実際のケースでセキュリティを実装する際は、統合された[Security utilities(次の章)](../security/index.md)を使うことで、より多くの利点を得られます。
+しかし実際のケースでセキュリティを実装する際は、統合された[セキュリティユーティリティ(次の章)](../security/index.md)を使うことで、より多くの利点を得られます。
///
@@ -62,7 +62,7 @@
## *path operation*のグループに対する依存関係 { #dependencies-for-a-group-of-path-operations }
-後で、より大きなアプリケーションを(おそらく複数ファイルで)構造化する方法([Bigger Applications - Multiple Files](../../tutorial/bigger-applications.md))について読むときに、*path operation*のグループに対して単一の`dependencies`パラメータを宣言する方法を学びます。
+後で、より大きなアプリケーションを(おそらく複数ファイルで)構造化する方法([より大きなアプリケーション - 複数ファイル](../../tutorial/bigger-applications.md))について読むときに、*path operation*のグループに対して単一の`dependencies`パラメータを宣言する方法を学びます。
## グローバル依存関係 { #global-dependencies }
diff --git a/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md
index 83e4f8809..2c310607c 100644
--- a/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info | 情報
+/// note | 備考
**1つのレスポンス** だけがクライアントに送信されます。それはエラーレスポンスの一つかもしれませんし、*path operation*からのレスポンスかもしれません。
diff --git a/docs/ja/docs/tutorial/dependencies/index.md b/docs/ja/docs/tutorial/dependencies/index.md
index a3cf3e26b..9b8b5ad57 100644
--- a/docs/ja/docs/tutorial/dependencies/index.md
+++ b/docs/ja/docs/tutorial/dependencies/index.md
@@ -51,7 +51,7 @@
そして、これらの値を含む`dict`を返します。
-/// info | 情報
+/// note | 備考
FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(そして推奨し始めました)。
@@ -106,7 +106,7 @@ common_parameters --> read_users
この方法では、共有されるコードを一度書き、**FastAPI** が*path operation*のための呼び出しを行います。
-/// check | 確認
+/// tip | 豆知識
特別なクラスを作成してどこかで **FastAPI** に渡して「登録」する必要はないことに注意してください。
diff --git a/docs/ja/docs/tutorial/dependencies/sub-dependencies.md b/docs/ja/docs/tutorial/dependencies/sub-dependencies.md
index fa27781f9..5d6533b11 100644
--- a/docs/ja/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/ja/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | 情報
+/// note | 備考
*path operation 関数*の中で宣言している依存関係は`query_or_cookie_extractor`の1つだけであることに注意してください。
diff --git a/docs/ja/docs/tutorial/first-steps.md b/docs/ja/docs/tutorial/first-steps.md
index 26cb49159..75d100871 100644
--- a/docs/ja/docs/tutorial/first-steps.md
+++ b/docs/ja/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ entrypoint = "backend.main:app"
from backend.main import app
```
-### パス付きの`fastapi dev` { #fastapi-dev-with-path }
+### パス指定の`fastapi dev`または`--entrypoint` CLIオプション { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
`fastapi dev`コマンドにファイルパスを渡すこともでき、使用すべきFastAPIのappオブジェクトを推測します:
@@ -188,29 +188,19 @@ from backend.main import app
$ fastapi dev main.py
```
-ただし、その場合は毎回`fastapi`コマンドを呼ぶたびに正しいパスを渡すことを覚えておく必要があります。
-
-さらに、他のツール(たとえば、[VS Code 拡張機能](../editor-support.md)や[FastAPI Cloud](https://fastapicloud.com))が見つけられない場合があります。そのため、`pyproject.toml`の`entrypoint`を使うことを推奨します。
-
-### アプリをデプロイ(任意) { #deploy-your-app-optional }
-
-任意でFastAPIアプリを[FastAPI Cloud](https://fastapicloud.com)にデプロイできます。まだなら、待機リストに登録してください。 🚀
-
-すでに**FastAPI Cloud**アカウントがある場合(待機リストから招待済みの場合😉)、1コマンドでアプリケーションをデプロイできます。
-
-デプロイする前に、ログインしていることを確認してください:
-
-
+または、`fastapi dev`コマンドに`--entrypoint`オプションを渡すこともできます:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+ただし、その場合は毎回`fastapi`コマンドを呼ぶたびに正しいパスや`entrypoint`を渡すことを覚えておく必要があります。
+
+さらに、他のツール(たとえば、[VS Code 拡張機能](../editor-support.md)や[FastAPI Cloud](https://fastapicloud.com))が見つけられない場合があります。そのため、`pyproject.toml`の`entrypoint`を使うことを推奨します。
-その後、アプリをデプロイします:
+### アプリをデプロイ(任意) { #deploy-your-app-optional }
+
+任意でFastAPIアプリを[FastAPI Cloud](https://fastapicloud.com)に1コマンドでデプロイできます。 🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+CLIはFastAPIアプリケーションを自動検出してクラウドにデプロイします。ログインしていない場合、認証を完了するためにブラウザが開きます。
+
以上です!これで、そのURLでアプリにアクセスできます。 ✨
## ステップ毎の要約 { #recap-step-by-step }
@@ -269,7 +261,7 @@ https://example.com/items/foo
/items/foo
```
-/// info | 情報
+/// note | 備考
「パス」は一般に「エンドポイント」または「ルート」とも呼ばれます。
@@ -321,7 +313,7 @@ APIを構築するときは、通常、これらの特定のHTTPメソッドを
* パス `/`
* get オペレーション
-/// info | `@decorator` 情報
+/// note | `@decorator` 情報
Pythonにおける`@something`シンタックスはデコレータと呼ばれます。
diff --git a/docs/ja/docs/tutorial/metadata.md b/docs/ja/docs/tutorial/metadata.md
index 6802e6c9a..6a426d530 100644
--- a/docs/ja/docs/tutorial/metadata.md
+++ b/docs/ja/docs/tutorial/metadata.md
@@ -74,7 +74,7 @@ OpenAPI 3.1.0 および FastAPI 0.99.0 以降では、`license_info` を `url`
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | 情報
+/// note | 備考
タグの詳細は [Path Operation の設定](path-operation-configuration.md#tags) を参照してください。
diff --git a/docs/ja/docs/tutorial/path-operation-configuration.md b/docs/ja/docs/tutorial/path-operation-configuration.md
index 25a2783ea..a5f34128a 100644
--- a/docs/ja/docs/tutorial/path-operation-configuration.md
+++ b/docs/ja/docs/tutorial/path-operation-configuration.md
@@ -72,13 +72,13 @@ docstringに[Markdown](https://en.wikipedia.org/wiki/Markdown)を記述すれば
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | 情報
+/// note | 備考
`response_description`は具体的にレスポンスを参照し、`description`は*path operation*全般を参照していることに注意してください。
///
-/// check | 確認
+/// tip | 豆知識
OpenAPIは*path operation*ごとにレスポンスの説明を必要としています。
diff --git a/docs/ja/docs/tutorial/path-params-numeric-validations.md b/docs/ja/docs/tutorial/path-params-numeric-validations.md
index 55930eece..1e36e7dd1 100644
--- a/docs/ja/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/ja/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | 情報
+/// note | 備考
FastAPI はバージョン 0.95.0 で`Annotated`のサポートを追加し(そして推奨し始めました)。
@@ -131,7 +131,7 @@ Pythonはその`*`で何かをすることはありませんが、それ以降
* `lt`: `l`ess `t`han
* `le`: `l`ess than or `e`qual
-/// info | 情報
+/// note | 備考
`Query`、`Path`、および後で見る他のクラスは、共通の`Param`クラスのサブクラスです。
diff --git a/docs/ja/docs/tutorial/path-params.md b/docs/ja/docs/tutorial/path-params.md
index 8556b1c37..ec47cbe7a 100644
--- a/docs/ja/docs/tutorial/path-params.md
+++ b/docs/ja/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@ Pythonのformat文字列と同様のシンタックスで「パスパラメー
ここでは、 `item_id` は `int` として宣言されています。
-/// check | 確認
+/// tip | 豆知識
これにより、関数内でのエディターサポート (エラーチェックや補完など) が提供されます。
@@ -34,7 +34,7 @@ Pythonのformat文字列と同様のシンタックスで「パスパラメー
{"item_id":3}
```
-/// check | 確認
+/// tip | 豆知識
関数が受け取った(および返した)値は、文字列の `"3"` ではなく、Pythonの `int` としての `3` であることに注意してください。
@@ -66,7 +66,7 @@ Pythonのformat文字列と同様のシンタックスで「パスパラメー
[http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) で見られるように、`int` のかわりに `float` が与えられた場合にも同様なエラーが表示されます。
-/// check | 確認
+/// tip | 豆知識
したがって、同じPythonの型宣言を使用することで、**FastAPI**はデータのバリデーションを行います。
@@ -82,7 +82,7 @@ Pythonのformat文字列と同様のシンタックスで「パスパラメー
-/// check | 確認
+/// tip | 豆知識
繰り返しになりますが、同じPython型宣言を使用するだけで、**FastAPI**は対話的なドキュメントを自動的に生成します(Swagger UIを統合)。
diff --git a/docs/ja/docs/tutorial/query-params-str-validations.md b/docs/ja/docs/tutorial/query-params-str-validations.md
index d34059801..a113cb4a7 100644
--- a/docs/ja/docs/tutorial/query-params-str-validations.md
+++ b/docs/ja/docs/tutorial/query-params-str-validations.md
@@ -24,12 +24,12 @@ FastAPIは、 `q` はデフォルト値が `= None` であるため、必須で
そのために、まずは以下をインポートします:
-* `fastapi` から `Query`
-* `typing` から `Annotated`
+- `fastapi` から `Query`
+- `typing` から `Annotated`
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | 情報
+/// note | 備考
FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(推奨し始め)ました。
@@ -79,9 +79,9 @@ q: Annotated[str | None] = None
FastAPI は次を行います:
-* 最大長が 50 文字であることを確かめるようデータを **検証** する
-* データが有効でないときに、クライアントに **明確なエラー** を表示する
-* OpenAPI スキーマの *path operation* にパラメータを **ドキュメント化** する(その結果、**自動ドキュメント UI** に表示されます)
+- 最大長が 50 文字であることを確かめるようデータを **検証** する
+- データが有効でないときに、クライアントに **明確なエラー** を表示する
+- OpenAPI スキーマの *path operation* にパラメータを **ドキュメント化** する(その結果、**自動ドキュメント UI** に表示されます)
## 代替(古い方法): デフォルト値としての `Query` { #alternative-old-query-as-the-default-value }
@@ -174,9 +174,9 @@ FastAPI なしで同じ関数を **別の場所** から **呼び出しても**
この特定の正規表現パターンは受け取ったパラメータの値をチェックします:
-* `^`: は、これ以降の文字で始まり、これより以前には文字はありません。
-* `fixedquery`: は、正確な`fixedquery`を持っています.
-* `$`: で終わる場合、`fixedquery`以降には文字はありません.
+- `^`: は、これ以降の文字で始まり、これより以前には文字はありません。
+- `fixedquery`: は、正確な`fixedquery`を持っています.
+- `$`: で終わる場合、`fixedquery`以降には文字はありません.
もしこれらすべての **「正規表現」** のアイデアについて迷っていても、心配しないでください。多くの人にとって難しい話題です。正規表現を必要としなくても、まだ、多くのことができます。
@@ -382,7 +382,7 @@ Pydantic には [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | 情報
+/// note | 備考
これは Pydantic バージョン 2 以上で利用できます。 😎
@@ -432,16 +432,16 @@ Pydantic には [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
一般的なバリデーションとメタデータ:
-* `alias`
-* `title`
-* `description`
-* `deprecated`
+- `alias`
+- `title`
+- `description`
+- `deprecated`
文字列に固有のバリデーション:
-* `min_length`
-* `max_length`
-* `pattern`
+- `min_length`
+- `max_length`
+- `pattern`
`AfterValidator` を使ったカスタムバリデーション。
diff --git a/docs/ja/docs/tutorial/query-params.md b/docs/ja/docs/tutorial/query-params.md
index 51e4eb944..24320cc77 100644
--- a/docs/ja/docs/tutorial/query-params.md
+++ b/docs/ja/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ http://127.0.0.1:8000/items/?skip=20
この場合、関数パラメータ `q` はオプショナルとなり、デフォルトでは `None` になります。
-/// check | 確認
+/// tip | 豆知識
パスパラメータ `item_id` はパスパラメータであり、`q` はそれとは違ってクエリパラメータであると判別できるほど**FastAPI** が賢いということにも注意してください。
diff --git a/docs/ja/docs/tutorial/request-files.md b/docs/ja/docs/tutorial/request-files.md
index 30a494afb..82bafb776 100644
--- a/docs/ja/docs/tutorial/request-files.md
+++ b/docs/ja/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
`File` を使って、クライアントがアップロードするファイルを定義できます。
-/// info | 情報
+/// note | 備考
アップロードされたファイルを受け取るには、まず [`python-multipart`](https://github.com/Kludex/python-multipart) をインストールします。
@@ -28,7 +28,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | 情報
+/// note | 備考
`File` は `Form` を直接継承したクラスです。
diff --git a/docs/ja/docs/tutorial/request-form-models.md b/docs/ja/docs/tutorial/request-form-models.md
index 62aa9e298..6a71c149d 100644
--- a/docs/ja/docs/tutorial/request-form-models.md
+++ b/docs/ja/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
FastAPI では、フォームフィールドを宣言するために **Pydantic モデル**を使用できます。
-/// info | 情報
+/// note | 備考
フォームを使うには、まず [`python-multipart`](https://github.com/Kludex/python-multipart) をインストールします。
diff --git a/docs/ja/docs/tutorial/request-forms-and-files.md b/docs/ja/docs/tutorial/request-forms-and-files.md
index 651f07ff0..4865f29ae 100644
--- a/docs/ja/docs/tutorial/request-forms-and-files.md
+++ b/docs/ja/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
`File`と`Form`を同時に使うことでファイルとフォームフィールドを定義することができます。
-/// info | 情報
+/// note | 備考
アップロードされたファイルやフォームデータを受信するには、まず[`python-multipart`](https://github.com/Kludex/python-multipart)をインストールします。
diff --git a/docs/ja/docs/tutorial/request-forms.md b/docs/ja/docs/tutorial/request-forms.md
index c6b2a921a..022f13208 100644
--- a/docs/ja/docs/tutorial/request-forms.md
+++ b/docs/ja/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
JSONの代わりにフィールドを受け取る場合は、`Form`を使用します。
-/// info | 情報
+/// note | 備考
フォームを使うためには、まず[`python-multipart`](https://github.com/Kludex/python-multipart)をインストールします。
@@ -32,7 +32,7 @@ $ pip install python-multipart
`Form`では`Body`(および`Query`や`Path`、`Cookie`)と同じ設定を宣言することができます。これには、バリデーション、例、エイリアス(例えば`username`の代わりに`user-name`)などが含まれます。
-/// info | 情報
+/// note | 備考
`Form`は`Body`を直接継承するクラスです。
@@ -56,7 +56,7 @@ HTMLフォーム(``)がサーバにデータを送信する方
しかし、フォームがファイルを含む場合は、`multipart/form-data`としてエンコードされます。ファイルの扱いについては次の章で説明します。
-これらのエンコーディングやフォームフィールドの詳細については、[MDN の `POST` ウェブドキュメント](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)を参照してください。
+これらのエンコーディングやフォームフィールドの詳細については、[MDN の `POST` のウェブドキュメント](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)を参照してください。
///
diff --git a/docs/ja/docs/tutorial/response-model.md b/docs/ja/docs/tutorial/response-model.md
index b4024e0a0..4b38e6de9 100644
--- a/docs/ja/docs/tutorial/response-model.md
+++ b/docs/ja/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPIはこの `response_model` を使って、データのドキュメント
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | 情報
+/// note | 備考
`EmailStr` を使用するには、最初に [`email-validator`](https://github.com/JoshData/python-email-validator) をインストールしてください。
@@ -251,7 +251,7 @@ Pydanticフィールドとして有効ではないものを返し、ツール(
}
```
-/// info | 情報
+/// note | 備考
以下も使用できます:
diff --git a/docs/ja/docs/tutorial/response-status-code.md b/docs/ja/docs/tutorial/response-status-code.md
index 9237ac784..a04add113 100644
--- a/docs/ja/docs/tutorial/response-status-code.md
+++ b/docs/ja/docs/tutorial/response-status-code.md
@@ -18,7 +18,7 @@
`status_code`パラメータはHTTPステータスコードを含む数値を受け取ります。
-/// info | 情報
+/// note | 備考
`status_code`は代わりに、Pythonの[`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)のように、`IntEnum`を受け取ることもできます。
diff --git a/docs/ja/docs/tutorial/schema-extra-example.md b/docs/ja/docs/tutorial/schema-extra-example.md
index 87ee85f40..742106037 100644
--- a/docs/ja/docs/tutorial/schema-extra-example.md
+++ b/docs/ja/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@
///
-/// info | 情報
+/// note | 備考
OpenAPI 3.1.0(FastAPI 0.99.0以降で使用)では、**JSON Schema**標準の一部である`examples`がサポートされました。
@@ -155,7 +155,7 @@ OpenAPIは、仕様の他の部分にも`example`と`examples`フィールドを
* `File()`
* `Form()`
-/// info | 情報
+/// note | 備考
この古いOpenAPI固有の`examples`パラメータは、FastAPI `0.103.0`以降は`openapi_examples`になりました。
@@ -171,7 +171,7 @@ OpenAPIは、仕様の他の部分にも`example`と`examples`フィールドを
JSON Schemaのこの新しい`examples`フィールドは、OpenAPIの他の場所(上で説明)にあるような追加メタデータを持つdictではなく、**単なる例の`list`**です。
-/// info | 情報
+/// note | 備考
OpenAPI 3.1.0がこのJSON Schemaとの新しいよりシンプルな統合とともにリリースされた後も、しばらくの間、自動ドキュメントを提供するツールであるSwagger UIはOpenAPI 3.1.0をサポートしていませんでした(バージョン5.0.0からサポートされています🎉)。
diff --git a/docs/ja/docs/tutorial/security/first-steps.md b/docs/ja/docs/tutorial/security/first-steps.md
index e678ebce1..386adbed8 100644
--- a/docs/ja/docs/tutorial/security/first-steps.md
+++ b/docs/ja/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@
## 実行 { #run-it }
-/// info | 情報
+/// note | 備考
[`python-multipart`](https://github.com/Kludex/python-multipart) パッケージは、`pip install "fastapi[standard]"` コマンドを実行すると **FastAPI** と一緒に自動的にインストールされます。
@@ -60,7 +60,7 @@ $ fastapi dev
-/// check | Authorizeボタン!
+/// tip | Authorizeボタン!
すでにピカピカの新しい「Authorize」ボタンがあります。
@@ -118,7 +118,7 @@ OAuth2は、バックエンドやAPIがユーザーを認証するサーバー
この例では、**Bearer**トークンを使用して**OAuth2**を**Password**フローで使用します。これには`OAuth2PasswordBearer`クラスを使用します。
-/// info | 情報
+/// note | 備考
「bearer」トークンが、唯一の選択肢ではありません。
@@ -148,7 +148,7 @@ OAuth2は、バックエンドやAPIがユーザーを認証するサーバー
実際の path operation もすぐに作ります。
-/// info | 情報
+/// note | 備考
非常に厳格な「Pythonista」であれば、パラメーター名のスタイルが`tokenUrl`ではなく`token_url`であることを気に入らないかもしれません。
@@ -176,7 +176,7 @@ oauth2_scheme(some, parameters)
**FastAPI**は、この依存関係を使用してOpenAPIスキーマ (および自動APIドキュメント) で「セキュリティスキーム」を定義できることを知っています。
-/// info | 技術詳細
+/// note | 技術詳細
**FastAPI**は、`OAuth2PasswordBearer` クラス (依存関係で宣言されている) を使用してOpenAPIのセキュリティスキームを定義できることを知っています。これは`fastapi.security.oauth2.OAuth2`、`fastapi.security.base.SecurityBase`を継承しているからです。
diff --git a/docs/ja/docs/tutorial/security/get-current-user.md b/docs/ja/docs/tutorial/security/get-current-user.md
index 60378fd98..1e77c9f65 100644
--- a/docs/ja/docs/tutorial/security/get-current-user.md
+++ b/docs/ja/docs/tutorial/security/get-current-user.md
@@ -52,7 +52,7 @@ Pydanticモデルの `User` として、 `current_user` の型を宣言するこ
///
-/// check | 確認
+/// tip | 豆知識
依存関係システムがこのように設計されているおかげで、 `User` モデルを返却する別の依存関係(別の「dependables」)を持つことができます。
diff --git a/docs/ja/docs/tutorial/security/oauth2-jwt.md b/docs/ja/docs/tutorial/security/oauth2-jwt.md
index 9c527121e..7e41326e3 100644
--- a/docs/ja/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/ja/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | 情報
+/// note | 備考
RSAやECDSAのようなデジタル署名アルゴリズムを使用する予定がある場合は、cryptographyライブラリの依存関係`pyjwt[crypto]`をインストールしてください。
@@ -213,7 +213,7 @@ IDの衝突を回避するために、ユーザーのJWTトークンを作成す
Username: `johndoe`
Password: `secret`
-/// check | 確認
+/// tip | 豆知識
コードのどこにも平文のパスワード"`secret`"はなく、ハッシュ化されたものしかないことを確認してください。
diff --git a/docs/ja/docs/tutorial/security/simple-oauth2.md b/docs/ja/docs/tutorial/security/simple-oauth2.md
index 842cd02e5..9e9487d86 100644
--- a/docs/ja/docs/tutorial/security/simple-oauth2.md
+++ b/docs/ja/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ OAuth2 では、「password flow」(ここで使用するフロー)を使う
- `instagram_basic` は Facebook / Instagram で使われます。
- `https://www.googleapis.com/auth/drive` は Google で使われます。
-/// info | 情報
+/// note | 備考
OAuth2 における「スコープ」は、要求される特定の権限を表す単なる文字列です。
@@ -72,7 +72,7 @@ OAuth2 の仕様では、固定値 `password` を持つフィールド `grant_ty
- オプションの `client_id`(この例では不要)
- オプションの `client_secret`(この例では不要)
-/// info | 情報
+/// note | 備考
`OAuth2PasswordRequestForm` は、`OAuth2PasswordBearer` のように **FastAPI** にとって特別なクラスではありません。
@@ -144,7 +144,7 @@ UserInDB(
)
```
-/// info | 情報
+/// note | 備考
`**user_dict` のより完全な解説は、[**追加モデル**のドキュメント](../extra-models.md#about-user-in-dict)を参照してください。
@@ -196,7 +196,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | 情報
+/// note | 備考
ここで返している値が `Bearer` の追加ヘッダー `WWW-Authenticate` も仕様の一部です。
diff --git a/docs/ja/docs/tutorial/server-sent-events.md b/docs/ja/docs/tutorial/server-sent-events.md
index d8168cef3..1019f806e 100644
--- a/docs/ja/docs/tutorial/server-sent-events.md
+++ b/docs/ja/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@
これは[JSON Lines のストリーミング](stream-json-lines.md)に似ていますが、`text/event-stream` フォーマットを使用します。これはブラウザがネイティブに [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) でサポートしています。
-/// info | 情報
+/// note
FastAPI 0.135.0 で追加されました。
@@ -27,7 +27,7 @@ data: {"name": "Plumbus", "price": 32.99}
SSE は、AI チャットのストリーミング、ライブ通知、ログやオブザビリティなど、サーバーがクライアントへ更新をプッシュする用途で一般的に使われます。
-/// tip | 豆知識
+/// tip
バイナリデータ(例: 動画や音声)をストリーミングしたい場合は、上級ガイド [データのストリーミング](../advanced/stream-data.md) を参照してください。
@@ -47,7 +47,7 @@ yield された各アイテムは JSON にエンコードされ、SSE イベン
{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *}
-/// tip | 豆知識
+/// tip
Pydantic が**Rust** 側でシリアライズを行うため、戻り値の型を宣言しない場合に比べて大幅に**高性能**になります。
@@ -81,13 +81,13 @@ Pydantic が**Rust** 側でシリアライズを行うため、戻り値の型
## 生データ { #raw-data }
-JSON エンコードせずにデータを送る必要がある場合は、`data` の代わりに `raw_data` を使用します。
+JSON エンコードせずにデータを送る必要がある場合は、`raw_data` を使用します。
-これは、整形済みテキスト、ログ行、または `[DONE]` のような特別な "センチネル" 値を送るのに有用です。
+これは、整形済みテキスト、ログ行、または 「センチネル」 といった特別な値(例: `[DONE]`)を送るのに有用です。
{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *}
-/// note | 備考
+/// note
`data` と `raw_data` は相互排他的です。各 `ServerSentEvent` ではどちらか一方しか設定できません。
diff --git a/docs/ja/docs/tutorial/stream-json-lines.md b/docs/ja/docs/tutorial/stream-json-lines.md
index a247234e2..1f7af2f68 100644
--- a/docs/ja/docs/tutorial/stream-json-lines.md
+++ b/docs/ja/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
データのシーケンスを**「ストリーム」**で送りたい場合、**JSON Lines** を使って実現できます。
-/// info | 情報
+/// note | 備考
FastAPI 0.134.0 で追加されました。
@@ -48,7 +48,7 @@ sequenceDiagram
これは JSON 配列(Python の list に相当)にとてもよく似ていますが、`[]` で囲まず、アイテム間の `,` もありません。その代わりに、**1 行に 1 つの JSON オブジェクト**で、改行文字で区切られます。
-/// info | 情報
+/// note | 備考
重要な点は、クライアントが前の行を消費している間に、アプリ側は次の行を順次生成して送れることです。
diff --git a/docs/ja/docs/tutorial/testing.md b/docs/ja/docs/tutorial/testing.md
index 0277d73b7..57dcd86c9 100644
--- a/docs/ja/docs/tutorial/testing.md
+++ b/docs/ja/docs/tutorial/testing.md
@@ -8,7 +8,7 @@
## `TestClient` を使用 { #using-testclient }
-/// info
+/// note | 備考
`TestClient` を使用するには、まず [`httpx`](https://www.python-httpx.org) をインストールします。
@@ -32,7 +32,7 @@ $ pip install httpx
{* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *}
-/// tip
+/// tip | 豆知識
テスト関数は `async def` ではなく、通常の `def` であることに注意してください。
@@ -50,7 +50,7 @@ $ pip install httpx
///
-/// tip
+/// tip | 豆知識
FastAPIアプリケーションへのリクエストの送信とは別に、テストで `async` 関数 (非同期データベース関数など) を呼び出したい場合は、高度なチュートリアルの[Async Tests](../advanced/async-tests.md) を参照してください。
@@ -144,7 +144,7 @@ FastAPIアプリケーションへのリクエストの送信とは別に、テ
(`httpx` または `TestClient` を使用して) バックエンドにデータを渡す方法の詳細は、[HTTPXのドキュメント](https://www.python-httpx.org)を確認してください。
-/// info
+/// note | 備考
`TestClient` は、Pydanticモデルではなく、JSONに変換できるデータを受け取ることに注意してください。
diff --git a/docs/ko/docs/advanced/additional-responses.md b/docs/ko/docs/advanced/additional-responses.md
index e43d7c727..87866946b 100644
--- a/docs/ko/docs/advanced/additional-responses.md
+++ b/docs/ko/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@
///
-/// info | 정보
+/// note | 참고
`model` 키는 OpenAPI의 일부가 아닙니다.
@@ -183,7 +183,7 @@
///
-/// info | 정보
+/// note | 참고
`responses` 파라미터에서 다른 미디어 타입을 명시적으로 지정하지 않는 한, FastAPI는 응답이 주요 응답 클래스와 동일한 미디어 타입(기본값 `application/json`)을 가진다고 가정합니다.
diff --git a/docs/ko/docs/advanced/advanced-dependencies.md b/docs/ko/docs/advanced/advanced-dependencies.md
index 2755986a2..3a35bbfc7 100644
--- a/docs/ko/docs/advanced/advanced-dependencies.md
+++ b/docs/ko/docs/advanced/advanced-dependencies.md
@@ -99,7 +99,7 @@ FastAPI 0.118.0 이전에는 `yield`가 있는 의존성을 사용하면, *경
이 동작은 0.118.0에서 되돌려져, `yield` 이후의 종료 코드가 응답이 전송된 뒤 실행되도록 변경되었습니다.
-/// info | 정보
+/// note | 참고
아래에서 보시겠지만, 이는 0.106.0 버전 이전의 동작과 매우 비슷하지만, 여러 개선 사항과 코너 케이스에 대한 버그 수정이 포함되어 있습니다.
diff --git a/docs/ko/docs/advanced/custom-response.md b/docs/ko/docs/advanced/custom-response.md
index e85ec3c74..c8c703ac2 100644
--- a/docs/ko/docs/advanced/custom-response.md
+++ b/docs/ko/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | 정보
+/// note | 참고
`response_class` 매개변수는 응답의 "미디어 타입"을 정의하는 데에도 사용됩니다.
@@ -65,7 +65,7 @@
///
-/// info | 정보
+/// note | 참고
물론 실제 `Content-Type` 헤더, 상태 코드 등은 반환된 `Response` 객체에서 가져옵니다.
@@ -173,7 +173,7 @@ HTTP 리디렉션 응답을 반환합니다. 기본적으로 상태 코드는 30
### `StreamingResponse` { #streamingresponse }
-비동기 제너레이터 또는 일반 제너레이터/이터레이터(`yield`가 있는 함수)를 받아 응답 본문을 스트리밍합니다.
+비동기 제너레이터 또는 일반 제너레이터/이터레이터(`yield`가 있는 함수`)를 받아 응답 본문을 스트리밍합니다.
{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *}
diff --git a/docs/ko/docs/advanced/dataclasses.md b/docs/ko/docs/advanced/dataclasses.md
index 77e8d0464..fb5d9fbd9 100644
--- a/docs/ko/docs/advanced/dataclasses.md
+++ b/docs/ko/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ FastAPI는 **Pydantic** 위에 구축되어 있으며, 지금까지는 Pydantic
이는 Pydantic 모델을 사용할 때와 같은 방식으로 동작합니다. 그리고 실제로도 내부적으로는 Pydantic을 사용해 같은 방식으로 구현됩니다.
-/// info
+/// note
dataclasses는 Pydantic 모델이 할 수 있는 모든 것을 할 수는 없다는 점을 기억하세요.
diff --git a/docs/ko/docs/advanced/events.md b/docs/ko/docs/advanced/events.md
index 708ad443f..24ce55b4c 100644
--- a/docs/ko/docs/advanced/events.md
+++ b/docs/ko/docs/advanced/events.md
@@ -120,7 +120,7 @@ async with lifespan(app):
여기서 `shutdown` 이벤트 핸들러 함수는 텍스트 한 줄 `"Application shutdown"`을 `log.txt` 파일에 기록합니다.
-/// info | 정보
+/// note | 참고
`open()` 함수에서 `mode="a"`는 "append"(추가)를 의미하므로, 기존 내용을 덮어쓰지 않고 파일에 있던 내용 뒤에 줄이 추가됩니다.
@@ -150,9 +150,9 @@ async with lifespan(app):
호기심 많은 분들을 위한 기술적인 세부사항입니다. 🤓
-내부적으로 ASGI 기술 사양에서는 이것이 [Lifespan Protocol](https://asgi.readthedocs.io/en/latest/specs/lifespan.html)의 일부이며, `startup`과 `shutdown`이라는 이벤트를 정의합니다.
+내부적으로 ASGI 기술 사양에서는 이것이 [Lifespan 프로토콜](https://asgi.readthedocs.io/en/latest/specs/lifespan.html)의 일부이며, `startup`과 `shutdown`이라는 이벤트를 정의합니다.
-/// info | 정보
+/// note | 참고
Starlette `lifespan` 핸들러에 대해서는 [Starlette의 Lifespan 문서](https://www.starlette.dev/lifespan/)에서 더 읽어볼 수 있습니다.
diff --git a/docs/ko/docs/advanced/generate-clients.md b/docs/ko/docs/advanced/generate-clients.md
index 1c2e32377..f85db8cb9 100644
--- a/docs/ko/docs/advanced/generate-clients.md
+++ b/docs/ko/docs/advanced/generate-clients.md
@@ -2,7 +2,7 @@
**FastAPI**는 **OpenAPI** 사양을 기반으로 하므로, FastAPI의 API는 많은 도구가 이해할 수 있는 표준 형식으로 설명할 수 있습니다.
-덕분에 여러 언어용 클라이언트 라이브러리(**SDKs**), 최신 **문서**, 그리고 코드와 동기화된 **테스트** 또는 **자동화 워크플로**를 쉽게 생성할 수 있습니다.
+덕분에 최신 **문서**, 여러 언어용 클라이언트 라이브러리(**SDKs**), 그리고 코드와 동기화된 **테스트** 또는 **자동화 워크플로**를 쉽게 생성할 수 있습니다.
이 가이드에서는 FastAPI 백엔드용 **TypeScript SDK**를 생성하는 방법을 배웁니다.
@@ -31,7 +31,6 @@ FastAPI는 **OpenAPI 3.1** 사양을 자동으로 생성하므로, 사용하는
예를 들어 다음을 사용해 볼 수 있습니다:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
이 중 일부는 오픈 소스이거나 무료 티어를 제공하므로, 비용 부담 없이 사용해 볼 수 있습니다. 다른 상용 SDK 생성기도 있으며 온라인에서 찾을 수 있습니다. 🤓
diff --git a/docs/ko/docs/advanced/openapi-callbacks.md b/docs/ko/docs/advanced/openapi-callbacks.md
index fa71acdcf..f9769209a 100644
--- a/docs/ko/docs/advanced/openapi-callbacks.md
+++ b/docs/ko/docs/advanced/openapi-callbacks.md
@@ -167,13 +167,13 @@ https://www.external.org/events/invoices/2expen51ve
이 시점에서, 위에서 만든 콜백 라우터 안에 *콜백 경로 처리(들)*(즉 *external developer*가 *external API*에 구현해야 하는 것들)을 준비했습니다.
-이제 *여러분의 API 경로 처리 데코레이터*에서 `callbacks` 파라미터를 사용해, 그 콜백 라우터의 `.routes` 속성(실제로는 routes/*경로 처리*의 `list`)을 전달합니다:
+이제 *여러분의 API 경로 처리 데코레이터*에서 `callbacks` 파라미터를 사용해, 그 콜백 라우터의 `.routes` 속성을 전달합니다:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | 팁
-`callback=`에 라우터 자체(`invoices_callback_router`)를 넘기는 것이 아니라, `invoices_callback_router.routes`처럼 `.routes` 속성을 넘긴다는 점에 주목하세요.
+`callbacks=`에 라우터 자체(`invoices_callback_router`)를 넘기는 것이 아니라, `invoices_callback_router.routes`처럼 `.routes` 속성을 넘긴다는 점에 주목하세요. FastAPI는 이 라우트들을 사용하여 콜백 OpenAPI 문서를 생성합니다.
///
diff --git a/docs/ko/docs/advanced/openapi-webhooks.md b/docs/ko/docs/advanced/openapi-webhooks.md
index e40a7bb18..bb3f7895c 100644
--- a/docs/ko/docs/advanced/openapi-webhooks.md
+++ b/docs/ko/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@ webhook의 URL을 등록하는 방법과 실제로 그 요청을 보내는 코
이렇게 하면 사용자가 여러분의 **webhook** 요청을 받기 위해 **자신들의 API를 구현**하기가 훨씬 쉬워지고, 경우에 따라서는 자신의 API 코드 일부를 자동 생성할 수도 있습니다.
-/// info | 정보
+/// note | 참고
Webhooks는 OpenAPI 3.1.0 이상에서 사용할 수 있으며, FastAPI `0.99.0` 이상에서 지원됩니다.
@@ -36,7 +36,7 @@ Webhooks는 OpenAPI 3.1.0 이상에서 사용할 수 있으며, FastAPI `0.99.0`
여러분이 정의한 webhook은 **OpenAPI** 스키마와 자동 **docs UI**에 포함됩니다.
-/// info | 정보
+/// note | 참고
`app.webhooks` 객체는 실제로 `APIRouter`일 뿐이며, 여러 파일로 앱을 구조화할 때 사용하는 것과 동일한 타입입니다.
diff --git a/docs/ko/docs/advanced/path-operation-advanced-configuration.md b/docs/ko/docs/advanced/path-operation-advanced-configuration.md
index 253a6f302..398816005 100644
--- a/docs/ko/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/ko/docs/advanced/path-operation-advanced-configuration.md
@@ -2,7 +2,7 @@
## OpenAPI operationId { #openapi-operationid }
-/// warning | 경고
+/// warning
OpenAPI “전문가”가 아니라면, 아마 이 내용은 필요하지 않을 것입니다.
@@ -16,19 +16,13 @@ OpenAPI “전문가”가 아니라면, 아마 이 내용은 필요하지 않
### *경로 처리 함수* 이름을 operationId로 사용하기 { #using-the-path-operation-function-name-as-the-operationid }
-API의 함수 이름을 `operationId`로 사용하고 싶다면, 모든 API를 순회하면서 `APIRoute.name`을 사용해 각 *경로 처리*의 `operation_id`를 덮어쓸 수 있습니다.
+API의 함수 이름을 `operationId`로 사용하고 싶다면, `FastAPI`에 사용자 정의 `generate_unique_id_function`을 전달할 수 있습니다.
-모든 *경로 처리*를 추가한 뒤에 수행해야 합니다.
+이 함수는 각 `APIRoute`를 받아 그 *경로 처리*에 사용할 `operationId`를 반환합니다.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
-/// tip | 팁
-
-`app.openapi()`를 수동으로 호출한다면, 그 전에 `operationId`들을 업데이트해야 합니다.
-
-///
-
-/// warning | 경고
+/// warning
이렇게 할 경우, 각 *경로 처리 함수*의 이름이 고유하도록 보장해야 합니다.
@@ -78,7 +72,7 @@ OpenAPI 명세에서는 이를 [Operation Object](https://github.com/OAI/OpenAPI
이 *경로 처리* 전용 OpenAPI 스키마는 보통 **FastAPI**가 자동으로 생성하지만, 확장할 수도 있습니다.
-/// tip | 팁
+/// tip
이는 저수준 확장 지점입니다.
@@ -163,7 +157,7 @@ OpenAPI 명세에서는 이를 [Operation Object](https://github.com/OAI/OpenAPI
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[24:31] *}
-/// tip | 팁
+/// tip
여기서는 같은 Pydantic 모델을 재사용합니다.
diff --git a/docs/ko/docs/advanced/response-directly.md b/docs/ko/docs/advanced/response-directly.md
index 301a259b2..fc2efc728 100644
--- a/docs/ko/docs/advanced/response-directly.md
+++ b/docs/ko/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@
`Response` 또는 그 하위 클래스를 반환할 수 있습니다.
-/// info | 정보
+/// note | 참고
`JSONResponse` 자체도 `Response`의 하위 클래스입니다.
diff --git a/docs/ko/docs/advanced/security/oauth2-scopes.md b/docs/ko/docs/advanced/security/oauth2-scopes.md
index 5a785ff9f..6aed77f75 100644
--- a/docs/ko/docs/advanced/security/oauth2-scopes.md
+++ b/docs/ko/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OpenAPI(예: API 문서)에서는 “security schemes”를 정의할 수 있습
* `instagram_basic` 는 Facebook/Instagram에서 사용합니다.
* `https://www.googleapis.com/auth/drive` 는 Google에서 사용합니다.
-/// info | 정보
+/// note | 참고
OAuth2에서 “스코프”는 필요한 특정 권한을 선언하는 문자열일 뿐입니다.
@@ -126,7 +126,7 @@ OAuth2 입장에서는 그저 문자열입니다.
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | 기술 세부사항
+/// note | 기술 세부사항
`Security`는 실제로 `Depends`의 서브클래스이며, 나중에 보게 될 추가 매개변수 하나만 더 있습니다.
diff --git a/docs/ko/docs/advanced/stream-data.md b/docs/ko/docs/advanced/stream-data.md
index 5eda170cb..33013fddd 100644
--- a/docs/ko/docs/advanced/stream-data.md
+++ b/docs/ko/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@ JSON으로 구조화할 수 있는 데이터를 스트리밍하려면 [JSON Line
하지만 순수 바이너리 데이터나 문자열을 스트리밍하려면 다음과 같이 하면 됩니다.
-/// info | 정보
+/// note | 참고
FastAPI 0.134.0에 추가되었습니다.
@@ -90,7 +90,7 @@ FastAPI는 데이터를 Pydantic으로 JSON으로 변환하거나 어떤 방식
또한 디스크나 네트워크에서 읽기 때문에, 많은 경우 읽기 작업은 이벤트 루프를 막을 수 있는 블로킹 연산입니다.
-/// info | 정보
+/// note | 참고
위의 예시는 예외적인 경우입니다. `io.BytesIO` 객체는 이미 메모리에 있으므로 읽기가 아무 것도 차단하지 않습니다.
diff --git a/docs/ko/docs/advanced/strict-content-type.md b/docs/ko/docs/advanced/strict-content-type.md
index 82683e15c..39ecde4b6 100644
--- a/docs/ko/docs/advanced/strict-content-type.md
+++ b/docs/ko/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
이 설정을 사용하면 `Content-Type` 헤더가 없는 요청도 본문이 JSON으로 파싱됩니다. 이는 이전 버전의 FastAPI와 동일한 동작입니다.
-/// info | 정보
+/// note | 참고
이 동작과 설정은 FastAPI 0.132.0에 추가되었습니다.
diff --git a/docs/ko/docs/advanced/websockets.md b/docs/ko/docs/advanced/websockets.md
index 0b920c3b3..b37d93804 100644
--- a/docs/ko/docs/advanced/websockets.md
+++ b/docs/ko/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ WebSocket 엔드포인트에서 `fastapi`에서 다음을 가져와 사용할
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info | 정보
+/// note | 참고
WebSocket이기 때문에 `HTTPException`을 발생시키는 것은 적절하지 않습니다. 대신 `WebSocketException`을 발생시킵니다.
diff --git a/docs/ko/docs/advanced/wsgi.md b/docs/ko/docs/advanced/wsgi.md
index 921e426ef..bd359661d 100644
--- a/docs/ko/docs/advanced/wsgi.md
+++ b/docs/ko/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@
## `WSGIMiddleware` 사용하기 { #using-wsgimiddleware }
-/// info | 정보
+/// note | 참고
이를 사용하려면 `a2wsgi`를 설치해야 합니다. 예: `pip install a2wsgi`
diff --git a/docs/ko/docs/deployment/docker.md b/docs/ko/docs/deployment/docker.md
index d965af1d1..93e69873a 100644
--- a/docs/ko/docs/deployment/docker.md
+++ b/docs/ko/docs/deployment/docker.md
@@ -26,7 +26,7 @@ COPY ./app /code/app
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
-# If running behind a proxy like Nginx or Traefik add --proxy-headers
+# Nginx나 Traefik 같은 프록시 뒤에서 실행한다면 --proxy-headers를 추가하세요
# CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"]
```
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | 정보
+/// note | 참고
패키지 의존성을 정의하고 설치하는 다른 형식과 도구도 있습니다.
@@ -556,7 +556,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
**여러 컨테이너**가 있고 각 컨테이너가 보통 **단일 프로세스**를 실행한다면(예: **Kubernetes** 클러스터), 복제된 워커 컨테이너를 실행하기 **전에**, 단일 컨테이너에서 단일 프로세스로 **시작 전 사전 단계**를 수행하는 **별도의 컨테이너**를 두고 싶을 가능성이 큽니다.
-/// info | 정보
+/// note | 참고
Kubernetes를 사용한다면, 이는 아마도 [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)일 것입니다.
diff --git a/docs/ko/docs/deployment/fastapicloud.md b/docs/ko/docs/deployment/fastapicloud.md
index a601f5416..5fe057f47 100644
--- a/docs/ko/docs/deployment/fastapicloud.md
+++ b/docs/ko/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-**한 번의 명령**으로 FastAPI 앱을 [FastAPI Cloud](https://fastapicloud.com)에 배포할 수 있습니다. 아직이라면 대기자 명단에 등록해 보세요. 🚀
-
-## 로그인하기 { #login }
-
-먼저 **FastAPI Cloud** 계정이 이미 있는지 확인하세요(대기자 명단에서 초대해 드렸을 거예요 😉).
-
-그다음 로그인합니다:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## 배포하기 { #deploy }
-
-이제 **한 번의 명령**으로 앱을 배포합니다:
+**한 번의 명령**으로 FastAPI 앱을 [FastAPI Cloud](https://fastapicloud.com)에 배포할 수 있습니다. 🚀
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
+CLI가 FastAPI 애플리케이션을 자동으로 감지하여 클라우드에 배포합니다. 로그인되어 있지 않다면, 인증을 완료할 수 있도록 브라우저가 자동으로 열립니다.
+
이게 전부입니다! 이제 해당 URL에서 앱에 접근할 수 있습니다. ✨
## FastAPI Cloud 소개 { #about-fastapi-cloud }
diff --git a/docs/ko/docs/deployment/manually.md b/docs/ko/docs/deployment/manually.md
index 719968682..b2a91bd94 100644
--- a/docs/ko/docs/deployment/manually.md
+++ b/docs/ko/docs/deployment/manually.md
@@ -56,7 +56,6 @@ FastAPI는
-
+
**Pydantic v2**의 이 기능 덕분에 API 문서는 더 **정밀**해지고, 자동 생성된 클라이언트와 SDK가 있다면 그것들도 더 정밀해져서 더 나은 **developer experience**와 일관성을 제공할 수 있습니다. 🎉
@@ -85,7 +85,7 @@
그런 경우에는, **FastAPI**에서 `separate_input_output_schemas=False` 파라미터로 이 기능을 비활성화할 수 있습니다.
-/// info | 정보
+/// note | 참고
`separate_input_output_schemas` 지원은 FastAPI `0.102.0`에 추가되었습니다. 🤓
diff --git a/docs/ko/docs/index.md b/docs/ko/docs/index.md
index 0dd0bef59..33f34b416 100644
--- a/docs/ko/docs/index.md
+++ b/docs/ko/docs/index.md
@@ -143,7 +143,7 @@ FastAPI는 현대적이고, 빠르며(고성능), 파이썬 표준 타입 힌트
---
-"_프로덕션 Python API를 만들고자 한다면, 저는 **FastAPI**를 강력히 추천합니다. **아름답게 설계**되었고, **사용이 간단**하며, **확장성이 매우 뛰어나** 우리의 API 우선 개발 전략에서 **핵심 구성 요소**가 되었습니다._"
+"_프로덕션 Python API를 만들고자 한다면, 저는 **FastAPI**를 강력히 추천합니다. **아름답게 설계**되었고, **사용이 간단**하며, **확장성이 매우 뛰어나** 우리의 API 우선 개발 전략에서 **핵심 구성 요소**가 되었고, 우리의 Virtual TAC Engineer와 같은 여러 자동화와 서비스들을 추진하고 있습니다._"
Deon Pillsbury -
Cisco (ref)
@@ -492,9 +492,7 @@ item: Item
### 앱 배포하기(선택 사항) { #deploy-your-app-optional }
-선택적으로 FastAPI 앱을 [FastAPI Cloud](https://fastapicloud.com)에 배포할 수 있습니다. 아직이라면 대기자 명단에 등록해 보세요. 🚀
-
-이미 **FastAPI Cloud** 계정이 있다면(대기자 명단에서 초대해 드렸습니다 😉), 한 번의 명령으로 애플리케이션을 배포할 수 있습니다.
+선택적으로 FastAPI 앱을 한 번의 명령어로 [FastAPI Cloud](https://fastapicloud.com)에 배포할 수 있습니다. 🚀
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+CLI가 여러분의 FastAPI 애플리케이션을 자동으로 감지하여 클라우드에 배포합니다. 로그인되어 있지 않다면, 인증을 완료하기 위해 브라우저가 열립니다.
+
이게 전부입니다! 이제 해당 URL에서 앱에 접근할 수 있습니다. ✨
#### FastAPI Cloud 소개 { #about-fastapi-cloud }
diff --git a/docs/ko/docs/tutorial/bigger-applications.md b/docs/ko/docs/tutorial/bigger-applications.md
index a206bfdc1..f95286047 100644
--- a/docs/ko/docs/tutorial/bigger-applications.md
+++ b/docs/ko/docs/tutorial/bigger-applications.md
@@ -396,9 +396,9 @@ from .routers.users import router
/// note | 기술 세부사항
-내부적으로는 `APIRouter`에 선언된 각 *path operation*마다 *path operation*을 실제로 생성합니다.
+FastAPI는 메인 애플리케이션에 router를 포함해도 원래의 `APIRouter`와 그 `APIRoute`들을 활성 상태로 유지합니다.
-즉, 내부적으로는 모든 것이 동일한 하나의 앱인 것처럼 동작합니다.
+즉, 커스텀 `APIRouter`와 `APIRoute` 서브클래스가 포함된 이후에도 계속 작동할 수 있습니다.
///
@@ -406,7 +406,7 @@ from .routers.users import router
router를 포함(include)할 때 성능을 걱정할 필요는 없습니다.
-이 작업은 마이크로초 단위이며 시작 시에만 발생합니다.
+이 기능은 매우 가볍게 설계되었고 각 요청에 오버헤드를 추가하지 않도록 되어 있습니다.
따라서 성능에 영향을 주지 않습니다. ⚡
@@ -459,9 +459,9 @@ router를 포함(include)할 때 성능을 걱정할 필요는 없습니다.
`APIRouter`는 "mount"되는 것이 아니며, 애플리케이션의 나머지 부분과 격리되어 있지 않습니다.
-이는 OpenAPI 스키마와 사용자 인터페이스에 그들의 *path operations*를 포함시키고 싶기 때문입니다.
+이는 OpenAPI 스키마와 사용자 인터페이스에 그들의 *path operations*를 포함시키기 위함입니다.
-나머지와 독립적으로 격리해 "mount"할 수 없으므로, *path operations*는 직접 포함되는 것이 아니라 "clone"(재생성)됩니다.
+FastAPI는 원래의 router와 *path operations*를 활성 상태로 유지하고, 요청을 처리하고 OpenAPI를 생성할 때 router의 prefix, dependencies, tags, responses 및 기타 메타데이터를 결합합니다.
///
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-`FastAPI` 앱에 `router`를 포함하기 전에 수행해야 하며, 그래야 `other_router`의 *path operations*도 함께 포함됩니다.
+`router`를 `FastAPI` 앱에 포함하기 전이든 후든, 어느 시점에 해도 됩니다. FastAPI는 라우팅과 OpenAPI에 `other_router`의 *path operations*도 포함합니다.
+
+나중에 router들에 추가된 *path operations*도 동일하게 적용됩니다. 이전에 수행한 포함을 통해서도 보이게 됩니다.
+
+/// warning | 기술 세부사항
+
+router를 포함한 뒤에 `router.routes`를 직접 변형하는 것은 피하세요. FastAPI는 router 포함을 실시간으로 처리하므로, 원래 router와 그 routes는 라우팅과 OpenAPI 생성의 일부로 남아 있습니다.
+
+경로와 router를 추가할 때는 path operation 데코레이터와 `.include_router()` 같은 문서화된 API를 사용하세요.
+
+`router.routes`는 최종 *path operations*의 평탄화된 목록이 아니라, route 정의와 포함된 router를 담는 하위 수준의 트리로 취급하고, 여기에 의존하지 마세요.
+
+///
diff --git a/docs/ko/docs/tutorial/body-multiple-params.md b/docs/ko/docs/tutorial/body-multiple-params.md
index 3db614d72..c686e8a5a 100644
--- a/docs/ko/docs/tutorial/body-multiple-params.md
+++ b/docs/ko/docs/tutorial/body-multiple-params.md
@@ -111,7 +111,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | 정보
+/// note | 참고
`Body` 또한 `Query`, `Path` 그리고 이후에 볼 다른 것들과 마찬가지로 동일한 추가 검증과 메타데이터 매개변수를 모두 갖고 있습니다.
@@ -126,7 +126,7 @@ Pydantic 모델 `Item`에서 가져온 단일 `item` 본문 매개변수만 있
하지만 추가 본문 매개변수를 선언할 때처럼, `item` 키를 가지고 그 안에 모델 내용이 들어 있는 JSON을 예상하게 하려면, `Body`의 특별한 매개변수 `embed`를 사용할 수 있습니다:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
다음과 같이요:
diff --git a/docs/ko/docs/tutorial/body-nested-models.md b/docs/ko/docs/tutorial/body-nested-models.md
index bbb95cf00..e6c70d179 100644
--- a/docs/ko/docs/tutorial/body-nested-models.md
+++ b/docs/ko/docs/tutorial/body-nested-models.md
@@ -136,7 +136,7 @@ Pydantic 모델의 각 어트리뷰트는 타입을 갖습니다.
}
```
-/// info | 정보
+/// note | 참고
`images` 키가 이제 이미지 객체 리스트를 갖는지 주목하세요.
@@ -148,7 +148,7 @@ Pydantic 모델의 각 어트리뷰트는 타입을 갖습니다.
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | 정보
+/// note | 참고
`Offer`가 `Item`의 리스트를 가지고, 그 `Item`이 다시 선택 사항인 `Image` 리스트를 갖는지 주목하세요
diff --git a/docs/ko/docs/tutorial/body.md b/docs/ko/docs/tutorial/body.md
index d124b4bef..e5a670baf 100644
--- a/docs/ko/docs/tutorial/body.md
+++ b/docs/ko/docs/tutorial/body.md
@@ -8,7 +8,7 @@
**요청** 본문을 선언하기 위해서 모든 강력함과 이점을 갖춘 [Pydantic](https://docs.pydantic.dev/) 모델을 사용합니다.
-/// info | 정보
+/// note | 참고
데이터를 보내기 위해, (좀 더 보편적인) `POST`, `PUT`, `DELETE` 혹은 `PATCH` 중에 하나를 사용하는 것이 좋습니다.
diff --git a/docs/ko/docs/tutorial/cookie-param-models.md b/docs/ko/docs/tutorial/cookie-param-models.md
index 70b76e09c..2105bea86 100644
--- a/docs/ko/docs/tutorial/cookie-param-models.md
+++ b/docs/ko/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@
-/// info | 정보
+/// note | 참고
명심하세요, 내부적으로 **브라우저는 쿠키를 특별한 방식으로 처리**하기 때문에 **자바스크립트**가 쉽게 쿠키를 건드릴 수 **없습니다**.
diff --git a/docs/ko/docs/tutorial/cookie-params.md b/docs/ko/docs/tutorial/cookie-params.md
index 6ea09101c..223d896e0 100644
--- a/docs/ko/docs/tutorial/cookie-params.md
+++ b/docs/ko/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@
///
-/// info
+/// note
쿠키를 선언하기 위해서는 `Cookie`를 사용해야 합니다. 그렇지 않으면 해당 매개변수를 쿼리 매개변수로 해석하기 때문입니다.
///
-/// info
+/// note
**브라우저는 쿠키를** 내부적으로 특별한 방식으로 처리하기 때문에, **JavaScript**가 쉽게 쿠키를 다루도록 허용하지 않는다는 점을 염두에 두세요.
diff --git a/docs/ko/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/ko/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index 880a47157..f31a57586 100644
--- a/docs/ko/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/ko/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@
///
-/// info | 정보
+/// note | 참고
이 예시에서 `X-Key`와 `X-Token`이라는 커스텀 헤더를 만들어 사용했습니다.
diff --git a/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md
index 56f690f59..61bb47d9d 100644
--- a/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/ko/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info
+/// note
클라이언트에는 **하나의 응답**만 전송됩니다. 이는 오류 응답 중 하나일 수도 있고, *경로 처리*에서 생성된 응답일 수도 있습니다.
diff --git a/docs/ko/docs/tutorial/dependencies/index.md b/docs/ko/docs/tutorial/dependencies/index.md
index 4b540b779..7473ce899 100644
--- a/docs/ko/docs/tutorial/dependencies/index.md
+++ b/docs/ko/docs/tutorial/dependencies/index.md
@@ -51,7 +51,7 @@
그 후 위의 값을 포함한 `dict` 자료형으로 반환할 뿐입니다.
-/// info | 정보
+/// note | 참고
FastAPI는 0.95.0 버전부터 `Annotated`에 대한 지원을 (그리고 이를 사용하기 권장합니다) 추가했습니다.
@@ -106,7 +106,7 @@ common_parameters --> read_users
이렇게 하면 공용 코드를 한번만 적어도 되며, **FastAPI**는 *경로 처리*을 위해 이에 대한 호출을 처리합니다.
-/// check | 확인
+/// tip | 팁
특별한 클래스를 만들지 않아도 되며, 이러한 것 혹은 비슷한 종류를 **FastAPI**에 "등록"하기 위해 어떤 곳에 넘겨주지 않아도 됩니다.
diff --git a/docs/ko/docs/tutorial/dependencies/sub-dependencies.md b/docs/ko/docs/tutorial/dependencies/sub-dependencies.md
index 52c847b70..c0443bf2c 100644
--- a/docs/ko/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/ko/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | 정보
+/// note | 참고
*경로 처리 함수*에서는 `query_or_cookie_extractor`라는 의존성 하나만 선언하고 있다는 점에 주목하세요.
diff --git a/docs/ko/docs/tutorial/first-steps.md b/docs/ko/docs/tutorial/first-steps.md
index cc3d6c618..db68497e2 100644
--- a/docs/ko/docs/tutorial/first-steps.md
+++ b/docs/ko/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ entrypoint = "backend.main:app"
from backend.main import app
```
-### `fastapi dev`에 경로 지정하기 { #fastapi-dev-with-path }
+### `fastapi dev`를 경로 또는 `--entrypoint` CLI 옵션과 함께 사용하기 { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
`fastapi dev` 명령어에 파일 경로를 전달할 수도 있으며, 그러면 사용할 FastAPI app 객체를 추정합니다:
@@ -188,29 +188,19 @@ from backend.main import app
$ fastapi dev main.py
```
-하지만 매번 `fastapi` 명령어를 호출할 때마다 올바른 경로를 전달해야 합니다.
-
-또한 다른 도구들, 예를 들어 [VS Code 확장](../editor-support.md)이나 [FastAPI Cloud](https://fastapicloud.com)가 이를 찾지 못할 수 있으므로, `pyproject.toml`의 `entrypoint`를 사용하는 것을 권장합니다.
-
-### 앱 배포하기(선택 사항) { #deploy-your-app-optional }
-
-선택적으로 FastAPI 앱을 [FastAPI Cloud](https://fastapicloud.com)에 배포할 수 있습니다. 아직 대기자 명단에 등록하지 않았다면, 등록하러 가세요. 🚀
-
-이미 **FastAPI Cloud** 계정이 있다면(대기자 명단에서 초대해 드렸습니다 😉), 한 번의 명령으로 애플리케이션을 배포할 수 있습니다.
-
-배포하기 전에, 로그인되어 있는지 확인하세요:
-
-
+또는 `fastapi dev` 명령어에 `--entrypoint` 옵션을 전달할 수도 있습니다:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+하지만 매번 `fastapi` 명령어를 호출할 때마다 올바른 path\entrypoint를 전달해야 합니다.
-그 다음 앱을 배포합니다:
+또한 다른 도구들, 예를 들어 [VS Code 확장](../editor-support.md)이나 [FastAPI Cloud](https://fastapicloud.com)가 이를 찾지 못할 수 있으므로, `pyproject.toml`의 `entrypoint`를 사용하는 것을 권장합니다.
+
+### 앱 배포하기(선택 사항) { #deploy-your-app-optional }
+
+선택적으로 FastAPI 앱을 [FastAPI Cloud](https://fastapicloud.com)에 단 한 번의 명령으로 배포할 수 있습니다. 🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+CLI가 여러분의 FastAPI 애플리케이션을 자동으로 감지하고 클라우드에 배포합니다. 로그인되어 있지 않다면 브라우저가 열려 인증 과정을 완료합니다.
+
이게 전부입니다! 이제 해당 URL에서 앱에 접근할 수 있습니다. ✨
## 단계별 요약 { #recap-step-by-step }
@@ -269,8 +261,7 @@ https://example.com/items/foo
```
/items/foo
```
-
-/// info | 정보
+/// note | 참고
"경로"는 일반적으로 "엔드포인트" 또는 "라우트"라고도 불립니다.
@@ -322,7 +313,7 @@ API를 설계할 때 일반적으로 특정 행동을 수행하기 위해 특정
* 경로 `/`
* get 작동 사용
-/// info | `@decorator` 정보
+/// note | `@decorator` 정보
이 `@something` 문법은 파이썬에서 "데코레이터"라 부릅니다.
diff --git a/docs/ko/docs/tutorial/metadata.md b/docs/ko/docs/tutorial/metadata.md
index 9220dc2b4..4461f2bc4 100644
--- a/docs/ko/docs/tutorial/metadata.md
+++ b/docs/ko/docs/tutorial/metadata.md
@@ -74,7 +74,7 @@ OpenAPI 3.1.0 및 FastAPI 0.99.0부터 `license_info`에 `url` 대신 `identifie
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | 정보
+/// note | 참고
태그에 대한 자세한 내용은 [경로 처리 구성](path-operation-configuration.md#tags)에서 읽어보세요.
diff --git a/docs/ko/docs/tutorial/path-operation-configuration.md b/docs/ko/docs/tutorial/path-operation-configuration.md
index ebdf6f918..a92b04c9d 100644
--- a/docs/ko/docs/tutorial/path-operation-configuration.md
+++ b/docs/ko/docs/tutorial/path-operation-configuration.md
@@ -72,13 +72,13 @@
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | 정보
+/// note | 참고
`response_description`은 구체적으로 응답을 지칭하며, `description`은 일반적인 *경로 처리*를 지칭합니다.
///
-/// check | 확인
+/// tip | 팁
OpenAPI는 각 *경로 처리*가 응답에 관한 설명을 요구할 것을 명시합니다.
diff --git a/docs/ko/docs/tutorial/path-params-numeric-validations.md b/docs/ko/docs/tutorial/path-params-numeric-validations.md
index 2ff56c46e..8511f9dba 100644
--- a/docs/ko/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/ko/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | 정보
+/// note | 참고
FastAPI는 0.95.0 버전에서 `Annotated` 지원을 추가했고(그리고 이를 권장하기 시작했습니다).
@@ -131,7 +131,7 @@ FastAPI는 0.95.0 버전에서 `Annotated` 지원을 추가했고(그리고 이
* `lt`: `l`ess `t`han
* `le`: `l`ess than or `e`qual
-/// info | 정보
+/// note | 참고
`Query`, `Path`, 그리고 나중에 보게 될 다른 클래스들은 공통 `Param` 클래스의 서브클래스입니다.
diff --git a/docs/ko/docs/tutorial/path-params.md b/docs/ko/docs/tutorial/path-params.md
index c6ea6b7c1..0f1c8ee76 100644
--- a/docs/ko/docs/tutorial/path-params.md
+++ b/docs/ko/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@
위의 예시에서, `item_id`는 `int`로 선언되었습니다.
-/// check | 확인
+/// tip | 팁
이 기능은 함수 내에서 오류 검사, 자동완성 등의 편집기 기능을 활용할 수 있게 해줍니다.
@@ -34,7 +34,7 @@
{"item_id":3}
```
-/// check | 확인
+/// tip | 팁
함수가 받은(반환도 하는) 값은 문자열 `"3"`이 아니라 파이썬 `int` 형인 `3`입니다.
@@ -66,7 +66,7 @@
`int` 대신 `float`을 제공하면(예: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)) 동일한 오류가 나타납니다.
-/// check | 확인
+/// tip | 팁
즉, 파이썬 타입 선언을 하면 **FastAPI**는 데이터 검증을 합니다.
@@ -82,7 +82,7 @@
-/// check | 확인
+/// tip | 팁
다시 한 번, 동일한 파이썬 타입 선언만으로 **FastAPI**는 자동 대화형 문서(Swagger UI 통합)를 제공합니다.
diff --git a/docs/ko/docs/tutorial/query-params.md b/docs/ko/docs/tutorial/query-params.md
index 4dffc9057..8004b2dde 100644
--- a/docs/ko/docs/tutorial/query-params.md
+++ b/docs/ko/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ http://127.0.0.1:8000/items/?skip=20
이 경우 함수 매개변수 `q`는 선택적이며 기본값으로 `None` 값이 됩니다.
-/// check
+/// tip | 팁
또한 **FastAPI**는 `item_id`가 경로 매개변수이고 `q`는 경로 매개변수가 아니라서 쿼리 매개변수라는 것을 알 정도로 충분히 똑똑하다는 점도 확인하세요.
@@ -181,7 +181,7 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
* `skip`, 기본값이 `0`인 `int`.
* `limit`, 선택적인 `int`.
-/// tip
+/// tip | 팁
[경로 매개변수](path-params.md#predefined-values)와 마찬가지로 `Enum`을 사용할 수 있습니다.
diff --git a/docs/ko/docs/tutorial/request-files.md b/docs/ko/docs/tutorial/request-files.md
index 49522ac25..bca580b67 100644
--- a/docs/ko/docs/tutorial/request-files.md
+++ b/docs/ko/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
`File`을 사용하여 클라이언트가 업로드할 파일들을 정의할 수 있습니다.
-/// info | 정보
+/// note | 참고
업로드된 파일을 전달받기 위해 먼저 [`python-multipart`](https://github.com/Kludex/python-multipart)를 설치해야합니다.
@@ -28,7 +28,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | 정보
+/// note | 참고
`File` 은 `Form` 으로부터 직접 상속된 클래스입니다.
diff --git a/docs/ko/docs/tutorial/request-form-models.md b/docs/ko/docs/tutorial/request-form-models.md
index 4a5c3e1a7..351067d3e 100644
--- a/docs/ko/docs/tutorial/request-form-models.md
+++ b/docs/ko/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
FastAPI에서 **Pydantic 모델**을 이용하여 **폼 필드**를 선언할 수 있습니다.
-/// info | 정보
+/// note | 참고
폼을 사용하려면, 먼저 [`python-multipart`](https://github.com/Kludex/python-multipart)를 설치하세요.
diff --git a/docs/ko/docs/tutorial/request-forms-and-files.md b/docs/ko/docs/tutorial/request-forms-and-files.md
index fa8fdae7e..644bd0cc0 100644
--- a/docs/ko/docs/tutorial/request-forms-and-files.md
+++ b/docs/ko/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
`File` 과 `Form` 을 사용하여 파일과 폼 필드를 동시에 정의할 수 있습니다.
-/// info
+/// note
업로드된 파일 및/또는 폼 데이터를 받으려면 먼저 [`python-multipart`](https://github.com/Kludex/python-multipart)를 설치해야 합니다.
diff --git a/docs/ko/docs/tutorial/request-forms.md b/docs/ko/docs/tutorial/request-forms.md
index 4a618f587..2bc678801 100644
--- a/docs/ko/docs/tutorial/request-forms.md
+++ b/docs/ko/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
JSON 대신 폼 필드를 받아야 하는 경우 `Form`을 사용할 수 있습니다.
-/// info | 정보
+/// note | 참고
폼을 사용하려면, 먼저 [`python-multipart`](https://github.com/Kludex/python-multipart)를 설치하세요.
@@ -30,9 +30,9 @@ $ pip install python-multipart
사양에서는 필드 이름이 `username` 및 `password`로 정확하게 명명되어야 하고, JSON이 아닌 폼 필드로 전송해야 합니다.
-`Form`을 사용하면 유효성 검사, 예제, 별칭(예: `username` 대신 `user-name`) 등을 포함하여 `Body`(및 `Query`, `Path`, `Cookie`)와 동일한 구성을 선언할 수 있습니다.
+`Form`을 사용하면 유효성 검사, 예제, 별칭(예: `user-name` 대신 `username`) 등을 포함하여 `Body`(및 `Query`, `Path`, `Cookie`)와 동일한 구성을 선언할 수 있습니다.
-/// info | 정보
+/// note | 참고
`Form`은 `Body`에서 직접 상속되는 클래스입니다.
@@ -56,7 +56,7 @@ HTML 폼(``)이 데이터를 서버로 보내는 방식은 일반
그러나 폼에 파일이 포함된 경우, `multipart/form-data`로 인코딩합니다. 다음 장에서 파일 처리에 대해 읽을 겁니다.
-이러한 인코딩 및 폼 필드에 대해 더 읽고 싶다면, [`POST`에 대한 MDN 웹 문서를 참조하세요](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+이러한 인코딩 및 폼 필드에 대해 더 읽고 싶다면, [`POST`에 대한 MDN 웹 문서를 참조하세요](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/ko/docs/tutorial/response-model.md b/docs/ko/docs/tutorial/response-model.md
index f3d104626..bdd8cec2c 100644
--- a/docs/ko/docs/tutorial/response-model.md
+++ b/docs/ko/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPI는 이 `response_model`을 사용해 데이터 문서화, 검증 등을
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | 정보
+/// note | 참고
`EmailStr`을 사용하려면 먼저 [`email-validator`](https://github.com/JoshData/python-email-validator)를 설치하세요.
@@ -202,11 +202,11 @@ FastAPI는 Pydantic을 내부적으로 여러 방식으로 사용하여, 클래
하지만 유효한 Pydantic 타입이 아닌 다른 임의의 객체(예: 데이터베이스 객체)를 반환하고, 함수에서 그렇게 어노테이션하면, FastAPI는 그 타입 어노테이션으로부터 Pydantic 응답 모델을 만들려고 시도하다가 실패합니다.
-또한, 유효한 Pydantic 타입이 아닌 타입이 하나 이상 포함된 여러 타입 간의 union이 있는 경우에도 동일합니다. 예를 들어, 아래는 실패합니다 💥:
+또한, 유효한 Pydantic 타입이 아닌 타입이 하나 이상 포함된 여러 타입 간의 유니온이 있는 경우에도 동일합니다. 예를 들어, 아래는 실패합니다 💥:
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
-...이는 타입 어노테이션이 Pydantic 타입이 아니고, 단일 `Response` 클래스/서브클래스도 아니며, `Response`와 `dict` 간 union(둘 중 아무거나)이기 때문에 실패합니다.
+...이는 타입 어노테이션이 Pydantic 타입이 아니고, 단일 `Response` 클래스/서브클래스도 아니며, `Response`와 `dict` 간 유니온(둘 중 아무거나)이기 때문에 실패합니다.
### 응답 모델 비활성화 { #disable-response-model }
@@ -251,7 +251,7 @@ FastAPI는 Pydantic을 내부적으로 여러 방식으로 사용하여, 클래
}
```
-/// info | 정보
+/// note | 참고
다음도 사용할 수 있습니다:
diff --git a/docs/ko/docs/tutorial/response-status-code.md b/docs/ko/docs/tutorial/response-status-code.md
index 68db66e33..bc966916f 100644
--- a/docs/ko/docs/tutorial/response-status-code.md
+++ b/docs/ko/docs/tutorial/response-status-code.md
@@ -12,13 +12,13 @@
/// note | 참고
-`status_code` 는 "데코레이터" 메소드(`get`, `post` 등)의 매개변수입니다. 모든 매개변수들과 본문처럼 *경로 처리 함수*가 아닙니다.
+`status_code` 는 "데코레이터" 메소드(`get`, `post` 등)의 매개변수입니다. 다른 매개변수나 본문과 달리, *경로 처리 함수*의 매개변수가 아닙니다.
///
`status_code` 매개변수는 HTTP 상태 코드를 숫자로 입력받습니다.
-/// info | 정보
+/// note | 참고
`status_code` 는 파이썬의 [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) 와 같은 `IntEnum` 을 입력받을 수도 있습니다.
diff --git a/docs/ko/docs/tutorial/schema-extra-example.md b/docs/ko/docs/tutorial/schema-extra-example.md
index ffa97375d..9326ba032 100644
--- a/docs/ko/docs/tutorial/schema-extra-example.md
+++ b/docs/ko/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@ JSON 스키마를 확장하고 여러분의 별도의 자체 데이터를 추가
///
-/// info | 정보
+/// note | 참고
(FastAPI 0.99.0부터 쓰이기 시작한) OpenAPI 3.1.0은 **JSON 스키마** 표준의 일부인 `examples`에 대한 지원을 추가했습니다.
@@ -155,7 +155,7 @@ OpenAPI는 또한 `example`과 `examples` 필드를 명세서의 다른 부분
* `File()`
* `Form()`
-/// info | 정보
+/// note | 참고
이 예전 OpenAPI-특화 `examples` 매개변수는 이제 FastAPI `0.103.0`부터 `openapi_examples`입니다.
@@ -171,7 +171,7 @@ OpenAPI는 또한 `example`과 `examples` 필드를 명세서의 다른 부분
JSON 스키마의 새로운 `examples` 필드는 예제의 **단순한 `list`**일 뿐이며, (위에서 상술한 것처럼) OpenAPI의 다른 곳에 존재하는 추가 메타데이터가 있는 dict가 아닙니다.
-/// info | 정보
+/// note | 참고
더 쉽고 새로운 JSON 스키마와의 통합과 함께 OpenAPI 3.1.0가 배포되었지만, 잠시동안 자동 문서 생성을 제공하는 도구인 Swagger UI는 OpenAPI 3.1.0을 지원하지 않았습니다 (5.0.0 버전부터 지원합니다 🎉).
diff --git a/docs/ko/docs/tutorial/security/first-steps.md b/docs/ko/docs/tutorial/security/first-steps.md
index 8b7563ec3..0c197adf9 100644
--- a/docs/ko/docs/tutorial/security/first-steps.md
+++ b/docs/ko/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@
## 실행하기 { #run-it }
-/// info | 정보
+/// note | 참고
[`python-multipart`](https://github.com/Kludex/python-multipart) 패키지는 `pip install "fastapi[standard]"` 명령을 실행하면 **FastAPI**와 함께 자동으로 설치됩니다.
@@ -60,7 +60,7 @@ $ fastapi dev
-/// check | Authorize 버튼!
+/// tip | Authorize 버튼!
반짝이는 새 "Authorize" 버튼이 이미 있습니다.
@@ -118,7 +118,7 @@ OAuth2는 backend 또는 API가 사용자를 인증하는 서버와 독립적일
이 예제에서는 **OAuth2**의 **Password** 플로우와 **Bearer** token을 사용합니다. 이를 위해 `OAuth2PasswordBearer` 클래스를 사용합니다.
-/// info | 정보
+/// note | 참고
"bearer" token만이 유일한 선택지는 아닙니다.
@@ -148,7 +148,7 @@ OAuth2는 backend 또는 API가 사용자를 인증하는 서버와 독립적일
곧 실제 경로 처리를 만들 것입니다.
-/// info | 정보
+/// note | 참고
엄격한 "Pythonista"라면 `token_url` 대신 `tokenUrl` 같은 파라미터 이름 스타일이 마음에 들지 않을 수도 있습니다.
@@ -176,7 +176,7 @@ oauth2_scheme(some, parameters)
**FastAPI**는 이 의존성을 사용해 OpenAPI 스키마(및 자동 API 문서)에 "security scheme"를 정의할 수 있다는 것을 알게 됩니다.
-/// info | 기술 세부사항
+/// note | 기술 세부사항
**FastAPI**는 (의존성에 선언된) `OAuth2PasswordBearer` 클래스를 사용해 OpenAPI에서 보안 스킴을 정의할 수 있다는 것을 알고 있습니다. 이는 `OAuth2PasswordBearer`가 `fastapi.security.oauth2.OAuth2`를 상속하고, 이것이 다시 `fastapi.security.base.SecurityBase`를 상속하기 때문입니다.
diff --git a/docs/ko/docs/tutorial/security/get-current-user.md b/docs/ko/docs/tutorial/security/get-current-user.md
index eab599e27..0c8e5c60f 100644
--- a/docs/ko/docs/tutorial/security/get-current-user.md
+++ b/docs/ko/docs/tutorial/security/get-current-user.md
@@ -52,7 +52,7 @@ Pydantic을 사용해 본문을 선언하는 것과 같은 방식으로, 다른
///
-/// check | 확인
+/// tip | 팁
이 의존성 시스템이 설계된 방식은 모두 `User` 모델을 반환하는 서로 다른 의존성(서로 다른 "dependables")을 가질 수 있도록 합니다.
diff --git a/docs/ko/docs/tutorial/security/oauth2-jwt.md b/docs/ko/docs/tutorial/security/oauth2-jwt.md
index 3c3b93e3a..d07929468 100644
--- a/docs/ko/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/ko/docs/tutorial/security/oauth2-jwt.md
@@ -1,6 +1,6 @@
# 패스워드(해싱 포함)를 사용하는 OAuth2, JWT 토큰을 사용하는 Bearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
-모든 보안 흐름을 구성했으므로, 이제 JWT 토큰과 안전한 패스워드 해싱을 사용해 애플리케이션을 실제로 안전하게 만들겠습니다.
+모든 보안 흐름을 구성했으므로, 이제 JWT 토큰과 안전한 패스워드 해싱을 사용해 애플리케이션을 실제로 안전하게 만들겠습니다.
이 코드는 실제로 애플리케이션에서 사용할 수 있으며, 패스워드 해시를 데이터베이스에 저장하는 등의 작업에 활용할 수 있습니다.
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | 정보
+/// note | 참고
RSA나 ECDSA 같은 전자 서명 알고리즘을 사용할 계획이라면, cryptography 라이브러리 의존성인 `pyjwt[crypto]`를 설치해야 합니다.
@@ -213,7 +213,7 @@ JWT는 사용자를 식별하고 사용자가 API에서 직접 작업을 수행
Username: `johndoe`
Password: `secret`
-/// check | 확인
+/// tip | 팁
코드 어디에도 평문 패스워드 "`secret`"은 없고, 해시된 버전만 있다는 점에 유의하십시오.
diff --git a/docs/ko/docs/tutorial/security/simple-oauth2.md b/docs/ko/docs/tutorial/security/simple-oauth2.md
index 48361de83..a487b7230 100644
--- a/docs/ko/docs/tutorial/security/simple-oauth2.md
+++ b/docs/ko/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ OAuth2는 (우리가 사용하고 있는) "패스워드 플로우"을 사용할
* `instagram_basic`은 페이스북/인스타그램에서 사용합니다.
* `https://www.googleapis.com/auth/drive`는 Google에서 사용합니다.
-/// info | 정보
+/// note | 참고
OAuth2에서 "범위"는 필요한 특정 권한을 선언하는 문자열입니다.
@@ -72,7 +72,7 @@ OAuth2 사양은 실제로 `password`라는 고정 값이 있는 `grant_type`
* `client_id`(선택적으로 사용) (예제에서는 필요하지 않습니다).
* `client_secret`(선택적으로 사용) (예제에서는 필요하지 않습니다).
-/// info | 정보
+/// note | 참고
`OAuth2PasswordRequestForm`은 `OAuth2PasswordBearer`와 같이 **FastAPI**에 대한 특수 클래스가 아닙니다.
@@ -144,7 +144,7 @@ UserInDB(
)
```
-/// info | 정보
+/// note | 참고
`**user_dict`에 대한 자세한 설명은 [**추가 모델** 문서](../extra-models.md#about-user-in-dict)를 다시 확인해보세요.
@@ -196,7 +196,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | 정보
+/// note | 참고
여기서 반환하는 값이 `Bearer`인 추가 헤더 `WWW-Authenticate`도 사양의 일부입니다.
diff --git a/docs/ko/docs/tutorial/server-sent-events.md b/docs/ko/docs/tutorial/server-sent-events.md
index a8ae1180f..abcabd997 100644
--- a/docs/ko/docs/tutorial/server-sent-events.md
+++ b/docs/ko/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@
이는 [JSON Lines 스트리밍](stream-json-lines.md)과 비슷하지만, 브라우저가 기본적으로 [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource)를 통해 지원하는 `text/event-stream` 형식을 사용합니다.
-/// info | 정보
+/// note | 참고
FastAPI 0.135.0에 추가되었습니다.
diff --git a/docs/ko/docs/tutorial/stream-json-lines.md b/docs/ko/docs/tutorial/stream-json-lines.md
index 816338d7e..cc2e051db 100644
--- a/docs/ko/docs/tutorial/stream-json-lines.md
+++ b/docs/ko/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
연속된 데이터를 "**스트림**"으로 보내고 싶다면 **JSON Lines**를 사용할 수 있습니다.
-/// info
+/// note
FastAPI 0.134.0에 추가되었습니다.
@@ -48,7 +48,7 @@ sequenceDiagram
JSON 배열(Python의 list에 해당)과 매우 비슷하지만, 항목들을 `[]`로 감싸고 항목 사이에 `,`를 넣는 대신, 줄마다 하나의 JSON 객체가 있고, 새 줄 문자로 구분됩니다.
-/// info
+/// note
핵심은 애플리케이션이 각 줄을 차례로 생성하는 동안, 클라이언트는 이전 줄을 소비할 수 있다는 점입니다.
diff --git a/docs/ko/docs/tutorial/testing.md b/docs/ko/docs/tutorial/testing.md
index aab85580b..7d0dbc6bc 100644
--- a/docs/ko/docs/tutorial/testing.md
+++ b/docs/ko/docs/tutorial/testing.md
@@ -8,7 +8,7 @@
## `TestClient` 사용하기 { #using-testclient }
-/// info | 정보
+/// note | 참고
`TestClient` 사용하려면, 우선 [`httpx`](https://www.python-httpx.org)를 설치해야 합니다.
@@ -144,7 +144,7 @@ FastAPI 애플리케이션에 요청을 보내는 것 외에도 테스트에서
백엔드로 데이터를 어떻게 보내는지 정보를 더 얻으려면 (`httpx` 혹은 `TestClient`를 이용해서) [HTTPX 문서](https://www.python-httpx.org)를 확인하세요.
-/// info | 정보
+/// note | 참고
`TestClient`는 Pydantic 모델이 아니라 JSON으로 변환될 수 있는 데이터를 받습니다.
diff --git a/docs/pt/docs/advanced/additional-responses.md b/docs/pt/docs/advanced/additional-responses.md
index 1df4b9851..1e68134d3 100644
--- a/docs/pt/docs/advanced/additional-responses.md
+++ b/docs/pt/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@ Lembre-se que você deve retornar o `JSONResponse` diretamente.
///
-/// info | Informação
+/// note | Nota
A chave `model` não é parte do OpenAPI.
@@ -183,7 +183,7 @@ Note que você deve retornar a imagem utilizando um `FileResponse` diretamente.
///
-/// info | Informação
+/// note | Nota
A menos que você especifique um media type diferente explicitamente em seu parâmetro `responses`, o FastAPI assumirá que o retorno possui o mesmo media type contido na classe principal de retorno (padrão `application/json`).
diff --git a/docs/pt/docs/advanced/advanced-dependencies.md b/docs/pt/docs/advanced/advanced-dependencies.md
index dbcf99390..15a78afec 100644
--- a/docs/pt/docs/advanced/advanced-dependencies.md
+++ b/docs/pt/docs/advanced/advanced-dependencies.md
@@ -98,7 +98,7 @@ Por exemplo, se você tivesse uma sessão de banco de dados em uma dependência
Esse comportamento foi revertido na versão 0.118.0, para que o código de saída após o `yield` seja executado depois que a resposta for enviada.
-/// info | Informação
+/// note | Nota
Como você verá abaixo, isso é muito semelhante ao comportamento antes da versão 0.106.0, mas com várias melhorias e correções de bugs para casos extremos.
@@ -108,7 +108,7 @@ Como você verá abaixo, isso é muito semelhante ao comportamento antes da vers
Há alguns casos de uso, com condições específicas, que poderiam se beneficiar do comportamento antigo de executar o código de saída das dependências com `yield` antes de enviar a resposta.
-Por exemplo, imagine que você tem código que usa uma sessão de banco de dados em uma dependência com `yield` apenas para verificar um usuário, mas a sessão de banco de dados nunca é usada novamente na *função de operação de rota*, somente na dependência, e a resposta demora a ser enviada, como um `StreamingResponse` que envia dados lentamente, mas por algum motivo não usa o banco de dados.
+Por exemplo, imagine que você tem código que usa uma sessão de banco de dados em uma dependência com `yield` apenas para verificar um usuário, mas a sessão de banco de dados nunca é usada novamente na *função de operação de rota*, somente na dependência, e a response demora a ser enviada, como um `StreamingResponse` que envia dados lentamente, mas por algum motivo não usa o banco de dados.
Nesse caso, a sessão de banco de dados seria mantida até que a resposta termine de ser enviada, mas se você não a usa, então não seria necessário mantê-la.
diff --git a/docs/pt/docs/advanced/custom-response.md b/docs/pt/docs/advanced/custom-response.md
index a360bd3c9..3f8e8461c 100644
--- a/docs/pt/docs/advanced/custom-response.md
+++ b/docs/pt/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@ Para retornar uma resposta com HTML diretamente do **FastAPI**, utilize `HTMLRes
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | Informação
+/// note | Nota
O parâmetro `response_class` também será usado para definir o "media type" da resposta.
@@ -65,7 +65,7 @@ Uma `Response` retornada diretamente em sua *função de operação de rota* nã
///
-/// info | Informação
+/// note | Nota
Obviamente, o cabeçalho `Content-Type`, o código de status, etc, virão do objeto `Response` que você retornou.
diff --git a/docs/pt/docs/advanced/dataclasses.md b/docs/pt/docs/advanced/dataclasses.md
index 9a1f212d6..7956196c7 100644
--- a/docs/pt/docs/advanced/dataclasses.md
+++ b/docs/pt/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ E claro, ele suporta o mesmo:
Isso funciona da mesma forma que com os modelos Pydantic. E na verdade é alcançado da mesma maneira por baixo dos panos, usando Pydantic.
-/// info | Informação
+/// note | Nota
Lembre-se de que dataclasses não podem fazer tudo o que os modelos Pydantic podem fazer.
diff --git a/docs/pt/docs/advanced/events.md b/docs/pt/docs/advanced/events.md
index 7f15d833e..a6262d8da 100644
--- a/docs/pt/docs/advanced/events.md
+++ b/docs/pt/docs/advanced/events.md
@@ -120,7 +120,7 @@ Para adicionar uma função que deve ser executada quando a aplicação estiver
Aqui, a função de manipulador do evento `shutdown` escreverá uma linha de texto `"Application shutdown"` no arquivo `log.txt`.
-/// info | Informação
+/// note | Nota
Na função `open()`, o `mode="a"` significa "acrescentar", então a linha será adicionada depois do que já estiver naquele arquivo, sem sobrescrever o conteúdo anterior.
@@ -152,7 +152,7 @@ Apenas um detalhe técnico para nerds curiosos. 🤓
Por baixo, na especificação técnica do ASGI, isso é parte do [Protocolo Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), e define eventos chamados `startup` e `shutdown`.
-/// info | Informação
+/// note | Nota
Você pode ler mais sobre os manipuladores de `lifespan` do Starlette na [Documentação do Lifespan do Starlette](https://www.starlette.dev/lifespan/).
diff --git a/docs/pt/docs/advanced/generate-clients.md b/docs/pt/docs/advanced/generate-clients.md
index e6279a48b..89f2a89f4 100644
--- a/docs/pt/docs/advanced/generate-clients.md
+++ b/docs/pt/docs/advanced/generate-clients.md
@@ -31,7 +31,6 @@ O patrocínio também demonstra um forte compromisso com a **comunidade** FastAP
Por exemplo, você pode querer experimentar:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
Algumas dessas soluções também podem ser open source ou oferecer planos gratuitos, para que você possa testá-las sem compromisso financeiro. Outros geradores comerciais de SDK estão disponíveis e podem ser encontrados online. 🤓
diff --git a/docs/pt/docs/advanced/openapi-callbacks.md b/docs/pt/docs/advanced/openapi-callbacks.md
index df9e7e0bf..1403425a9 100644
--- a/docs/pt/docs/advanced/openapi-callbacks.md
+++ b/docs/pt/docs/advanced/openapi-callbacks.md
@@ -167,13 +167,13 @@ Perceba como a URL de callback usada contém a URL recebida como um parâmetro d
Nesse ponto você tem a(s) *operação(ões) de rota de callback* necessária(s) (a(s) que o *desenvolvedor externo* deveria implementar na *API externa*) no roteador de callback que você criou acima.
-Agora use o parâmetro `callbacks` no decorador da *operação de rota da sua API* para passar o atributo `.routes` (que é na verdade apenas uma `list` de rotas/*operações de path*) do roteador de callback:
+Agora use o parâmetro `callbacks` no decorador da *operação de rota da sua API* para passar o atributo `.routes` do roteador de callback:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | Dica
-Perceba que você não está passando o roteador em si (`invoices_callback_router`) para `callback=`, mas o atributo `.routes`, como em `invoices_callback_router.routes`.
+Perceba que você não está passando o roteador em si (`invoices_callback_router`) para `callbacks=`, mas o atributo `.routes`, como em `invoices_callback_router.routes`. O FastAPI usará essas rotas para gerar a documentação OpenAPI do callback.
///
diff --git a/docs/pt/docs/advanced/openapi-webhooks.md b/docs/pt/docs/advanced/openapi-webhooks.md
index 0c675089c..0e474c042 100644
--- a/docs/pt/docs/advanced/openapi-webhooks.md
+++ b/docs/pt/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@ Com o **FastAPI**, utilizando o OpenAPI, você pode definir os nomes destes webh
Isto pode facilitar bastante para os seus usuários **implementarem as APIs deles** para receber as requisições dos seus **webhooks**, eles podem inclusive ser capazes de gerar parte do código da API deles.
-/// info | Informação
+/// note | Nota
Webhooks estão disponíveis a partir do OpenAPI 3.1.0, e possui suporte do FastAPI a partir da versão `0.99.0`.
@@ -36,7 +36,7 @@ Quando você cria uma aplicação com o **FastAPI**, existe um atributo chamado
Os webhooks que você define aparecerão no esquema do **OpenAPI** e na **página de documentação** gerada automaticamente.
-/// info | Informação
+/// note | Nota
O objeto `app.webhooks` é na verdade apenas um `APIRouter`, o mesmo tipo que você utilizaria ao estruturar a sua aplicação com diversos arquivos.
diff --git a/docs/pt/docs/advanced/path-operation-advanced-configuration.md b/docs/pt/docs/advanced/path-operation-advanced-configuration.md
index b9862876c..8aca43e08 100644
--- a/docs/pt/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/pt/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@ Você deveria ter certeza que ele é único para cada operação.
### Utilizando o nome da *função de operação de rota* como o operationId { #using-the-path-operation-function-name-as-the-operationid }
-Se você quiser utilizar o nome das funções da sua API como `operationId`s, você pode iterar sobre todos esses nomes e sobrescrever o `operation_id` em cada *operação de rota* utilizando o `APIRoute.name` dela.
+Se você quiser utilizar os nomes das funções da sua API como `operationId`s, você pode passar uma `generate_unique_id_function` personalizada para o `FastAPI`.
-Você deveria fazer isso depois de adicionar todas as suas *operações de rota*.
+A função recebe cada `APIRoute` e retorna o `operationId` a ser usado para aquela operação de rota.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Dica
-
-Se você chamar `app.openapi()` manualmente, você deveria atualizar os `operationId`s antes dessa chamada.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Atenção
diff --git a/docs/pt/docs/advanced/response-directly.md b/docs/pt/docs/advanced/response-directly.md
index 9024897c1..cc1a630c3 100644
--- a/docs/pt/docs/advanced/response-directly.md
+++ b/docs/pt/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@ Normalmente você terá um desempenho muito melhor usando um [Modelo de resposta
Você pode retornar uma `Response` ou qualquer subclasse dela.
-/// info | Informação
+/// note | Nota
A própria `JSONResponse` é uma subclasse de `Response`.
diff --git a/docs/pt/docs/advanced/security/oauth2-scopes.md b/docs/pt/docs/advanced/security/oauth2-scopes.md
index 7ea61ad60..9dfa6aaf6 100644
--- a/docs/pt/docs/advanced/security/oauth2-scopes.md
+++ b/docs/pt/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ Eles são normalmente utilizados para declarar permissões de segurança especí
* `instagram_basic` é utilizado pelo Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` é utilizado pelo Google.
-/// info | Informação
+/// note | Nota
No OAuth2, um "escopo" é apenas uma string que declara uma permissão específica necessária.
diff --git a/docs/pt/docs/advanced/stream-data.md b/docs/pt/docs/advanced/stream-data.md
index 8e0bf08b6..c71d2ca42 100644
--- a/docs/pt/docs/advanced/stream-data.md
+++ b/docs/pt/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@ Se você quer transmitir dados que podem ser estruturados como JSON, você dever
Mas se você quer transmitir dados binários puros ou strings, veja como fazer.
-/// info | Informação
+/// note | Nota
Adicionado no FastAPI 0.134.0.
@@ -90,7 +90,7 @@ Por exemplo, eles não têm `await file.read()`, nem `async for chunk in file`.
E, em muitos casos, lê-los seria uma operação bloqueante (que poderia bloquear o loop de eventos), pois são lidos do disco ou da rede.
-/// info | Informação
+/// note | Nota
O exemplo acima é, na verdade, uma exceção, porque o objeto `io.BytesIO` já está em memória, então lê-lo não bloqueará nada.
diff --git a/docs/pt/docs/advanced/strict-content-type.md b/docs/pt/docs/advanced/strict-content-type.md
index 9530501d4..843caa848 100644
--- a/docs/pt/docs/advanced/strict-content-type.md
+++ b/docs/pt/docs/advanced/strict-content-type.md
@@ -1,6 +1,6 @@
# Verificação Estrita de Content-Type { #strict-content-type-checking }
-Por padrão, o **FastAPI** usa verificação estrita do cabeçalho `Content-Type` para corpos de requisição JSON; isso significa que requisições JSON devem incluir um `Content-Type` válido (por exemplo, `application/json`) para que o corpo seja interpretado como JSON.
+Por padrão, o **FastAPI** usa verificação estrita do cabeçalho `Content-Type` para corpos de requisição JSON; isso significa que requisições JSON **devem** incluir um `Content-Type` válido (por exemplo, `application/json`) para que o corpo seja interpretado como JSON.
## Risco de CSRF { #csrf-risk }
@@ -40,7 +40,7 @@ Observe que ambos têm o mesmo host.
Usando o frontend, você pode fazer o agente de IA executar ações em seu nome.
-Como está em execução localmente e não na Internet aberta, você decide não configurar autenticação, confiando apenas no acesso à rede local.
+Como está em execução **localmente** e não na Internet aberta, você decide **não configurar autenticação**, confiando apenas no acesso à rede local.
Então um de seus usuários poderia instalá-lo e executá-lo localmente.
@@ -69,9 +69,9 @@ Se sua aplicação está na Internet aberta, você não “confiaria na rede”
Atacantes poderiam simplesmente executar um script para enviar requisições à sua API, sem necessidade de interação do navegador, então você provavelmente já está protegendo quaisquer endpoints privilegiados.
-Nesse caso, esse ataque/risco não se aplica a você.
+Nesse caso, **esse ataque/risco não se aplica a você**.
-Esse risco e ataque é relevante principalmente quando a aplicação roda na rede local e essa é a única proteção presumida.
+Esse risco e ataque é relevante principalmente quando a aplicação roda na **rede local** e essa é a **única proteção presumida**.
## Permitindo Requisições sem Content-Type { #allowing-requests-without-content-type }
@@ -81,7 +81,7 @@ Se você precisa dar suporte a clientes que não enviam um cabeçalho `Content-T
Com essa configuração, requisições sem um cabeçalho `Content-Type` terão o corpo interpretado como JSON, o mesmo comportamento das versões mais antigas do FastAPI.
-/// info | Informação
+/// note | Nota
Esse comportamento e configuração foram adicionados no FastAPI 0.132.0.
diff --git a/docs/pt/docs/advanced/websockets.md b/docs/pt/docs/advanced/websockets.md
index 70b2ee853..5367a91be 100644
--- a/docs/pt/docs/advanced/websockets.md
+++ b/docs/pt/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ Eles funcionam da mesma forma que para outros endpoints FastAPI/*operações de
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info | Informação
+/// note | Nota
Como isso é um WebSocket, não faz muito sentido levantar uma `HTTPException`, em vez disso levantamos uma `WebSocketException`.
diff --git a/docs/pt/docs/advanced/wsgi.md b/docs/pt/docs/advanced/wsgi.md
index 110bba053..30e8a3b2c 100644
--- a/docs/pt/docs/advanced/wsgi.md
+++ b/docs/pt/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@ Para isso, você pode utilizar o `WSGIMiddleware` para encapsular a sua aplicaç
## Usando `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | Informação
+/// note | Nota
Isso requer instalar `a2wsgi`, por exemplo com `pip install a2wsgi`.
diff --git a/docs/pt/docs/deployment/docker.md b/docs/pt/docs/deployment/docker.md
index 33e23351f..e14870d7c 100644
--- a/docs/pt/docs/deployment/docker.md
+++ b/docs/pt/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | Informação
+/// note | Nota
Há outros formatos e ferramentas para definir e instalar dependências de pacotes.
@@ -556,7 +556,7 @@ Se você estiver usando contêineres (por exemplo, Docker, Kubernetes), existem
Se você tiver **múltiplos contêineres**, provavelmente cada um executando um **único processo** (por exemplo, em um cluster do **Kubernetes**), então provavelmente você gostaria de ter um **contêiner separado** fazendo o trabalho dos **passos anteriores** em um único contêiner, executando um único processo, **antes** de executar os contêineres workers replicados.
-/// info | Informação
+/// note | Nota
Se você estiver usando o Kubernetes, provavelmente será um [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/).
diff --git a/docs/pt/docs/deployment/fastapicloud.md b/docs/pt/docs/deployment/fastapicloud.md
index 26ec85ac0..0504a444c 100644
--- a/docs/pt/docs/deployment/fastapicloud.md
+++ b/docs/pt/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-Você pode implantar sua aplicação FastAPI no [FastAPI Cloud](https://fastapicloud.com) com um **único comando**; entre na lista de espera, caso ainda não tenha feito isso. 🚀
-
-## Login { #login }
-
-Certifique-se de que você já tem uma conta no **FastAPI Cloud** (nós convidamos você a partir da lista de espera 😉).
-
-Depois, faça login:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## Implantar { #deploy }
-
-Agora, implante sua aplicação, com **um único comando**:
+Você pode implantar sua aplicação FastAPI no [FastAPI Cloud](https://fastapicloud.com) com apenas **um comando**. 🚀
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
+A CLI detectará automaticamente sua aplicação FastAPI e a implantará na nuvem. Se você não estiver autenticado, seu navegador será aberto para concluir o processo de autenticação.
+
É isso! Agora você pode acessar sua aplicação nesse URL. ✨
## Sobre o FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/pt/docs/deployment/manually.md b/docs/pt/docs/deployment/manually.md
index 19ed1a4ab..8f34e37d0 100644
--- a/docs/pt/docs/deployment/manually.md
+++ b/docs/pt/docs/deployment/manually.md
@@ -56,7 +56,6 @@ Existem diversas alternativas, incluindo:
* [Hypercorn](https://hypercorn.readthedocs.io/): um servidor ASGI compatível com HTTP/2, Trio e outros recursos.
* [Daphne](https://github.com/django/daphne): servidor ASGI construído para Django Channels.
* [Granian](https://github.com/emmett-framework/granian): um servidor HTTP Rust para aplicações Python.
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit é um runtime de aplicação web leve e versátil.
## Máquina Servidora e Programa Servidor { #server-machine-and-server-program }
diff --git a/docs/pt/docs/deployment/server-workers.md b/docs/pt/docs/deployment/server-workers.md
index 98c1877c2..4d70de966 100644
--- a/docs/pt/docs/deployment/server-workers.md
+++ b/docs/pt/docs/deployment/server-workers.md
@@ -17,7 +17,7 @@ Como você viu no capítulo anterior sobre [Conceitos de implantação](concepts
Aqui mostrarei como usar o **Uvicorn** com **processos de trabalho** usando o comando `fastapi` ou o comando `uvicorn` diretamente.
-/// info | Informação
+/// note | Nota
Se você estiver usando contêineres, por exemplo com Docker ou Kubernetes, falarei mais sobre isso no próximo capítulo: [FastAPI em contêineres - Docker](docker.md).
diff --git a/docs/pt/docs/how-to/extending-openapi.md b/docs/pt/docs/how-to/extending-openapi.md
index 23737e5fa..86b53acee 100644
--- a/docs/pt/docs/how-to/extending-openapi.md
+++ b/docs/pt/docs/how-to/extending-openapi.md
@@ -25,9 +25,17 @@ E essa função `get_openapi()` recebe como parâmetros:
* `openapi_version`: A versão da especificação OpenAPI utilizada. Por padrão, a mais recente: `3.1.0`.
* `summary`: Um resumo curto da API.
* `description`: A descrição da sua API, que pode incluir markdown e será exibida na documentação.
-* `routes`: Uma lista de rotas, que são cada uma das *operações de rota* registradas. Elas são obtidas de `app.routes`.
+* `routes`: As rotas da aplicação, obtidas de `app.routes`. O FastAPI as usa para coletar as *operações de rota* registradas, incluindo as dos routers incluídos.
-/// info | Informação
+/// tip | Detalhes Técnicos
+
+`app.routes` é uma árvore de rotas de baixo nível. Ela pode incluir rotas candidatas que o FastAPI usa internamente para routers incluídos, não apenas objetos finais `APIRoute`.
+
+Você ainda pode passar `app.routes` para `get_openapi()`. O FastAPI vai percorrer essa árvore de rotas para coletar as operações de rota efetivas.
+
+///
+
+/// note | Nota
O parâmetro `summary` está disponível no OpenAPI 3.1.0 e superior, suportado pelo FastAPI 0.99.0 e superior.
diff --git a/docs/pt/docs/how-to/separate-openapi-schemas.md b/docs/pt/docs/how-to/separate-openapi-schemas.md
index f757025a0..3fe9ea719 100644
--- a/docs/pt/docs/how-to/separate-openapi-schemas.md
+++ b/docs/pt/docs/how-to/separate-openapi-schemas.md
@@ -38,7 +38,7 @@ Mas se você usar o mesmo modelo como saída, como aqui:
### Modelo para Dados de Resposta de Saída { #model-for-output-response-data }
-Se você interagir com a documentação e verificar a resposta, mesmo que o código não tenha adicionado nada em um dos campos `description`, a resposta JSON contém o valor padrão (`null`):
+Se você interagir com a documentação e verificar a resposta, mesmo que o código não tenha adicionado nada em um dos campos `description`, a response JSON contém o valor padrão (`null`):

@@ -81,11 +81,11 @@ Com esse recurso do **Pydantic v2**, sua documentação da API fica mais **preci
Agora, há alguns casos em que você pode querer ter o **mesmo esquema para entrada e saída**.
-Provavelmente, o principal caso de uso para isso é se você já tem algum código de cliente/SDK gerado automaticamente e não quer atualizar todo o código de cliente/SDK gerado ainda, você provavelmente vai querer fazer isso em algum momento, mas talvez não agora.
+Provavelmente, o principal caso de uso para isso é se você já tem algum código de cliente/SDKs gerado automaticamente e não quer atualizar todo o código de cliente/SDKs gerado ainda, você provavelmente vai querer fazer isso em algum momento, mas talvez não agora.
Nesse caso, você pode desativar esse recurso no **FastAPI**, com o parâmetro `separate_input_output_schemas=False`.
-/// info | Informação
+/// note | Nota
O suporte para `separate_input_output_schemas` foi adicionado no FastAPI `0.102.0`. 🤓
diff --git a/docs/pt/docs/index.md b/docs/pt/docs/index.md
index 6f54cd6dc..2f12317c3 100644
--- a/docs/pt/docs/index.md
+++ b/docs/pt/docs/index.md
@@ -469,7 +469,7 @@ Experimente mudar a seguinte linha:
... "item_price": item.price ...
```
-...e veja como seu editor irá auto-completar os atributos e saberá os tipos:
+...e veja como seu editor irá autocompletar os atributos e saberá os tipos:

@@ -492,9 +492,7 @@ Para um exemplo mais completo incluindo mais recursos, veja o
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+A CLI detectará automaticamente sua aplicação FastAPI e a implantará na nuvem. Se você não estiver autenticado, o navegador será aberto para concluir o processo de autenticação.
+
É isso! Agora você pode acessar sua aplicação nesse URL. ✨
#### Sobre a FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/pt/docs/tutorial/bigger-applications.md b/docs/pt/docs/tutorial/bigger-applications.md
index 3832f94ff..263145c49 100644
--- a/docs/pt/docs/tutorial/bigger-applications.md
+++ b/docs/pt/docs/tutorial/bigger-applications.md
@@ -382,11 +382,11 @@ Agora, vamos incluir os `router`s dos submódulos `users` e `items`:
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *}
-/// note | Nota
+/// note | Detalhes Técnicos
-`users.router` contém o `APIRouter` dentro do arquivo `app/routers/users.py`.
+O FastAPI mantém o `APIRouter` original e seus `APIRoute`s ativos quando o router é incluído na aplicação principal.
-E `items.router` contém o `APIRouter` dentro do arquivo `app/routers/items.py`.
+Isso significa que subclasses personalizadas de `APIRouter` e `APIRoute` ainda podem participar depois que o router é incluído.
///
@@ -394,19 +394,11 @@ Com `app.include_router()` podemos adicionar cada `APIRouter` ao aplicativo prin
Ele incluirá todas as rotas daquele router como parte dele.
-/// note | Detalhes Técnicos
-
-Na verdade, ele criará internamente uma *operação de rota* para cada *operação de rota* que foi declarada no `APIRouter`.
-
-Então, nos bastidores, ele realmente funcionará como se tudo fosse o mesmo aplicativo único.
-
-///
-
/// tip | Dica
Você não precisa se preocupar com desempenho ao incluir routers.
-Isso levará microssegundos e só acontecerá na inicialização.
+Isso foi projetado para ser leve e evitar adicionar overhead a cada request.
Então não afetará o desempenho. ⚡
@@ -461,7 +453,7 @@ Os `APIRouter`s não são "montados", eles não são isolados do resto do aplica
Isso ocorre porque queremos incluir suas *operações de rota* no esquema OpenAPI e nas interfaces de usuário.
-Como não podemos simplesmente isolá-los e "montá-los" independentemente do resto, as *operações de rota* são "clonadas" (recriadas), não incluídas diretamente.
+O FastAPI mantém os routers e as operações de rota originais ativos e combina os prefixos, dependências, tags, responses e outros metadados do router ao tratar as requisições e gerar o OpenAPI.
///
@@ -532,4 +524,16 @@ Da mesma forma que você pode incluir um `APIRouter` em uma aplicação `FastAPI
router.include_router(other_router)
```
-Certifique-se de fazer isso antes de incluir `router` na aplicação `FastAPI`, para que as *operações de rota* de `other_router` também sejam incluídas.
+Você pode fazer isso antes ou depois de incluir o `router` na aplicação `FastAPI`. O FastAPI ainda incluirá as *operações de rota* de `other_router` no roteamento e no OpenAPI.
+
+O mesmo vale para *operações de rota* adicionadas depois aos routers. Elas também ficarão visíveis por meio da inclusão anterior.
+
+/// warning | Detalhes Técnicos
+
+Evite mutar diretamente `router.routes` após incluir um router. O FastAPI trata a inclusão de routers como algo ativo, então o router original e suas rotas permanecem parte do roteamento e da geração do OpenAPI.
+
+Use APIs documentadas como os decoradores de operações de rota e `.include_router()` para adicionar rotas e routers.
+
+Trate `router.routes` como uma árvore de rotas de nível mais baixo que pode conter definições de rotas e routers incluídos, e evite depender dela como uma lista plana de operações de rota finais.
+
+///
diff --git a/docs/pt/docs/tutorial/body-multiple-params.md b/docs/pt/docs/tutorial/body-multiple-params.md
index 828cde633..8620c9e20 100644
--- a/docs/pt/docs/tutorial/body-multiple-params.md
+++ b/docs/pt/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ Por exemplo:
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Informação
+/// note | Nota
`Body` também possui todas as validações adicionais e metadados de parâmetros como em `Query`,`Path` e outras que você verá depois.
@@ -123,7 +123,7 @@ Por padrão, o **FastAPI** esperará que seu conteúdo venha no corpo diretament
Mas se você quiser que ele espere por um JSON com uma chave `item` e dentro dele os conteúdos do modelo, como ocorre ao declarar vários parâmetros de corpo, você pode usar o parâmetro especial de `Body` chamado `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
como em:
diff --git a/docs/pt/docs/tutorial/body-nested-models.md b/docs/pt/docs/tutorial/body-nested-models.md
index 343f94997..310caf972 100644
--- a/docs/pt/docs/tutorial/body-nested-models.md
+++ b/docs/pt/docs/tutorial/body-nested-models.md
@@ -136,7 +136,7 @@ Isso vai esperar (converter, validar, documentar, etc) um corpo JSON tal qual:
}
```
-/// info | Informação
+/// note | Nota
Observe como a chave `images` agora tem uma lista de objetos de imagem.
@@ -148,7 +148,7 @@ Você pode definir modelos profundamente aninhados de forma arbitrária:
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Informação
+/// note | Nota
Observe como `Offer` tem uma lista de `Item`s, que por sua vez têm uma lista opcional de `Image`s
diff --git a/docs/pt/docs/tutorial/body.md b/docs/pt/docs/tutorial/body.md
index 926de84fa..afd652efc 100644
--- a/docs/pt/docs/tutorial/body.md
+++ b/docs/pt/docs/tutorial/body.md
@@ -8,7 +8,7 @@ Sua API quase sempre precisa enviar um corpo na **resposta**. Mas os clientes n
Para declarar um corpo da **requisição**, você utiliza os modelos do [Pydantic](https://docs.pydantic.dev/) com todos os seus poderes e benefícios.
-/// info | Informação
+/// note | Nota
Para enviar dados, você deveria usar um dos: `POST` (o mais comum), `PUT`, `DELETE` ou `PATCH`.
diff --git a/docs/pt/docs/tutorial/cookie-param-models.md b/docs/pt/docs/tutorial/cookie-param-models.md
index f125314c8..b59915979 100644
--- a/docs/pt/docs/tutorial/cookie-param-models.md
+++ b/docs/pt/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@ Você pode ver os cookies definidos na IU da documentação em `/docs`:
-/// info | Informação
+/// note | Nota
Tenha em mente que, como os **navegadores lidam com cookies** de maneira especial e por baixo dos panos, eles **não** permitem facilmente que o **JavaScript** lidem com eles.
diff --git a/docs/pt/docs/tutorial/cookie-params.md b/docs/pt/docs/tutorial/cookie-params.md
index 5540a67d2..0bf011f80 100644
--- a/docs/pt/docs/tutorial/cookie-params.md
+++ b/docs/pt/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@ Mas lembre-se que quando você importa `Query`, `Path`, `Cookie` e outras de `fa
///
-/// info | Informação
+/// note | Nota
Para declarar cookies, você precisa usar `Cookie`, pois caso contrário, os parâmetros seriam interpretados como parâmetros de consulta.
///
-/// info | Informação
+/// note | Nota
Tenha em mente que, como os **navegadores lidam com cookies** de maneiras especiais e nos bastidores, eles **não** permitem facilmente que o **JavaScript** os acesse.
diff --git a/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index 05742c8e0..14c1f5cd3 100644
--- a/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@ Isso também pode ser útil para evitar confundir novos desenvolvedores que ao v
///
-/// info | Informação
+/// note | Nota
Neste exemplo utilizamos cabeçalhos personalizados inventados `X-Key` e `X-Token`.
diff --git a/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md
index 3e4a31d6f..d2eaaed57 100644
--- a/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -121,7 +121,7 @@ Se você capturar uma exceção com `except` em uma dependência que utilize `yi
Neste caso, o cliente irá ver uma resposta *HTTP 500 Internal Server Error* como deveria acontecer, já que não estamos levantando nenhuma `HTTPException` ou coisa parecida, mas o servidor **não terá nenhum log** ou qualquer outra indicação de qual foi o erro. 😱
-### Sempre levante (`raise`) em Dependências com `yield` e `except` { #always-raise-in-dependencies-with-yield-and-except }
+### Sempre `raise` em Dependências com `yield` e `except` { #always-raise-in-dependencies-with-yield-and-except }
Se você capturar uma exceção em uma dependência com `yield`, a menos que você esteja levantando outra `HTTPException` ou coisa parecida, **você deve relançar a exceção original**.
@@ -170,7 +170,7 @@ participant tasks as Tarefas de Background
end
```
-/// info | Informação
+/// note | Nota
Apenas **uma resposta** será enviada para o cliente. Ela pode ser uma das respostas de erro, ou então a resposta da *operação de rota*.
diff --git a/docs/pt/docs/tutorial/dependencies/index.md b/docs/pt/docs/tutorial/dependencies/index.md
index baea97f7f..47ec09e1f 100644
--- a/docs/pt/docs/tutorial/dependencies/index.md
+++ b/docs/pt/docs/tutorial/dependencies/index.md
@@ -51,7 +51,7 @@ Neste caso, a dependência espera por:
E então retorna um `dict` contendo esses valores.
-/// info | Informação
+/// note | Nota
FastAPI passou a suportar a notação `Annotated` (e começou a recomendá-la) na versão 0.95.0.
@@ -106,7 +106,7 @@ common_parameters --> read_users
Assim, você escreve um código compartilhado apenas uma vez e o **FastAPI** se encarrega de chamá-lo em suas *operações de rota*.
-/// check | Verifique
+/// tip | Dica
Perceba que você não precisa criar uma classe especial e enviar a dependência para algum outro lugar em que o **FastAPI** a "registre" ou realize qualquer operação similar.
@@ -136,7 +136,7 @@ Mas como o **FastAPI** se baseia em convenções do Python, incluindo `Annotated
///
-As dependências continuarão funcionando como esperado, e a **melhor parte** é que a **informação sobre o tipo é preservada**, o que signfica que seu editor de texto ainda irá incluir **preenchimento automático**, **visualização de erros**, etc. O mesmo vale para ferramentas como `mypy`.
+As dependências continuarão funcionando como esperado, e a **melhor parte** é que a **informação sobre o tipo é preservada**, o que significa que seu editor de texto ainda irá incluir **preenchimento automático**, **erros em linha**, etc. O mesmo vale para ferramentas como `mypy`.
Isso é especialmente útil para uma **base de código grande** onde **as mesmas dependências** são utilizadas repetidamente em **muitas *operações de rota***.
@@ -152,7 +152,7 @@ Não faz diferença. O **FastAPI** sabe o que fazer.
/// note | Nota
-Caso você não conheça, veja em [Async: *"Com Pressa?"*](../../async.md#in-a-hurry) a sessão acerca de `async` e `await` na documentação.
+Caso você não conheça, veja em [Async: *"Com Pressa?"*](../../async.md#in-a-hurry) a seção acerca de `async` e `await` na documentação.
///
diff --git a/docs/pt/docs/tutorial/dependencies/sub-dependencies.md b/docs/pt/docs/tutorial/dependencies/sub-dependencies.md
index 63ed0e48a..da49f3b5b 100644
--- a/docs/pt/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/pt/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@ Então podemos utilizar a dependência com:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | Informação
+/// note | Nota
Perceba que nós estamos declarando apenas uma dependência na *função de operação de rota*, em `query_or_cookie_extractor`.
diff --git a/docs/pt/docs/tutorial/first-steps.md b/docs/pt/docs/tutorial/first-steps.md
index 719a38c20..1a829a08c 100644
--- a/docs/pt/docs/tutorial/first-steps.md
+++ b/docs/pt/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ o que seria equivalente a:
from backend.main import app
```
-### `fastapi dev` com path { #fastapi-dev-with-path }
+### `fastapi dev` com path ou com a opção de CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
Você também pode passar o path do arquivo para o comando `fastapi dev`, e ele vai deduzir o objeto de aplicação FastAPI a ser usado:
@@ -188,29 +188,19 @@ Você também pode passar o path do arquivo para o comando `fastapi dev`, e ele
$ fastapi dev main.py
```
-Mas você teria que lembrar de passar o path correto toda vez que chamar o comando `fastapi`.
-
-Além disso, outras ferramentas podem não conseguir encontrá-la, por exemplo, a [Extensão do VS Code](../editor-support.md) ou a [FastAPI Cloud](https://fastapicloud.com), então é recomendado usar o `entrypoint` no `pyproject.toml`.
-
-### Faça o deploy da sua aplicação (opcional) { #deploy-your-app-optional }
-
-Você pode, opcionalmente, fazer o deploy da sua aplicação FastAPI na [FastAPI Cloud](https://fastapicloud.com); acesse e entre na lista de espera, se ainda não entrou. 🚀
-
-Se você já tem uma conta na **FastAPI Cloud** (nós convidamos você da lista de espera 😉), pode fazer o deploy da sua aplicação com um único comando.
-
-Antes do deploy, certifique-se de que está autenticado:
-
-
+Ou você também pode passar a opção `--entrypoint` para o comando `fastapi dev`:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+Mas você teria que lembrar de passar o path\entrypoint correto toda vez que chamar o comando `fastapi`.
+
+Além disso, outras ferramentas podem não conseguir encontrá-la, por exemplo, a [Extensão do VS Code](../editor-support.md) ou a [FastAPI Cloud](https://fastapicloud.com), então é recomendado usar o `entrypoint` no `pyproject.toml`.
-Em seguida, faça o deploy da sua aplicação:
+### Faça o deploy da sua aplicação (opcional) { #deploy-your-app-optional }
+
+Você pode, opcionalmente, fazer o deploy da sua aplicação FastAPI na [FastAPI Cloud](https://fastapicloud.com) com um único comando. 🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+A CLI detectará automaticamente sua aplicação FastAPI e a fará o deploy na nuvem. Se você não estiver autenticado, o seu navegador será aberto para concluir o processo de autenticação.
+
É isso! Agora você pode acessar sua aplicação nessa URL. ✨
## Recapitulando, passo a passo { #recap-step-by-step }
@@ -270,7 +262,7 @@ https://example.com/items/foo
/items/foo
```
-/// info | Informação
+/// note | Nota
Um "path" também é comumente chamado de "endpoint" ou de "rota".
@@ -322,7 +314,7 @@ O `@app.get("/")` diz ao **FastAPI** que a função logo abaixo é responsável
* o path `/`
* usando uma get operação
-/// info | Informações sobre `@decorator`
+/// note | Informações sobre `@decorator`
Essa sintaxe `@alguma_coisa` em Python é chamada de "decorador".
diff --git a/docs/pt/docs/tutorial/metadata.md b/docs/pt/docs/tutorial/metadata.md
index 3d9610978..022e622ca 100644
--- a/docs/pt/docs/tutorial/metadata.md
+++ b/docs/pt/docs/tutorial/metadata.md
@@ -74,7 +74,7 @@ Use o parâmetro `tags` com suas *operações de rota* (e `APIRouter`s) para atr
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | Informação
+/// note | Nota
Leia mais sobre tags em [Configuração de operação de rota](path-operation-configuration.md#tags).
diff --git a/docs/pt/docs/tutorial/path-operation-configuration.md b/docs/pt/docs/tutorial/path-operation-configuration.md
index 745b9b698..3559667bd 100644
--- a/docs/pt/docs/tutorial/path-operation-configuration.md
+++ b/docs/pt/docs/tutorial/path-operation-configuration.md
@@ -72,13 +72,13 @@ Você pode especificar a descrição da resposta com o parâmetro `response_desc
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Informação
+/// note | Nota
-Note que `response_description` se refere especificamente à resposta, a `description` se refere à *operação de rota* em geral.
+Observe que `response_description` se refere especificamente à resposta, a `description` se refere à *operação de rota* em geral.
///
-/// check | Verifique
+/// tip | Dica
OpenAPI especifica que cada *operação de rota* requer uma descrição de resposta.
diff --git a/docs/pt/docs/tutorial/path-params-numeric-validations.md b/docs/pt/docs/tutorial/path-params-numeric-validations.md
index 9bbe14c75..0a48c09e4 100644
--- a/docs/pt/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/pt/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@ Primeiro, importe `Path` de `fastapi`, e importe `Annotated`:
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Informação
+/// note | Nota
O FastAPI adicionou suporte a `Annotated` (e passou a recomendá-lo) na versão 0.95.0.
@@ -131,7 +131,7 @@ E você também pode declarar validações numéricas:
* `lt`: menor que (`l`ess `t`han)
* `le`: menor que ou igual (`l`ess than or `e`qual)
-/// info | Informação
+/// note | Nota
`Query`, `Path` e outras classes que você verá depois são subclasses de uma classe comum `Param`.
diff --git a/docs/pt/docs/tutorial/path-params.md b/docs/pt/docs/tutorial/path-params.md
index ea9af63f3..30251970d 100644
--- a/docs/pt/docs/tutorial/path-params.md
+++ b/docs/pt/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@ Você pode declarar o tipo de um parâmetro de path na função, usando as anota
Neste caso, `item_id` é declarado como um `int`.
-/// check | Verifique
+/// tip | Dica
Isso fornecerá suporte do editor dentro da sua função, com verificações de erros, preenchimento automático, etc.
///
@@ -32,7 +32,7 @@ Se você executar este exemplo e abrir seu navegador em [http://127.0.0.1:8000/i
{"item_id":3}
```
-/// check | Verifique
+/// tip | Dica
Perceba que o valor que sua função recebeu (e retornou) é `3`, como um `int` do Python, não uma string `"3"`.
Então, com essa declaração de tipo, o **FastAPI** fornece "parsing" automático do request.
@@ -62,7 +62,7 @@ porque o parâmetro de path `item_id` tinha o valor `"foo"`, que não é um `int
O mesmo erro apareceria se você fornecesse um `float` em vez de um `int`, como em: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Verifique
+/// tip | Dica
Então, com a mesma declaração de tipo do Python, o **FastAPI** fornece validação de dados.
Observe que o erro também declara claramente exatamente o ponto onde a validação não passou.
@@ -76,7 +76,7 @@ E quando você abrir seu navegador em [http://127.0.0.1:8000/docs](http://127.0.
-/// check | Verifique
+/// tip | Dica
Novamente, apenas com a mesma declaração de tipo do Python, o **FastAPI** fornece documentação automática e interativa (integrando o Swagger UI).
Observe que o parâmetro de path está declarado como um inteiro.
diff --git a/docs/pt/docs/tutorial/query-params-str-validations.md b/docs/pt/docs/tutorial/query-params-str-validations.md
index 5ee41684a..fe703c624 100644
--- a/docs/pt/docs/tutorial/query-params-str-validations.md
+++ b/docs/pt/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ Para isso, primeiro importe:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Informação
+/// note | Nota
O FastAPI adicionou suporte a `Annotated` (e passou a recomendá-lo) na versão 0.95.0.
@@ -298,7 +298,7 @@ Você também pode usar `list` diretamente em vez de `list[str]`:
Tenha em mente que, neste caso, o FastAPI não verificará o conteúdo da lista.
-Por exemplo, `list[int]` verificaria (and documentaria) que os conteúdos da lista são inteiros. Mas `list` sozinho não.
+Por exemplo, `list[int]` verificaria (e documentaria) que os conteúdos da lista são inteiros. Mas `list` sozinho não.
///
@@ -382,7 +382,7 @@ Por exemplo, este validador personalizado verifica se o ID do item começa com `
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Informação
+/// note | Nota
Isso está disponível com a versão 2 do Pydantic ou superior. 😎
@@ -414,7 +414,7 @@ Percebeu? Uma string usando `value.startswith()` pode receber uma tupla, e verif
Com `data.items()` obtemos um objeto iterável com tuplas contendo a chave e o valor de cada item do dicionário.
-Convertimos esse objeto iterável em uma `list` adequada com `list(data.items())`.
+Convertemos esse objeto iterável em uma `list` adequada com `list(data.items())`.
Em seguida, com `random.choice()` podemos obter um valor aleatório da lista, então obtemos uma tupla com `(id, name)`. Será algo como `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
diff --git a/docs/pt/docs/tutorial/query-params.md b/docs/pt/docs/tutorial/query-params.md
index 472c12be6..d64e2dc64 100644
--- a/docs/pt/docs/tutorial/query-params.md
+++ b/docs/pt/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ Da mesma forma, você pode declarar parâmetros de consulta opcionais, definindo
Nesse caso, o parâmetro da função `q` será opcional, e `None` será o padrão.
-/// check | Verifique
+/// tip | Dica
Você também pode notar que o **FastAPI** é esperto o suficiente para perceber que o parâmetro da rota `item_id` é um parâmetro da rota, e `q` não é, portanto, `q` é o parâmetro de consulta.
diff --git a/docs/pt/docs/tutorial/request-files.md b/docs/pt/docs/tutorial/request-files.md
index 912878cd5..72069c268 100644
--- a/docs/pt/docs/tutorial/request-files.md
+++ b/docs/pt/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Você pode definir arquivos para serem enviados pelo cliente usando `File`.
-/// info | Informação
+/// note | Nota
Para receber arquivos enviados, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ Crie parâmetros de arquivo da mesma forma que você faria para `Body` ou `Form`
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Informação
+/// note | Nota
`File` é uma classe que herda diretamente de `Form`.
diff --git a/docs/pt/docs/tutorial/request-form-models.md b/docs/pt/docs/tutorial/request-form-models.md
index 953c3fdce..8e265d6ad 100644
--- a/docs/pt/docs/tutorial/request-form-models.md
+++ b/docs/pt/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Você pode utilizar **Modelos Pydantic** para declarar **campos de formulários** no FastAPI.
-/// info | Informação
+/// note | Nota
Para utilizar formulários, instale primeiramente o [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ Você precisa apenas declarar um **modelo Pydantic** com os campos que deseja re
O **FastAPI** irá **extrair** as informações para **cada campo** dos **dados do formulário** na requisição e dar para você o modelo Pydantic que você definiu.
-## Confira os Documentos { #check-the-docs }
+## Confira a Documentação { #check-the-docs }
Você pode verificar na UI de documentação em `/docs`:
diff --git a/docs/pt/docs/tutorial/request-forms-and-files.md b/docs/pt/docs/tutorial/request-forms-and-files.md
index 04d7f9a4e..45d6f5c2c 100644
--- a/docs/pt/docs/tutorial/request-forms-and-files.md
+++ b/docs/pt/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Você pode definir arquivos e campos de formulário ao mesmo tempo usando `File` e `Form`.
-/// info | Informação
+/// note | Nota
Para receber arquivos carregados e/ou dados de formulário, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/pt/docs/tutorial/request-forms.md b/docs/pt/docs/tutorial/request-forms.md
index 5b7c4d809..d99c51650 100644
--- a/docs/pt/docs/tutorial/request-forms.md
+++ b/docs/pt/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
Quando você precisar receber campos de formulário em vez de JSON, você pode usar `Form`.
-/// info | Informação
+/// note | Nota
Para usar formulários, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -32,7 +32,7 @@ A especificação exige que os campos sejam e
Com `Form` você pode declarar as mesmas configurações que com `Body` (e `Query`, `Path`, `Cookie`), incluindo validação, exemplos, um alias (por exemplo, `user-name` em vez de `username`), etc.
-/// info | Informação
+/// note | Nota
`Form` é uma classe que herda diretamente de `Body`.
diff --git a/docs/pt/docs/tutorial/response-model.md b/docs/pt/docs/tutorial/response-model.md
index 7a28bcecd..1753f9dae 100644
--- a/docs/pt/docs/tutorial/response-model.md
+++ b/docs/pt/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ Aqui estamos declarando um modelo `UserIn`, ele conterá uma senha em texto simp
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Informação
+/// note | Nota
Para usar `EmailStr`, primeiro instale [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -251,7 +251,7 @@ Então, se você enviar uma solicitação para essa *operação de rota* para o
}
```
-/// info | Informação
+/// note | Nota
Você também pode usar:
diff --git a/docs/pt/docs/tutorial/response-status-code.md b/docs/pt/docs/tutorial/response-status-code.md
index d5a81fa03..f02aeb0b4 100644
--- a/docs/pt/docs/tutorial/response-status-code.md
+++ b/docs/pt/docs/tutorial/response-status-code.md
@@ -18,7 +18,7 @@ Observe que `status_code` é um parâmetro do método "decorador" (`get`, `post`
O parâmetro `status_code` recebe um número com o código de status HTTP.
-/// info | Informação
+/// note | Nota
`status_code` também pode receber um `IntEnum`, como [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) do Python.
diff --git a/docs/pt/docs/tutorial/schema-extra-example.md b/docs/pt/docs/tutorial/schema-extra-example.md
index cd2ac13c5..2feeb5438 100644
--- a/docs/pt/docs/tutorial/schema-extra-example.md
+++ b/docs/pt/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@ Por exemplo, você poderia usá-la para adicionar metadados para uma interface d
///
-/// info | Informação
+/// note | Nota
O OpenAPI 3.1.0 (usado desde o FastAPI 0.99.0) adicionou suporte a `examples`, que faz parte do padrão **JSON Schema**.
@@ -155,7 +155,7 @@ O OpenAPI também adicionou os campos `example` e `examples` a outras partes da
* `File()`
* `Form()`
-/// info | Informação
+/// note | Nota
Esse parâmetro antigo `examples` específico do OpenAPI agora é `openapi_examples` desde o FastAPI `0.103.0`.
@@ -171,7 +171,7 @@ E agora esse novo campo `examples` tem precedência sobre o antigo campo único
Esse novo campo `examples` no JSON Schema é **apenas uma `list`** de exemplos, não um dict com metadados extras como nos outros lugares do OpenAPI (descritos acima).
-/// info | Informação
+/// note | Nota
Mesmo após o lançamento do OpenAPI 3.1.0 com essa nova integração mais simples com o JSON Schema, por um tempo o Swagger UI, a ferramenta que fornece a documentação automática, não suportava OpenAPI 3.1.0 (passou a suportar desde a versão 5.0.0 🎉).
diff --git a/docs/pt/docs/tutorial/security/first-steps.md b/docs/pt/docs/tutorial/security/first-steps.md
index d16c15140..fe5b4e704 100644
--- a/docs/pt/docs/tutorial/security/first-steps.md
+++ b/docs/pt/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@ Copie o exemplo em um arquivo `main.py`:
## Execute-o { #run-it }
-/// info | Informação
+/// note | Nota
O pacote [`python-multipart`](https://github.com/Kludex/python-multipart) é instalado automaticamente com o **FastAPI** quando você executa o comando `pip install "fastapi[standard]"`.
@@ -60,7 +60,7 @@ Você verá algo deste tipo:
-/// check | Botão Autorizar!
+/// tip | Botão Autorizar!
Você já tem um novo botão 'Authorize'.
@@ -118,7 +118,7 @@ O **FastAPI** fornece várias ferramentas, em diferentes níveis de abstração,
Neste exemplo, vamos usar **OAuth2**, com o fluxo **Password**, usando um token **Bearer**. Fazemos isso usando a classe `OAuth2PasswordBearer`.
-/// info | Informação
+/// note | Nota
Um token "bearer" não é a única opção.
@@ -148,7 +148,7 @@ Esse parâmetro não cria aquele endpoint/operação de rota, mas declara que a
Em breve também criaremos a operação de rota real.
-/// info | Informação
+/// note | Nota
Se você é um "Pythonista" muito rigoroso, pode não gostar do estilo do nome do parâmetro `tokenUrl` em vez de `token_url`.
@@ -176,7 +176,7 @@ Essa dependência fornecerá uma `str` que é atribuída ao parâmetro `token` d
O **FastAPI** saberá que pode usar essa dependência para definir um "esquema de segurança" no esquema OpenAPI (e na documentação automática da API).
-/// info | Detalhes Técnicos
+/// note | Detalhes Técnicos
O **FastAPI** saberá que pode usar a classe `OAuth2PasswordBearer` (declarada em uma dependência) para definir o esquema de segurança no OpenAPI porque ela herda de `fastapi.security.oauth2.OAuth2`, que por sua vez herda de `fastapi.security.base.SecurityBase`.
diff --git a/docs/pt/docs/tutorial/security/get-current-user.md b/docs/pt/docs/tutorial/security/get-current-user.md
index 4c6397c31..2c505f148 100644
--- a/docs/pt/docs/tutorial/security/get-current-user.md
+++ b/docs/pt/docs/tutorial/security/get-current-user.md
@@ -18,7 +18,7 @@ Da mesma forma que usamos o Pydantic para declarar corpos, podemos usá-lo em qu
## Criar uma dependência `get_current_user` { #create-a-get-current-user-dependency }
-Vamos criar uma dependência chamada `get_current_user`.
+Vamos criar uma dependência `get_current_user`.
Lembra que as dependências podem ter subdependências?
@@ -52,7 +52,7 @@ Aqui, o **FastAPI** não ficará confuso porque você está usando `Depends`.
///
-/// check | Verifique
+/// tip | Dica
A forma como esse sistema de dependências foi projetado nos permite ter diferentes dependências (diferentes "dependables") que retornam um modelo `User`.
diff --git a/docs/pt/docs/tutorial/security/oauth2-jwt.md b/docs/pt/docs/tutorial/security/oauth2-jwt.md
index 6397664fb..a571b799d 100644
--- a/docs/pt/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/pt/docs/tutorial/security/oauth2-jwt.md
@@ -42,9 +42,9 @@ $ pip install pyjwt
-/// info | Informação
+/// note | Nota
-Se você pretente utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, você deve instalar a dependência da biblioteca de criptografia `pyjwt[crypto]`.
+Se você pretende utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, você deve instalar a dependência da biblioteca de criptografia `pyjwt[crypto]`.
Você pode ler mais sobre isso na [documentação de instalação do PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html).
@@ -213,7 +213,7 @@ Usando as credenciais:
Username: `johndoe`
Password: `secret`
-/// check | Verifique
+/// tip | Dica
Observe que em nenhuma parte do código está a senha em texto puro "`secret`", nós temos apenas o hash.
diff --git a/docs/pt/docs/tutorial/security/simple-oauth2.md b/docs/pt/docs/tutorial/security/simple-oauth2.md
index f582a8141..fdfe21a26 100644
--- a/docs/pt/docs/tutorial/security/simple-oauth2.md
+++ b/docs/pt/docs/tutorial/security/simple-oauth2.md
@@ -4,7 +4,7 @@ Agora vamos construir a partir do capítulo anterior e adicionar as partes que f
## Obtenha o `username` e a `password` { #get-the-username-and-password }
-É utilizado o utils de segurança da **FastAPI** para obter o `username` e a `password`.
+Vamos usar os utilitários de segurança da **FastAPI** para obter o `username` e a `password`.
OAuth2 especifica que ao usar o "password flow" (fluxo de senha), que estamos usando, o cliente/usuário deve enviar os campos `username` e `password` como dados do formulário.
@@ -32,7 +32,7 @@ Normalmente são usados para declarar permissões de segurança específicas, po
* `instagram_basic` é usado pelo Facebook e Instagram.
* `https://www.googleapis.com/auth/drive` é usado pelo Google.
-/// info | Informação
+/// note | Nota
No OAuth2, um "scope" é apenas uma string que declara uma permissão específica necessária.
@@ -72,7 +72,7 @@ Se você precisar aplicá-lo, use `OAuth2PasswordRequestFormStrict` em vez de `O
* Um `client_id` opcional (não precisamos dele em nosso exemplo).
* Um `client_secret` opcional (não precisamos dele em nosso exemplo).
-/// info | Informação
+/// note | Nota
O `OAuth2PasswordRequestForm` não é uma classe especial para **FastAPI** como é `OAuth2PasswordBearer`.
@@ -144,8 +144,7 @@ UserInDB(
)
```
-
-/// info | Informação
+/// note | Nota
Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-dict).
@@ -173,7 +172,7 @@ Mas, por enquanto, vamos nos concentrar nos detalhes específicos de que precisa
/// tip | Dica
-Pela especificação, você deve retornar um JSON com um `access_token` e um `token_type`, o mesmo que neste exemplo.
+Pela especificação, você deveria retornar um JSON com um `access_token` e um `token_type`, o mesmo que neste exemplo.
Isso é algo que você mesmo deve fazer em seu código e certifique-se de usar essas chaves JSON.
@@ -197,7 +196,7 @@ Portanto, em nosso endpoint, só obteremos um usuário se o usuário existir, ti
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Informação
+/// note | Nota
O cabeçalho adicional `WWW-Authenticate` com valor `Bearer` que estamos retornando aqui também faz parte da especificação.
@@ -217,7 +216,7 @@ Esse é o benefício dos padrões...
## Veja em ação { #see-it-in-action }
-Abra o docs interativo: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
+Abra a documentação interativa: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
### Autentique-se { #authenticate }
diff --git a/docs/pt/docs/tutorial/server-sent-events.md b/docs/pt/docs/tutorial/server-sent-events.md
index 33389873c..63d82c321 100644
--- a/docs/pt/docs/tutorial/server-sent-events.md
+++ b/docs/pt/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@ Você pode transmitir dados para o cliente usando Server-Sent Events (SSE).
Isso é semelhante a [Stream de JSON Lines](stream-json-lines.md), mas usa o formato `text/event-stream`, que é suportado nativamente pelos navegadores com a [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Informação
+/// note | Nota
Adicionado no FastAPI 0.135.0.
diff --git a/docs/pt/docs/tutorial/stream-json-lines.md b/docs/pt/docs/tutorial/stream-json-lines.md
index f6d5c26f0..a76bacd11 100644
--- a/docs/pt/docs/tutorial/stream-json-lines.md
+++ b/docs/pt/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
Você pode ter uma sequência de dados que deseja enviar em um "**Stream**"; é possível fazer isso com **JSON Lines**.
-/// info | Informação
+/// note | Nota
Adicionado no FastAPI 0.134.0.
@@ -48,7 +48,7 @@ Uma response teria um tipo de conteúdo `application/jsonl` (em vez de `applicat
É muito semelhante a um array JSON (equivalente a uma list do Python), mas em vez de estar envolto em `[]` e ter `,` entre os itens, há **um objeto JSON por linha**, separados por um caractere de nova linha.
-/// info | Informação
+/// note | Nota
O ponto importante é que sua aplicação poderá produzir cada linha em sequência, enquanto o cliente consome as anteriores.
diff --git a/docs/pt/docs/tutorial/testing.md b/docs/pt/docs/tutorial/testing.md
index 1730511e6..e185102ae 100644
--- a/docs/pt/docs/tutorial/testing.md
+++ b/docs/pt/docs/tutorial/testing.md
@@ -8,7 +8,7 @@ Com ele, você pode usar o [pytest](https://docs.pytest.org/) diretamente com **
## Usando `TestClient` { #using-testclient }
-/// info | Informação
+/// note | Nota
Para usar o `TestClient`, primeiro instale [`httpx`](https://www.python-httpx.org).
@@ -142,7 +142,7 @@ Por exemplo:
Para mais informações sobre como passar dados para o backend (usando `httpx` ou `TestClient`), consulte a [documentação do HTTPX](https://www.python-httpx.org).
-/// info | Informação
+/// note | Nota
Observe que o `TestClient` recebe dados que podem ser convertidos para JSON, não para modelos Pydantic.
diff --git a/docs/ru/docs/advanced/additional-responses.md b/docs/ru/docs/advanced/additional-responses.md
index f7e8d9dec..ef9d3f223 100644
--- a/docs/ru/docs/advanced/additional-responses.md
+++ b/docs/ru/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@
///
-/// info | Информация
+/// note | Примечание
Ключ `model` не является частью OpenAPI.
@@ -183,7 +183,7 @@
///
-/// info | Информация
+/// note | Примечание
Если вы явно не укажете другой тип содержимого в параметре `responses`, FastAPI будет считать, что ответ имеет тот же тип содержимого, что и основной класс ответа (по умолчанию `application/json`).
diff --git a/docs/ru/docs/advanced/advanced-dependencies.md b/docs/ru/docs/advanced/advanced-dependencies.md
index fe37a79c1..fb6cb7ca8 100644
--- a/docs/ru/docs/advanced/advanced-dependencies.md
+++ b/docs/ru/docs/advanced/advanced-dependencies.md
@@ -98,7 +98,7 @@ checker(q="somequery")
В версии 0.118.0 это поведение было возвращено к тому, что код после `yield` выполняется после отправки ответа.
-/// info | Информация
+/// note | Примечание
Как вы увидите ниже, это очень похоже на поведение до версии 0.106.0, но с несколькими улучшениями и исправлениями краевых случаев.
diff --git a/docs/ru/docs/advanced/custom-response.md b/docs/ru/docs/advanced/custom-response.md
index fdfe2c549..695506223 100644
--- a/docs/ru/docs/advanced/custom-response.md
+++ b/docs/ru/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | Информация
+/// note | Примечание
Параметр `response_class` также используется для указания «типа содержимого» ответа.
@@ -65,7 +65,7 @@
///
-/// info | Информация
+/// note | Примечание
Разумеется, фактический заголовок `Content-Type`, статус-код и т.д. возьмутся из объекта `Response`, который вы вернули.
diff --git a/docs/ru/docs/advanced/dataclasses.md b/docs/ru/docs/advanced/dataclasses.md
index f9f8689b0..aa927cef1 100644
--- a/docs/ru/docs/advanced/dataclasses.md
+++ b/docs/ru/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ FastAPI построен поверх **Pydantic**, и я показывал в
Это работает так же, как с Pydantic-моделями. И на самом деле под капотом это достигается тем же образом, с использованием Pydantic.
-/// info | Информация
+/// note | Примечание
Помните, что dataclasses не умеют всего того, что умеют Pydantic-модели.
diff --git a/docs/ru/docs/advanced/events.md b/docs/ru/docs/advanced/events.md
index 464bba93e..69ebe4ffc 100644
--- a/docs/ru/docs/advanced/events.md
+++ b/docs/ru/docs/advanced/events.md
@@ -120,7 +120,7 @@ async with lifespan(app):
Здесь функция-обработчик события `shutdown` запишет строку текста `"Application shutdown"` в файл `log.txt`.
-/// info | Информация
+/// note | Примечание
В функции `open()` параметр `mode="a"` означает «добавление» (append), то есть строка будет добавлена в конец файла, без перезаписи предыдущего содержимого.
@@ -152,7 +152,7 @@ async with lifespan(app):
Под капотом, в ASGI-технической спецификации, это часть [Протокола Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), и он определяет события `startup` и `shutdown`.
-/// info | Информация
+/// note | Примечание
Вы можете прочитать больше про обработчики `lifespan` в Starlette в [документации Starlette по Lifespan](https://www.starlette.dev/lifespan/).
diff --git a/docs/ru/docs/advanced/generate-clients.md b/docs/ru/docs/advanced/generate-clients.md
index dfedc5dc0..f05454d9c 100644
--- a/docs/ru/docs/advanced/generate-clients.md
+++ b/docs/ru/docs/advanced/generate-clients.md
@@ -31,7 +31,6 @@ FastAPI автоматически генерирует спецификации
Например, вы можете попробовать:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
Некоторые из этих решений также могут быть open source или иметь бесплатные тарифы, так что вы сможете попробовать их без финансовых затрат. Другие коммерческие генераторы SDK доступны и их можно найти онлайн. 🤓
@@ -83,7 +82,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
///
-Вы получите ошибки прямо в редакторе для отправляемых данных:
+Вы получите ошибки прямо в редакторе кода для отправляемых данных:
@@ -186,7 +185,7 @@ FastAPI использует **уникальный ID** для каждой *о
npx @hey-api/openapi-ts -i ./openapi.json -o src/client
```
-После генерации нового клиента у вас будут **чистые имена методов**, со всем **автозавершением**, **ошибками прямо в редакторе** и т.д.:
+После генерации нового клиента у вас будут **чистые имена методов**, со всем **автозавершением**, **ошибками прямо в редакторе кода** и т.д.:
@@ -198,7 +197,7 @@ npx @hey-api/openapi-ts -i ./openapi.json -o src/client
* Данных запроса — в теле запроса, query‑параметрах и т.д.
* Данных ответа.
-У вас также будут **ошибки прямо в редакторе** для всего.
+У вас также будут **ошибки прямо в редакторе кода** для всего.
И каждый раз, когда вы обновляете код бэкенда и **перегенерируете** фронтенд, в нём появятся новые *операции пути* как методы, старые будут удалены, а любые другие изменения отразятся в сгенерированном коде. 🤓
diff --git a/docs/ru/docs/advanced/openapi-callbacks.md b/docs/ru/docs/advanced/openapi-callbacks.md
index 3d791de2c..c9cb73d18 100644
--- a/docs/ru/docs/advanced/openapi-callbacks.md
+++ b/docs/ru/docs/advanced/openapi-callbacks.md
@@ -167,13 +167,13 @@ https://www.external.org/events/invoices/2expen51ve
К этому моменту у вас есть необходимые *операции пути* обратного вызова (те, которые *внешний разработчик* должен реализовать во *внешнем API*) в созданном выше маршрутизаторе обратных вызовов.
-Теперь используйте параметр `callbacks` в *декораторе операции пути вашего API*, чтобы передать атрибут `.routes` (это, по сути, просто `list` маршрутов/*операций пути*) из этого маршрутизатора обратных вызовов:
+Теперь используйте параметр `callbacks` в *декораторе операции пути вашего API*, чтобы передать атрибут `.routes` из этого маршрутизатора обратных вызовов:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | Совет
-Обратите внимание, что вы передаёте не сам маршрутизатор (`invoices_callback_router`) в `callback=`, а его атрибут `.routes`, то есть `invoices_callback_router.routes`.
+Обратите внимание, что вы передаёте не сам маршрутизатор (`invoices_callback_router`) в `callback=`, а его атрибут `.routes`, то есть `invoices_callback_router.routes`. FastAPI будет использовать эти маршруты для генерации документации OpenAPI для обратных вызовов.
///
diff --git a/docs/ru/docs/advanced/openapi-webhooks.md b/docs/ru/docs/advanced/openapi-webhooks.md
index 9b1988ff3..cd4d23e7e 100644
--- a/docs/ru/docs/advanced/openapi-webhooks.md
+++ b/docs/ru/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@
Это значительно упростит вашим пользователям реализацию их API для приема ваших вебхук-запросов; возможно, они даже смогут автоматически сгенерировать часть кода своего API.
-/// info | Информация
+/// note | Примечание
Вебхуки доступны в OpenAPI 3.1.0 и выше, поддерживаются в FastAPI `0.99.0` и новее.
@@ -36,7 +36,7 @@
Определенные вами вебхуки попадут в схему **OpenAPI** и в автоматический **интерфейс документации**.
-/// info | Информация
+/// note | Примечание
Объект `app.webhooks` на самом деле — это обычный `APIRouter`, тот же тип, который вы используете при структурировании приложения по нескольким файлам.
diff --git a/docs/ru/docs/advanced/path-operation-advanced-configuration.md b/docs/ru/docs/advanced/path-operation-advanced-configuration.md
index fe2996362..e3bd78d50 100644
--- a/docs/ru/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/ru/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@
### Использование имени *функции-обработчика пути* как operationId { #using-the-path-operation-function-name-as-the-operationid }
-Если вы хотите использовать имена функций ваших API в качестве `operationId`, вы можете пройти по всем из них и переопределить `operation_id` каждой *операции пути* с помощью их `APIRoute.name`.
+Если вы хотите использовать имена функций ваших API в качестве `operationId`, вы можете передать пользовательскую `generate_unique_id_function` в `FastAPI`.
-Делать это следует после добавления всех *операций пути*.
+Эта функция получает каждый `APIRoute` и возвращает `operationId`, который нужно использовать для этой операции пути.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Совет
-
-Если вы вызываете `app.openapi()` вручную, обновите `operationId` до этого.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Предупреждение
diff --git a/docs/ru/docs/advanced/response-directly.md b/docs/ru/docs/advanced/response-directly.md
index fcb8d533d..c9a229018 100644
--- a/docs/ru/docs/advanced/response-directly.md
+++ b/docs/ru/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@
Вы можете возвращать `Response` или любой его подкласс.
-/// info | Информация
+/// note | Примечание
`JSONResponse` сам по себе является подклассом `Response`.
diff --git a/docs/ru/docs/advanced/security/oauth2-scopes.md b/docs/ru/docs/advanced/security/oauth2-scopes.md
index 944baeeeb..a0b7a185c 100644
--- a/docs/ru/docs/advanced/security/oauth2-scopes.md
+++ b/docs/ru/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OAuth2 со scopes — это механизм, который использу
- `instagram_basic` используется Facebook / Instagram.
- `https://www.googleapis.com/auth/drive` используется Google.
-/// info | Информация
+/// note | Примечание
В OAuth2 «scope» — это просто строка, объявляющая требуемое конкретное разрешение.
@@ -126,7 +126,7 @@ OAuth2 со scopes — это механизм, который использу
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | Технические детали
+/// note | Технические детали
`Security` на самом деле является подклассом `Depends` и имеет всего один дополнительный параметр, который мы рассмотрим позже.
diff --git a/docs/ru/docs/advanced/stream-data.md b/docs/ru/docs/advanced/stream-data.md
index 4c373db1a..9ae6890a5 100644
--- a/docs/ru/docs/advanced/stream-data.md
+++ b/docs/ru/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@
Но если вы хотите передавать в потоке чистые бинарные данные или строки, ниже показано, как это сделать.
-/// info | Информация
+/// note | Примечание
Добавлено в FastAPI 0.134.0.
@@ -90,7 +90,7 @@ FastAPI будет передавать каждый чанк данных в `S
И во многих случаях чтение таких объектов будет блокирующей операцией (которая может заблокировать цикл событий), потому что данные читаются с диска или из сети.
-/// info | Информация
+/// note | Примечание
Приведённый выше пример — исключение, потому что объект `io.BytesIO` уже находится в памяти, поэтому чтение ничего не блокирует.
diff --git a/docs/ru/docs/advanced/strict-content-type.md b/docs/ru/docs/advanced/strict-content-type.md
index 1a0cbbc31..1d732421c 100644
--- a/docs/ru/docs/advanced/strict-content-type.md
+++ b/docs/ru/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
С этой настройкой запросы без заголовка `Content-Type` будут иметь тело запроса, обработанное как JSON — это такое же поведение, как в более старых версиях FastAPI.
-/// info | Информация
+/// note | Примечание
Это поведение и настройка были добавлены в FastAPI 0.132.0.
diff --git a/docs/ru/docs/advanced/websockets.md b/docs/ru/docs/advanced/websockets.md
index abfd789a4..0f69f57b3 100644
--- a/docs/ru/docs/advanced/websockets.md
+++ b/docs/ru/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ $ fastapi dev
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info | Примечание
+/// note | Примечание
В веб-сокете вызывать `HTTPException` не имеет смысла. Вместо этого нужно использовать `WebSocketException`.
diff --git a/docs/ru/docs/advanced/wsgi.md b/docs/ru/docs/advanced/wsgi.md
index 3ed85d0e9..d62133c73 100644
--- a/docs/ru/docs/advanced/wsgi.md
+++ b/docs/ru/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@
## Использование `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | Информация
+/// note | Примечание
Для этого требуется установить `a2wsgi`, например с помощью `pip install a2wsgi`.
diff --git a/docs/ru/docs/deployment/docker.md b/docs/ru/docs/deployment/docker.md
index 3b16d7798..50147750e 100644
--- a/docs/ru/docs/deployment/docker.md
+++ b/docs/ru/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | Информация
+/// note | Заметка
Существуют и другие форматы и инструменты для описания и установки зависимостей.
@@ -556,7 +556,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
Если у вас **несколько контейнеров**, и, вероятно, каждый запускает **один процесс** (например, в кластере **Kubernetes**), то вы, скорее всего, захотите иметь **отдельный контейнер**, выполняющий **предварительные шаги** в одном контейнере и одном процессе **до** запуска реплицированных контейнеров-воркеров.
-/// info | Информация
+/// note | Заметка
Если вы используете Kubernetes, это, вероятно, будет [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/).
diff --git a/docs/ru/docs/deployment/fastapicloud.md b/docs/ru/docs/deployment/fastapicloud.md
index 95db3387f..fa3160519 100644
--- a/docs/ru/docs/deployment/fastapicloud.md
+++ b/docs/ru/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-Вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com) одной командой, присоединяйтесь к списку ожидания, если ещё не сделали этого. 🚀
-
-## Вход { #login }
-
-Убедитесь, что у вас уже есть аккаунт **FastAPI Cloud** (мы пригласили вас из списка ожидания 😉).
-
-Затем выполните вход:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## Деплой { #deploy }
-
-Теперь разверните приложение одной командой:
+Вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com) всего **одной командой**. 🚀
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
+CLI автоматически определит ваше приложение FastAPI и развернёт его в облаке. Если вы не вошли в аккаунт, откроется браузер для завершения процесса аутентификации.
+
Вот и всё! Теперь вы можете открыть своё приложение по этому URL. ✨
## О FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/ru/docs/deployment/manually.md b/docs/ru/docs/deployment/manually.md
index 3169f3189..db5581ae5 100644
--- a/docs/ru/docs/deployment/manually.md
+++ b/docs/ru/docs/deployment/manually.md
@@ -46,7 +46,7 @@ $ fastapi run ASGI. FastAPI — ASGI-веб‑фреймворк.
+FastAPI использует стандарт для построения Python‑веб‑фреймворков и серверов под названием ASGI. FastAPI — ASGI-веб‑фреймворк.
Главное, что вам нужно, чтобы запустить приложение **FastAPI** (или любое другое ASGI‑приложение) на удалённой серверной машине, — это программа ASGI‑сервера, такая как **Uvicorn**; именно он используется по умолчанию в команде `fastapi`.
@@ -56,7 +56,6 @@ FastAPI использует стандарт для построения Python
* [Hypercorn](https://hypercorn.readthedocs.io/): ASGI‑сервер, среди прочего совместимый с HTTP/2 и Trio.
* [Daphne](https://github.com/django/daphne): ASGI‑сервер, созданный для Django Channels.
* [Granian](https://github.com/emmett-framework/granian): HTTP‑сервер на Rust для Python‑приложений.
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit — лёгкая и многофункциональная среда выполнения веб‑приложений.
## Сервер как машина и сервер как программа { #server-machine-and-server-program }
diff --git a/docs/ru/docs/deployment/server-workers.md b/docs/ru/docs/deployment/server-workers.md
index 2caf79f7d..8d4bd33ef 100644
--- a/docs/ru/docs/deployment/server-workers.md
+++ b/docs/ru/docs/deployment/server-workers.md
@@ -17,7 +17,7 @@
Здесь я покажу, как использовать **Uvicorn** с **воркер-процессами** через команду `fastapi` или напрямую через команду `uvicorn`.
-/// info | Информация
+/// note | Примечание
Если вы используете контейнеры, например Docker или Kubernetes, я расскажу об этом подробнее в следующей главе: [FastAPI в контейнерах — Docker](docker.md).
diff --git a/docs/ru/docs/how-to/extending-openapi.md b/docs/ru/docs/how-to/extending-openapi.md
index c1e369f5e..4a0a91b1c 100644
--- a/docs/ru/docs/how-to/extending-openapi.md
+++ b/docs/ru/docs/how-to/extending-openapi.md
@@ -25,11 +25,19 @@
* `openapi_version`: Версия используемой спецификации OpenAPI. По умолчанию — последняя: `3.1.0`.
* `summary`: Краткое описание API.
* `description`: Описание вашего API; может включать Markdown и будет отображаться в документации.
-* `routes`: Список маршрутов — это каждая зарегистрированная *операция пути*. Берутся из `app.routes`.
+* `routes`: Список маршрутов — это каждая зарегистрированная *операция пути*. Берутся из `app.routes`. FastAPI использует их, чтобы собрать зарегистрированные *операции пути*, включая те из подключённых роутеров.
-/// info | Информация
+/// tip | Технические детали
-Параметр `summary` доступен в OpenAPI 3.1.0 и выше, поддерживается FastAPI версии 0.99.0 и выше.
+`app.routes` — это более низкоуровневое дерево маршрутов. Оно может включать кандидаты маршрутов, которые FastAPI использует внутренне для подключённых роутеров, а не только конечные объекты `APIRoute`.
+
+Вы всё равно можете передать `app.routes` в `get_openapi()`. FastAPI обойдёт это дерево маршрутов, чтобы собрать фактические операции пути.
+
+///
+
+/// note | Примечание
+
+Параметр `summary` доступен в OpenAPI 3.1.0 и выше, поддерживается FastAPI 0.99.0 и выше.
///
diff --git a/docs/ru/docs/how-to/separate-openapi-schemas.md b/docs/ru/docs/how-to/separate-openapi-schemas.md
index 8f6c83e7e..3e0830891 100644
--- a/docs/ru/docs/how-to/separate-openapi-schemas.md
+++ b/docs/ru/docs/how-to/separate-openapi-schemas.md
@@ -85,7 +85,7 @@
В таком случае вы можете отключить эту функциональность в **FastAPI** с помощью параметра `separate_input_output_schemas=False`.
-/// info | Информация
+/// note | Примечание
Поддержка `separate_input_output_schemas` появилась в FastAPI `0.102.0`. 🤓
diff --git a/docs/ru/docs/index.md b/docs/ru/docs/index.md
index 015b9769e..1b6f3d40a 100644
--- a/docs/ru/docs/index.md
+++ b/docs/ru/docs/index.md
@@ -492,9 +492,7 @@ item: Item
### Разверните приложение (опционально) { #deploy-your-app-optional }
-При желании вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com), присоединяйтесь к списку ожидания, если ещё не сделали этого. 🚀
-
-Если у вас уже есть аккаунт **FastAPI Cloud** (мы пригласили вас из списка ожидания 😉), вы можете развернуть ваше приложение одной командой.
+При желании вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com) одной командой. 🚀
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+CLI автоматически определит ваше приложение FastAPI и развернёт его в облаке. Если вы не вошли в систему, откроется браузер для завершения процесса аутентификации.
+
Вот и всё! Теперь вы можете открыть ваше приложение по этой ссылке. ✨
#### О FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/ru/docs/tutorial/bigger-applications.md b/docs/ru/docs/tutorial/bigger-applications.md
index 453851d34..2c7784f22 100644
--- a/docs/ru/docs/tutorial/bigger-applications.md
+++ b/docs/ru/docs/tutorial/bigger-applications.md
@@ -396,9 +396,9 @@ from .routers.users import router
/// note | Технические детали
-Фактически, внутри он создаст *операцию пути* для каждой *операции пути*, объявленной в `APIRouter`.
+FastAPI сохраняет исходный `APIRouter` и его `APIRoute` активными, когда маршрутизатор включается в основное приложение.
-Так что под капотом всё будет работать так, как будто всё было одним приложением.
+Это означает, что пользовательские подклассы `APIRouter` и `APIRoute` по-прежнему участвуют после подключения маршрутизатора.
///
@@ -406,7 +406,7 @@ from .routers.users import router
При подключении маршрутизаторов не нужно беспокоиться о производительности.
-Это займёт микросекунды и произойдёт только при старте.
+Это сделано максимально лёгким и не добавляет накладных расходов на каждый запрос.
Так что это не повлияет на производительность. ⚡
@@ -459,9 +459,9 @@ from .routers.users import router
`APIRouter` не «монтируются», они не изолированы от остального приложения.
-Это потому, что мы хотим включить их *операции пути* в OpenAPI-схему и пользовательские интерфейсы.
+Это потому, что мы хотим включить их *операции пути* в схему OpenAPI и пользовательские интерфейсы.
-Так как мы не можем просто изолировать их и «смонтировать» независимо от остального, *операции пути* «клонируются» (пересоздаются), а не включаются напрямую.
+FastAPI сохраняет исходные маршрутизаторы и операции пути активными и комбинирует префиксы маршрутизаторов, зависимости, теги, ответы и другие метаданные при обработке запросов и генерации OpenAPI.
///
@@ -524,7 +524,7 @@ $ fastapi dev
Это продвинутое использование, которое вам может и не понадобиться, но оно есть на случай, если понадобится.
-## Подключение `APIRouter` в другой `APIRouter` { #include-an-apirouter-in-another }
+## Подключение `APIRouter` в другой `APIRouter` { #include-an-apirouter-in-another }
Точно так же, как вы можете подключить `APIRouter` к приложению `FastAPI`, вы можете подключить `APIRouter` к другому `APIRouter`, используя:
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-Убедитесь, что вы сделали это до подключения `router` к приложению `FastAPI`, чтобы *операции пути* из `other_router` также были подключены.
+Вы можете сделать это до или после подключения `router` к приложению `FastAPI`. FastAPI всё равно включит *операции пути* из `other_router` в маршрутизацию и OpenAPI.
+
+То же относится к *операциям пути*, добавленным позже в маршрутизаторы. Они также будут видны через более раннее включение.
+
+/// warning | Технические детали
+
+Избегайте прямой мутации `router.routes` после включения маршрутизатора. FastAPI рассматривает включение маршрутизатора как «живое», поэтому исходный маршрутизатор и его маршруты остаются частью маршрутизации и генерации OpenAPI.
+
+Используйте документированные API, такие как декораторы операций пути и `.include_router()`, чтобы добавлять маршруты и маршрутизаторы.
+
+Считайте `router.routes` низкоуровневым деревом маршрутов, которое может содержать определения маршрутов и включённые маршрутизаторы, и избегайте воспринимать его как плоский список итоговых операций пути.
+
+///
diff --git a/docs/ru/docs/tutorial/body-multiple-params.md b/docs/ru/docs/tutorial/body-multiple-params.md
index ddd9c6fdd..cd9c56012 100644
--- a/docs/ru/docs/tutorial/body-multiple-params.md
+++ b/docs/ru/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Информация
+/// note | Заметка
`Body` также имеет все те же дополнительные параметры валидации и метаданных, как у `Query`, `Path` и других, которые вы увидите позже.
@@ -123,7 +123,7 @@ q: str | None = None
Но если вы хотите чтобы он ожидал JSON с ключом `item` с содержимым модели внутри, также как это происходит при объявлении дополнительных body-параметров, вы можете использовать специальный параметр `embed` у типа `Body`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
так же, как в этом примере:
diff --git a/docs/ru/docs/tutorial/body-nested-models.md b/docs/ru/docs/tutorial/body-nested-models.md
index fab025dbc..d4baf8230 100644
--- a/docs/ru/docs/tutorial/body-nested-models.md
+++ b/docs/ru/docs/tutorial/body-nested-models.md
@@ -16,7 +16,8 @@
### Объявите `list` с параметром типа { #declare-a-list-with-a-type-parameter }
-Для объявления типов, у которых есть параметры типа (внутренние типы), таких как `list`, `dict`, `tuple`, передайте внутренний(ие) тип(ы) как «параметры типа», используя квадратные скобки: `[` и `]`
+Для объявления типов, у которых есть параметры типа (внутренние типы), таких как `list`, `dict`, `tuple`,
+передайте внутренний(ие) тип(ы) как «параметры типа», используя квадратные скобки: `[` и `]`
```Python
my_list: list[str]
@@ -135,7 +136,7 @@ my_list: list[str]
}
```
-/// info | Информация
+/// note | Примечание
Заметьте, что теперь у ключа `images` есть список объектов изображений.
@@ -147,7 +148,7 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Информация
+/// note | Примечание
Заметьте, что у объекта `Offer` есть список объектов `Item`, которые, в свою очередь, могут содержать необязательный список объектов `Image`
diff --git a/docs/ru/docs/tutorial/body.md b/docs/ru/docs/tutorial/body.md
index 8a67c8f51..7b3ab22d3 100644
--- a/docs/ru/docs/tutorial/body.md
+++ b/docs/ru/docs/tutorial/body.md
@@ -8,7 +8,7 @@
Чтобы объявить тело **запроса**, используйте модели [Pydantic](https://docs.pydantic.dev/), со всей их мощью и преимуществами.
-/// info | Информация
+/// note | Заметка
Чтобы отправить данные, используйте один из методов: `POST` (чаще всего), `PUT`, `DELETE` или `PATCH`.
diff --git a/docs/ru/docs/tutorial/cookie-param-models.md b/docs/ru/docs/tutorial/cookie-param-models.md
index 9b34cf030..2b9681433 100644
--- a/docs/ru/docs/tutorial/cookie-param-models.md
+++ b/docs/ru/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@
-/// info | Дополнительная информация
+/// note | Заметка
Имейте в виду, что, поскольку **браузеры обрабатывают cookies** особым образом и под капотом, они **не** позволят **JavaScript** легко получить доступ к ним.
diff --git a/docs/ru/docs/tutorial/cookie-params.md b/docs/ru/docs/tutorial/cookie-params.md
index 8dad3873e..f801c4ac4 100644
--- a/docs/ru/docs/tutorial/cookie-params.md
+++ b/docs/ru/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@
///
-/// info | Дополнительная информация
+/// note | Примечание
Для объявления cookies, вам нужно использовать `Cookie`, иначе параметры будут интерпретированы как параметры запроса.
///
-/// info | Дополнительная информация
+/// note | Примечание
Имейте в виду, что, поскольку **браузеры обрабатывают cookies** особым образом и «за кулисами», они **не** позволяют **JavaScript** просто так получать к ним доступ.
diff --git a/docs/ru/docs/tutorial/debugging.md b/docs/ru/docs/tutorial/debugging.md
index 330055be4..deb92f1b9 100644
--- a/docs/ru/docs/tutorial/debugging.md
+++ b/docs/ru/docs/tutorial/debugging.md
@@ -72,7 +72,7 @@ from myapp import app
не будет выполнена.
-/// info | Информация
+/// note | Примечание
Для получения дополнительной информации, ознакомьтесь с [официальной документацией Python](https://docs.python.org/3/library/__main__.html).
diff --git a/docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index b4b7ce631..2193343e6 100644
--- a/docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@
///
-/// info | Примечание
+/// note | Примечание
В этом примере мы используем выдуманные пользовательские HTTP-заголовки `X-Key` и `X-Token`.
diff --git a/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md
index 04c2c2da4..61ab8f44d 100644
--- a/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info | Дополнительная информация
+/// note | Примечание
Клиенту будет отправлен только **один ответ**. Это может быть один из ответов об ошибке или ответ от *операции пути*.
@@ -219,7 +219,7 @@ participant operation as Функция-обработчик пути
Note over dep_req: Выполнить код до yield
dep_req ->> dep_func: Передать значение
Note over dep_func: Выполнить код до yield
- dep_func ->> operation: Выполнить функцию-обработчик пути
+ dep_func ->> operation: Выполнить функцию-обработчика пути
operation ->> dep_func: Выход из функции-обработчика пути
Note over dep_func: Выполнить код после yield
Note over dep_func: ✅ Зависимость закрыта
diff --git a/docs/ru/docs/tutorial/dependencies/index.md b/docs/ru/docs/tutorial/dependencies/index.md
index 4aed03554..6efd023e2 100644
--- a/docs/ru/docs/tutorial/dependencies/index.md
+++ b/docs/ru/docs/tutorial/dependencies/index.md
@@ -51,7 +51,7 @@
А затем просто возвращает `dict`, содержащий эти значения.
-/// info | Информация
+/// note | Примечание
FastAPI добавил поддержку `Annotated` (и начал рекомендовать его использование) в версии 0.95.0.
@@ -106,7 +106,7 @@ common_parameters --> read_users
Таким образом, вы пишете общий код один раз, а **FastAPI** позаботится о его вызове для ваших *операций пути*.
-/// check | Проверка
+/// tip | Подсказка
Обратите внимание, что вам не нужно создавать специальный класс и передавать его куда-то в **FastAPI**, чтобы «зарегистрировать» его или что-то подобное.
diff --git a/docs/ru/docs/tutorial/dependencies/sub-dependencies.md b/docs/ru/docs/tutorial/dependencies/sub-dependencies.md
index 3c71defd8..b36adf486 100644
--- a/docs/ru/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/ru/docs/tutorial/dependencies/sub-dependencies.md
@@ -6,9 +6,9 @@
**FastAPI** сам займётся их управлением.
-## Первая зависимость { #first-dependency-dependable }
+## Первая «зависимость» { #first-dependency-dependable }
-Можно создать первую зависимость следующим образом:
+Можно создать первую «зависимость» следующим образом:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *}
@@ -35,7 +35,7 @@
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | Дополнительная информация
+/// note | Примечание
Обратите внимание, что мы объявляем только одну зависимость в *функции операции пути* - `query_or_cookie_extractor`.
diff --git a/docs/ru/docs/tutorial/first-steps.md b/docs/ru/docs/tutorial/first-steps.md
index 7216d4cb7..ce743b369 100644
--- a/docs/ru/docs/tutorial/first-steps.md
+++ b/docs/ru/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ entrypoint = "backend.main:app"
from backend.main import app
```
-### `fastapi dev` с путём { #fastapi-dev-with-path }
+### `fastapi dev` с путём или с опцией CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
Вы также можете передать путь к файлу в команду `fastapi dev`, и она попытается определить объект приложения FastAPI для использования:
@@ -188,29 +188,19 @@ from backend.main import app
$ fastapi dev main.py
```
-Но в этом случае вам придётся каждый раз помнить о передаче корректного пути при вызове команды `fastapi`.
-
-Кроме того, другие инструменты могут его не найти, например [Расширение VS Code](../editor-support.md) или [FastAPI Cloud](https://fastapicloud.com), поэтому рекомендуется использовать `entrypoint` в `pyproject.toml`.
-
-### Разверните приложение (необязательно) { #deploy-your-app-optional }
-
-При желании вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com), перейдите и присоединитесь к списку ожидания, если ещё не сделали этого. 🚀
-
-Если у вас уже есть аккаунт **FastAPI Cloud** (мы пригласили вас из списка ожидания 😉), вы можете развернуть приложение одной командой.
-
-Перед развертыванием убедитесь, что вы вошли в систему:
-
-
+Или вы можете передать опцию `--entrypoint` команде `fastapi dev`:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+Но в этом случае вам придётся каждый раз помнить о передаче корректного пути/entrypoint при вызове команды `fastapi`.
+
+Кроме того, другие инструменты могут его не найти, например [Расширение VS Code](../editor-support.md) или [FastAPI Cloud](https://fastapicloud.com), поэтому рекомендуется использовать `entrypoint` в `pyproject.toml`.
-Затем разверните приложение:
+### Разверните приложение (необязательно) { #deploy-your-app-optional }
+
+При желании вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com) одной командой. 🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+CLI автоматически определит ваше приложение FastAPI и развернёт его в облаке. Если вы не вошли в систему, откроется браузер для завершения процесса аутентификации.
+
Готово! Теперь вы можете открыть своё приложение по этому URL. ✨
## Рассмотрим поэтапно { #recap-step-by-step }
@@ -270,7 +262,7 @@ https://example.com/items/foo
/items/foo
```
-/// info | Информация
+/// note | Примечание
«Путь» также часто называют «эндпоинт» или «маршрут».
@@ -322,7 +314,7 @@ https://example.com/items/foo
* по пути `/`
* с использованием get операции
-/// info | Информация о `@decorator`
+/// note | Информация о `@decorator`
Синтаксис `@something` в Python называется «декоратор».
diff --git a/docs/ru/docs/tutorial/metadata.md b/docs/ru/docs/tutorial/metadata.md
index 261cc43f5..b1335f668 100644
--- a/docs/ru/docs/tutorial/metadata.md
+++ b/docs/ru/docs/tutorial/metadata.md
@@ -74,7 +74,7 @@
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | Дополнительная информация
+/// note | Примечание
Узнайте больше о тегах в [Конфигурации операции пути](path-operation-configuration.md#tags).
diff --git a/docs/ru/docs/tutorial/path-operation-configuration.md b/docs/ru/docs/tutorial/path-operation-configuration.md
index 965f2a1ba..c1264d9dd 100644
--- a/docs/ru/docs/tutorial/path-operation-configuration.md
+++ b/docs/ru/docs/tutorial/path-operation-configuration.md
@@ -72,13 +72,13 @@
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Дополнительная информация
+/// note | Примечание
Помните, что `response_description` относится конкретно к ответу, а `description` относится к *операции пути* в целом.
///
-/// check | Проверка
+/// tip | Совет
OpenAPI указывает, что каждой *операции пути* необходимо описание ответа.
diff --git a/docs/ru/docs/tutorial/path-params-numeric-validations.md b/docs/ru/docs/tutorial/path-params-numeric-validations.md
index 34eeb80cb..dbbc025f1 100644
--- a/docs/ru/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/ru/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Информация
+/// note | Примечание
Поддержка `Annotated` была добавлена в FastAPI начиная с версии 0.95.0 (и с этой версии рекомендуется использовать этот подход).
@@ -131,7 +131,7 @@ Python не будет ничего делать с `*`, но он будет з
* `lt`: меньше (`l`ess `t`han)
* `le`: меньше или равно (`l`ess than or `e`qual)
-/// info | Информация
+/// note | Примечание
`Query`, `Path` и другие классы, которые вы разберёте позже, являются наследниками общего класса `Param`.
diff --git a/docs/ru/docs/tutorial/path-params.md b/docs/ru/docs/tutorial/path-params.md
index 79343a158..cfc96189c 100644
--- a/docs/ru/docs/tutorial/path-params.md
+++ b/docs/ru/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@
Здесь, `item_id` объявлен типом `int`.
-/// check | Заметка
+/// tip | Подсказка
Это обеспечит поддержку редактора кода внутри функции (проверка ошибок, автозавершение и т.п.).
@@ -34,7 +34,7 @@
{"item_id":3}
```
-/// check | Заметка
+/// tip | Подсказка
Обратите внимание на значение `3`, которое получила (и вернула) функция. Это целочисленный Python `int`, а не строка `"3"`.
@@ -66,7 +66,7 @@
Та же ошибка возникнет, если вместо `int` передать `float`, например: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Заметка
+/// tip | Подсказка
**FastAPI** обеспечивает валидацию данных, используя всё те же определения типов.
@@ -82,7 +82,7 @@
-/// check | Заметка
+/// tip | Подсказка
Ещё раз, просто используя определения типов, **FastAPI** обеспечивает автоматическую интерактивную документацию (с интеграцией Swagger UI).
diff --git a/docs/ru/docs/tutorial/query-params-str-validations.md b/docs/ru/docs/tutorial/query-params-str-validations.md
index 08a5e11a5..7af7ccfa0 100644
--- a/docs/ru/docs/tutorial/query-params-str-validations.md
+++ b/docs/ru/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ FastAPI поймёт, что значение `q` не обязательно,
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Дополнительная информация
+/// note | Примечание
Поддержка `Annotated` (и рекомендация использовать его) появилась в FastAPI версии 0.95.0.
@@ -381,7 +381,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Дополнительная информация
+/// note | Примечание
Это доступно в Pydantic версии 2 и выше. 😎
diff --git a/docs/ru/docs/tutorial/query-params.md b/docs/ru/docs/tutorial/query-params.md
index 99f2a98ae..524b53945 100644
--- a/docs/ru/docs/tutorial/query-params.md
+++ b/docs/ru/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ http://127.0.0.1:8000/items/?skip=20
В этом случае, параметр `q` будет не обязательным и будет иметь значение `None` по умолчанию.
-/// check | Важно
+/// tip | Подсказка
Также обратите внимание, что **FastAPI** достаточно умён чтобы заметить, что параметр `item_id` является path-параметром, а `q` нет, поэтому, это параметр запроса.
diff --git a/docs/ru/docs/tutorial/request-files.md b/docs/ru/docs/tutorial/request-files.md
index e8500adba..29a7f5ec1 100644
--- a/docs/ru/docs/tutorial/request-files.md
+++ b/docs/ru/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Используя класс `File`, мы можем позволить клиентам загружать файлы.
-/// info | Дополнительная информация
+/// note | Примечание
Чтобы получать загруженные файлы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Дополнительная информация
+/// note | Примечание
`File` - это класс, который наследуется непосредственно от `Form`.
diff --git a/docs/ru/docs/tutorial/request-form-models.md b/docs/ru/docs/tutorial/request-form-models.md
index c7f37c2ba..3852e3a03 100644
--- a/docs/ru/docs/tutorial/request-form-models.md
+++ b/docs/ru/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Вы можете использовать **Pydantic-модели** для объявления **полей формы** в FastAPI.
-/// info | Дополнительная информация
+/// note | Заметка
Чтобы использовать формы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/ru/docs/tutorial/request-forms-and-files.md b/docs/ru/docs/tutorial/request-forms-and-files.md
index f291d5347..347818ae3 100644
--- a/docs/ru/docs/tutorial/request-forms-and-files.md
+++ b/docs/ru/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Вы можете определять файлы и поля формы одновременно, используя `File` и `Form`.
-/// info | Информация
+/// note | Примечание
Чтобы получать загруженные файлы и/или данные форм, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/ru/docs/tutorial/request-forms.md b/docs/ru/docs/tutorial/request-forms.md
index 3760a8a3b..3108c933e 100644
--- a/docs/ru/docs/tutorial/request-forms.md
+++ b/docs/ru/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
Когда вам нужно получить поля формы вместо JSON, вы можете использовать `Form`.
-/// info | Дополнительная информация
+/// note | Примечание
Чтобы использовать формы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -32,7 +32,7 @@ $ pip install python-multipart
С помощью `Form` вы можете объявить те же настройки, что и с `Body` (и `Query`, `Path`, `Cookie`), включая валидацию, примеры, псевдоним (например, `user-name` вместо `username`) и т.д.
-/// info | Дополнительная информация
+/// note | Примечание
`Form` — это класс, который наследуется непосредственно от `Body`.
diff --git a/docs/ru/docs/tutorial/response-model.md b/docs/ru/docs/tutorial/response-model.md
index 510143d7b..bf0a6fc0a 100644
--- a/docs/ru/docs/tutorial/response-model.md
+++ b/docs/ru/docs/tutorial/response-model.md
@@ -72,11 +72,11 @@ FastAPI будет использовать этот `response_model` для д
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Информация
+/// note | Примечание
Чтобы использовать `EmailStr`, сначала установите [`email-validator`](https://github.com/JoshData/python-email-validator).
-Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установите пакет, например:
+Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установили пакет, например:
```console
$ pip install email-validator
@@ -178,7 +178,7 @@ FastAPI делает несколько вещей внутри вместе с
## Другие аннотации возвращаемых типов { #other-return-type-annotations }
-Бывают случаи, когда вы возвращаете что-то, что не является валидным полем Pydantic, и аннотируете это в функции только ради поддержки инструментов (редактор кода, mypy и т.д.).
+Бывают случаи, когда вы возвращаете что-то, что не является валидным полем Pydantic, и аннотируете это в функции только ради поддержки инструментов (редактор коды, mypy и т.д.).
### Возврат Response напрямую { #return-a-response-directly }
@@ -251,7 +251,7 @@ FastAPI делает несколько вещей внутри вместе с
}
```
-/// info | Информация
+/// note | Примечание
Вы также можете использовать:
diff --git a/docs/ru/docs/tutorial/response-status-code.md b/docs/ru/docs/tutorial/response-status-code.md
index f3144a33a..ef190a341 100644
--- a/docs/ru/docs/tutorial/response-status-code.md
+++ b/docs/ru/docs/tutorial/response-status-code.md
@@ -18,7 +18,7 @@
Параметр `status_code` принимает число, обозначающее HTTP статус-код.
-/// info | Информация
+/// note | Примечание
В качестве значения параметра `status_code` также может использоваться `IntEnum`, например, из библиотеки [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) в Python.
diff --git a/docs/ru/docs/tutorial/schema-extra-example.md b/docs/ru/docs/tutorial/schema-extra-example.md
index ee2f5b991..435b34460 100644
--- a/docs/ru/docs/tutorial/schema-extra-example.md
+++ b/docs/ru/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@
///
-/// info | Информация
+/// note | Примечание
OpenAPI 3.1.0 (используется начиная с FastAPI 0.99.0) добавил поддержку `examples`, который является частью стандарта **JSON Schema**.
@@ -155,7 +155,7 @@ OpenAPI также добавила поля `example` и `examples` в друг
* `File()`
* `Form()`
-/// info | Информация
+/// note | Примечание
Этот старый специфичный для OpenAPI параметр `examples` теперь называется `openapi_examples`, начиная с FastAPI `0.103.0`.
@@ -171,7 +171,7 @@ OpenAPI также добавила поля `example` и `examples` в друг
Это новое поле `examples` в JSON Schema — это **просто `list`** примеров, а не dict с дополнительными метаданными, как в других местах OpenAPI (описанных выше).
-/// info | Информация
+/// note | Примечание
Даже после того как OpenAPI 3.1.0 была выпущена с этой новой, более простой интеграцией с JSON Schema, какое‑то время Swagger UI, инструмент, предоставляющий автоматическую документацию, не поддерживал OpenAPI 3.1.0 (поддержка появилась начиная с версии 5.0.0 🎉).
diff --git a/docs/ru/docs/tutorial/security/first-steps.md b/docs/ru/docs/tutorial/security/first-steps.md
index c55e832f4..e702dfadb 100644
--- a/docs/ru/docs/tutorial/security/first-steps.md
+++ b/docs/ru/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@
## Запуск { #run-it }
-/// info | Дополнительная информация
+/// note | Примечание
Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматически устанавливается вместе с **FastAPI**, если вы запускаете команду `pip install "fastapi[standard]"`.
@@ -60,7 +60,7 @@ $ fastapi dev
-/// check | Кнопка авторизации!
+/// tip | Кнопка авторизации!
У вас уже появилась новая кнопка «Authorize».
@@ -118,7 +118,7 @@ OAuth2 был спроектирован так, чтобы бэкенд или
В этом примере мы будем использовать **OAuth2**, с потоком **Password**, используя токен **Bearer**. Для этого мы используем класс `OAuth2PasswordBearer`.
-/// info | Дополнительная информация
+/// note | Примечание
Токен «bearer» — не единственный вариант.
@@ -148,7 +148,7 @@ OAuth2 был спроектирован так, чтобы бэкенд или
Скоро мы также создадим и саму операцию пути.
-/// info | Дополнительная информация
+/// note | Примечание
Если вы очень строгий «питонист», вам может не понравиться стиль имени параметра `tokenUrl` вместо `token_url`.
@@ -176,7 +176,7 @@ oauth2_scheme(some, parameters)
**FastAPI** будет знать, что может использовать эту зависимость для определения «схемы безопасности» в схеме OpenAPI (и в автоматической документации по API).
-/// info | Технические детали
+/// note | Технические детали
**FastAPI** будет знать, что может использовать класс `OAuth2PasswordBearer` (объявленный в зависимости) для определения схемы безопасности в OpenAPI, потому что он наследуется от `fastapi.security.oauth2.OAuth2`, который, в свою очередь, наследуется от `fastapi.security.base.SecurityBase`.
@@ -186,7 +186,7 @@ oauth2_scheme(some, parameters)
## Что он делает { #what-it-does }
-Он будет искать в запросе заголовок `Authorization`, проверять, что его значение — это `Bearer ` плюс некоторый токен, и вернет токен как `str`.
+Он будет искать в запросе HTTP-заголовок `Authorization`, проверять, что его значение — это `Bearer ` плюс некоторый токен, и вернет токен как `str`.
Если заголовок `Authorization` отсутствует или его значение не содержит токен `Bearer `, он сразу ответит ошибкой со статус-кодом 401 (`UNAUTHORIZED`).
diff --git a/docs/ru/docs/tutorial/security/get-current-user.md b/docs/ru/docs/tutorial/security/get-current-user.md
index 8388b672c..7bd48a9a0 100644
--- a/docs/ru/docs/tutorial/security/get-current-user.md
+++ b/docs/ru/docs/tutorial/security/get-current-user.md
@@ -30,7 +30,7 @@
## Получить пользователя { #get-the-user }
-`get_current_user` будет использовать созданную нами (ненастоящую) служебную функцию, которая принимает токен типа `str` и возвращает нашу Pydantic-модель `User`:
+`get_current_user` будет использовать созданную нами (ненастоящую) вспомогательную функцию, которая принимает токен типа `str` и возвращает нашу Pydantic-модель `User`:
{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *}
@@ -52,7 +52,7 @@
///
-/// check | Заметка
+/// tip | Подсказка
То, как устроена эта система зависимостей, позволяет иметь разные зависимости, которые возвращают модель `User`.
@@ -78,7 +78,7 @@
## Размер кода { #code-size }
-Этот пример может показаться многословным. Имейте в виду, что в одном файле мы смешиваем безопасность, модели данных, служебные функции и *операции пути*.
+Этот пример может показаться многословным. Имейте в виду, что в одном файле мы смешиваем безопасность, модели данных, вспомогательные функции и *операции пути*.
Но вот ключевой момент.
diff --git a/docs/ru/docs/tutorial/security/oauth2-jwt.md b/docs/ru/docs/tutorial/security/oauth2-jwt.md
index e3729dfc8..0409cd0a9 100644
--- a/docs/ru/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/ru/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | Дополнительная информация
+/// note | Дополнительная информация
Если вы планируете использовать алгоритмы цифровой подписи, такие как RSA или ECDSA, вам следует установить зависимость библиотеки криптографии `pyjwt[crypto]`.
@@ -213,7 +213,7 @@ JWT может использоваться и для других целей,
Username: `johndoe`
Password: `secret`
-/// check | Проверка
+/// tip | Подсказка
Обратите внимание, что нигде в коде не используется открытый текст пароля "`secret`", мы используем только его хэшированную версию.
diff --git a/docs/ru/docs/tutorial/security/simple-oauth2.md b/docs/ru/docs/tutorial/security/simple-oauth2.md
index 4ef5109e4..415ef017b 100644
--- a/docs/ru/docs/tutorial/security/simple-oauth2.md
+++ b/docs/ru/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ OAuth2 определяет, что при использовании "password
* `instagram_basic` используется Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` используется Google.
-/// info | Дополнительная информация
+/// note | Примечание
В OAuth2 "scope" — это просто строка, которая указывает требуемое конкретное разрешение.
Не имеет значения, содержит ли она другие символы, например `:`, или является ли это URL.
@@ -68,7 +68,7 @@ OAuth2 определяет, что при использовании "password
* Необязательное поле `client_id` (в нашем примере оно не нужно).
* Необязательное поле `client_secret` (в нашем примере оно не нужно).
-/// info | Дополнительная информация
+/// note | Примечание
`OAuth2PasswordRequestForm` — это не специальный класс для **FastAPI**, как `OAuth2PasswordBearer`.
`OAuth2PasswordBearer` сообщает **FastAPI**, что это схема безопасности. Поэтому она добавляется в OpenAPI соответствующим образом.
@@ -136,7 +136,7 @@ UserInDB(
)
```
-/// info | Дополнительная информация
+/// note | Примечание
Более полное объяснение `**user_dict` можно найти в [документации к **Дополнительным моделям**](../extra-models.md#about-user-in-dict).
///
@@ -182,7 +182,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Дополнительная информация
+/// note | Примечание
Дополнительный HTTP-заголовок `WWW-Authenticate` со значением `Bearer`, который мы здесь возвращаем, также является частью спецификации.
Любой HTTP статус-код 401 "UNAUTHORIZED" должен также возвращать заголовок `WWW-Authenticate`.
diff --git a/docs/ru/docs/tutorial/server-sent-events.md b/docs/ru/docs/tutorial/server-sent-events.md
index be6bd2366..ea49f85c8 100644
--- a/docs/ru/docs/tutorial/server-sent-events.md
+++ b/docs/ru/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@
Это похоже на [Стриминг JSON Lines](stream-json-lines.md), но использует формат `text/event-stream`, который нативно поддерживается браузерами через [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Информация
+/// note | Примечание
Добавлено в FastAPI 0.135.0.
@@ -29,7 +29,7 @@ SSE часто используют для стриминга ответов И
/// tip | Совет
-Если вам нужно стримить бинарные данные, например видео или аудио, посмотрите расширенное руководство: [Stream Data](../advanced/stream-data.md).
+Если вам нужно стримить бинарные данные, например видео или аудио, посмотрите расширенное руководство: [Потоковая передача данных](../advanced/stream-data.md).
///
@@ -113,7 +113,7 @@ SSE работает с любым HTTP-методом, не только с `GE
FastAPI из коробки реализует некоторые лучшие практики для SSE.
-- Отправлять комментарий «ping» для поддержания соединения («keep alive») каждые 15 секунд, когда нет сообщений, чтобы предотвратить закрытие соединения некоторыми прокси, как рекомендовано в [HTML specification: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
+- Отправлять комментарий «ping» для поддержания соединения («keep alive») каждые 15 секунд, когда нет сообщений, чтобы предотвратить закрытие соединения некоторыми прокси, как рекомендовано в [Спецификация HTML: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
- Устанавливать заголовок `Cache-Control: no-cache`, чтобы предотвратить кэширование потока.
- Устанавливать специальный заголовок `X-Accel-Buffering: no`, чтобы предотвратить буферизацию в некоторых прокси, например Nginx.
diff --git a/docs/ru/docs/tutorial/stream-json-lines.md b/docs/ru/docs/tutorial/stream-json-lines.md
index d8bb9132b..a9390685e 100644
--- a/docs/ru/docs/tutorial/stream-json-lines.md
+++ b/docs/ru/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
У вас может быть последовательность данных, которую вы хотите отправлять в «**потоке**». Это можно сделать с помощью **JSON Lines**.
-/// info | Информация
+/// note | Примечание
Добавлено в FastAPI 0.134.0.
@@ -48,7 +48,7 @@ sequenceDiagram
Это очень похоже на JSON-массив (эквивалент списка Python), но вместо того чтобы быть обернутым в `[]` и иметь `,` между элементами, здесь **один JSON-объект на строку**, они разделены символом новой строки.
-/// info | Информация
+/// note | Примечание
Важный момент в том, что ваше приложение сможет по очереди производить каждую строку, пока клиент потребляет предыдущие строки.
diff --git a/docs/ru/docs/tutorial/testing.md b/docs/ru/docs/tutorial/testing.md
index aef7b86de..f7367bcba 100644
--- a/docs/ru/docs/tutorial/testing.md
+++ b/docs/ru/docs/tutorial/testing.md
@@ -8,7 +8,7 @@
## Использование класса `TestClient` { #using-testclient }
-/// info | Информация
+/// note | Примечание
Для использования класса `TestClient` сначала установите [`httpx`](https://www.python-httpx.org).
@@ -144,7 +144,7 @@ $ pip install httpx
Для получения дополнительной информации о передаче данных на бэкенд с помощью `httpx` или `TestClient` ознакомьтесь с [документацией HTTPX](https://www.python-httpx.org).
-/// info | Информация
+/// note | Примечание
Обратите внимание, что `TestClient` принимает данные, которые можно конвертировать в JSON, но не модели Pydantic.
diff --git a/docs/tr/docs/advanced/additional-responses.md b/docs/tr/docs/advanced/additional-responses.md
index 92999b287..8bf1ea7cd 100644
--- a/docs/tr/docs/advanced/additional-responses.md
+++ b/docs/tr/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@ Bu response `dict`'lerinin her birinde, `response_model`'e benzer şekilde bir P
///
-/// info | Bilgi
+/// note | Not
`model` anahtarı OpenAPI'nin bir parçası değildir.
@@ -183,7 +183,7 @@ Görseli `FileResponse` kullanarak doğrudan döndürmeniz gerektiğine dikkat e
///
-/// info | Bilgi
+/// note | Not
`responses` parametrenizde açıkça farklı bir media type belirtmediğiniz sürece FastAPI, response'un ana response class'ı ile aynı media type'a sahip olduğunu varsayar (varsayılan `application/json`).
diff --git a/docs/tr/docs/advanced/advanced-dependencies.md b/docs/tr/docs/advanced/advanced-dependencies.md
index 24453f689..5a75042e6 100644
--- a/docs/tr/docs/advanced/advanced-dependencies.md
+++ b/docs/tr/docs/advanced/advanced-dependencies.md
@@ -98,7 +98,7 @@ Bu değişiklik aynı zamanda şunu da ifade ediyordu: `StreamingResponse` dönd
Bu davranış 0.118.0'da geri alındı ve `yield` sonrasındaki çıkış kodunun, response gönderildikten sonra çalıştırılması sağlandı.
-/// info | Bilgi
+/// note | Not
Aşağıda göreceğiniz gibi, bu davranış 0.106.0 sürümünden önceki davranışa oldukça benzer; ancak köşe durumlar için çeşitli iyileştirmeler ve bug fix'ler içerir.
diff --git a/docs/tr/docs/advanced/custom-response.md b/docs/tr/docs/advanced/custom-response.md
index 73ac29b16..537290eb5 100644
--- a/docs/tr/docs/advanced/custom-response.md
+++ b/docs/tr/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@ Kısaca, en yüksek performansı istiyorsanız bir [Response Model](../tutorial/
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | Bilgi
+/// note | Not
`response_class` parametresi, response’un "media type"’ını tanımlamak için de kullanılır.
@@ -65,7 +65,7 @@ Yukarıdaki örneğin aynısı, bu sefer bir `HTMLResponse` döndürerek, şöyl
///
-/// info | Bilgi
+/// note | Not
Elbette gerçek `Content-Type` header’ı, status code vb. değerler, döndürdüğünüz `Response` objesinden gelir.
diff --git a/docs/tr/docs/advanced/dataclasses.md b/docs/tr/docs/advanced/dataclasses.md
index 998ccea8a..150d0080a 100644
--- a/docs/tr/docs/advanced/dataclasses.md
+++ b/docs/tr/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ Ve elbette aynı özellikleri destekler:
Bu, Pydantic model'lerinde olduğu gibi çalışır. Aslında arka planda da aynı şekilde, Pydantic kullanılarak yapılır.
-/// info | Bilgi
+/// note | Not
Dataclass'ların, Pydantic model'lerinin yapabildiği her şeyi yapamadığını unutmayın.
diff --git a/docs/tr/docs/advanced/events.md b/docs/tr/docs/advanced/events.md
index c66342213..bc3b0ef58 100644
--- a/docs/tr/docs/advanced/events.md
+++ b/docs/tr/docs/advanced/events.md
@@ -120,7 +120,7 @@ Uygulama kapanırken çalıştırılacak bir fonksiyon eklemek için, `"shutdown
Burada `shutdown` event handler fonksiyonu, `log.txt` dosyasına `"Application shutdown"` satırını yazar.
-/// info | Bilgi
+/// note | Not
`open()` fonksiyonunda `mode="a"` "append" anlamına gelir; yani satır, önceki içeriği silmeden dosyada ne varsa onun sonuna eklenir.
@@ -152,7 +152,7 @@ Meraklı nerd’ler için küçük bir teknik detay. 🤓
Altta, ASGI teknik spesifikasyonunda bu, [Lifespan Protokolü](https://asgi.readthedocs.io/en/latest/specs/lifespan.html)’nün bir parçasıdır ve `startup` ile `shutdown` adında event’ler tanımlar.
-/// info | Bilgi
+/// note | Not
Starlette `lifespan` handler’ları hakkında daha fazlasını [Starlette Lifespan dokümanları](https://www.starlette.dev/lifespan/) içinde okuyabilirsiniz.
diff --git a/docs/tr/docs/advanced/generate-clients.md b/docs/tr/docs/advanced/generate-clients.md
index 80b5f6bbb..68cb4ab0d 100644
--- a/docs/tr/docs/advanced/generate-clients.md
+++ b/docs/tr/docs/advanced/generate-clients.md
@@ -31,7 +31,6 @@ Sponsor olmaları aynı zamanda FastAPI **topluluğuna** (size) güçlü bir ba
Örneğin şunları deneyebilirsiniz:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
Bu çözümlerin bazıları açık kaynak olabilir veya ücretsiz katman sunabilir; yani finansal bir taahhüt olmadan deneyebilirsiniz. Başka ticari SDK üreteçleri de vardır ve internette bulunabilir. 🤓
diff --git a/docs/tr/docs/advanced/openapi-callbacks.md b/docs/tr/docs/advanced/openapi-callbacks.md
index 627e6cb6c..023d97587 100644
--- a/docs/tr/docs/advanced/openapi-callbacks.md
+++ b/docs/tr/docs/advanced/openapi-callbacks.md
@@ -173,7 +173,7 @@ Bu noktada, yukarıda oluşturduğunuz callback router'ında gerekli callback *p
/// tip | İpucu
-`callback=` içine router'ın kendisini (`invoices_callback_router`) değil, `invoices_callback_router.routes` şeklinde `.routes` attribute'unu verdiğinize dikkat edin.
+`callback=` içine router'ın kendisini (`invoices_callback_router`) değil, `invoices_callback_router.routes` şeklinde `.routes` attribute'unu verdiğinize dikkat edin. FastAPI bu route'ları callback OpenAPI dokümantasyonunu üretmek için kullanacaktır.
///
diff --git a/docs/tr/docs/advanced/openapi-webhooks.md b/docs/tr/docs/advanced/openapi-webhooks.md
index a9f21662c..eda5ba218 100644
--- a/docs/tr/docs/advanced/openapi-webhooks.md
+++ b/docs/tr/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@ Webhook'lar için URL'lerin nasıl kaydedileceğine dair tüm **mantık** ve bu
Bu, kullanıcılarınızın **webhook** request'lerinizi alacak şekilde **API'lerini implement etmesini** çok daha kolaylaştırabilir; hatta kendi API kodlarının bir kısmını otomatik üretebilirler.
-/// info | Bilgi
+/// note | Not
Webhook'lar OpenAPI 3.1.0 ve üzeri sürümlerde mevcuttur; FastAPI `0.99.0` ve üzeri tarafından desteklenir.
@@ -36,7 +36,7 @@ Bir **FastAPI** uygulaması oluşturduğunuzda, *webhook*'ları tanımlamak içi
Tanımladığınız webhook'lar **OpenAPI** şemasında ve otomatik **docs UI**'da yer alır.
-/// info | Bilgi
+/// note | Not
`app.webhooks` nesnesi aslında sadece bir `APIRouter`'dır; uygulamanızı birden fazla dosya ile yapılandırırken kullanacağınız türün aynısıdır.
diff --git a/docs/tr/docs/advanced/path-operation-advanced-configuration.md b/docs/tr/docs/advanced/path-operation-advanced-configuration.md
index 00ce76588..c5d682af7 100644
--- a/docs/tr/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/tr/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@ Bunun her operation için benzersiz olduğundan emin olmanız gerekir.
### operationId olarak *path operation function* adını kullanma { #using-the-path-operation-function-name-as-the-operationid }
-API’lerinizin function adlarını `operationId` olarak kullanmak istiyorsanız, hepsini dolaşıp her *path operation*’ın `operation_id` değerini `APIRoute.name` ile override edebilirsiniz.
+API’lerinizin function adlarını `operationId` olarak kullanmak istiyorsanız, `FastAPI`'ye özel bir `generate_unique_id_function` geçebilirsiniz.
-Bunu, tüm *path operation*’ları ekledikten sonra yapmalısınız.
+Bu function her bir `APIRoute`'u alır ve ilgili *path operation* için kullanılacak `operationId`'yi döndürür.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | İpucu
-
-`app.openapi()` fonksiyonunu manuel olarak çağırıyorsanız, bunu yapmadan önce `operationId`’leri güncellemelisiniz.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Uyarı
diff --git a/docs/tr/docs/advanced/response-directly.md b/docs/tr/docs/advanced/response-directly.md
index 8db51e351..ce48cf44c 100644
--- a/docs/tr/docs/advanced/response-directly.md
+++ b/docs/tr/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@ Ayrıca doğrudan bir `JSONResponse` oluşturup döndürebilirsiniz.
Aslında herhangi bir `Response` veya onun herhangi bir alt sınıfını döndürebilirsiniz.
-/// info | Bilgi
+/// note | Not
`JSONResponse` zaten `Response`'un bir alt sınıfıdır.
diff --git a/docs/tr/docs/advanced/security/oauth2-scopes.md b/docs/tr/docs/advanced/security/oauth2-scopes.md
index 6ac6ea6c1..c5de15f8d 100644
--- a/docs/tr/docs/advanced/security/oauth2-scopes.md
+++ b/docs/tr/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ Genellikle belirli güvenlik izinlerini tanımlamak için kullanılır, örneği
* `instagram_basic` Facebook / Instagram tarafından kullanılır.
* `https://www.googleapis.com/auth/drive` Google tarafından kullanılır.
-/// info | Bilgi
+/// note | Not
OAuth2'de "scope", gereken belirli bir izni bildiren bir string'den ibarettir.
@@ -126,7 +126,7 @@ Burada, **FastAPI**'nin farklı seviyelerde tanımlanan scope'ları nasıl ele a
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | Teknik Detaylar
+/// note | Teknik Detaylar
`Security` aslında `Depends`'in bir alt sınıfıdır ve sadece birazdan göreceğimiz bir ek parametreye sahiptir.
diff --git a/docs/tr/docs/advanced/stream-data.md b/docs/tr/docs/advanced/stream-data.md
index 4310edc35..a71bb3217 100644
--- a/docs/tr/docs/advanced/stream-data.md
+++ b/docs/tr/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@ Veriyi JSON olarak yapılandırabiliyorsanız, [JSON Lines Akışı](../tutorial
Ancak saf ikili (binary) veri ya da string akıtmak istiyorsanız, bunu şöyle yapabilirsiniz.
-/// info | Bilgi
+/// note | Not
FastAPI 0.134.0 ile eklendi.
@@ -90,7 +90,7 @@ Bu özel örnekte o kadar da önemli değil, çünkü sahte ve bellekte (yani `i
Ve birçok durumda, diskte ya da ağda okundukları için, okumak engelleyici (event loop'u bloke edebilen) bir işlem olabilir.
-/// info | Bilgi
+/// note | Not
Yukarıdaki örnek aslında bir istisna; çünkü `io.BytesIO` nesnesi zaten bellekte, dolayısıyla onu okumak hiçbir şeyi bloke etmez.
diff --git a/docs/tr/docs/advanced/strict-content-type.md b/docs/tr/docs/advanced/strict-content-type.md
index 94716e31f..93c23b83b 100644
--- a/docs/tr/docs/advanced/strict-content-type.md
+++ b/docs/tr/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ Content-Type header’ı göndermeyen client’ları desteklemeniz gerekiyorsa,
Bu ayarla, Content-Type header’ı olmayan request’lerin body’si JSON olarak parse edilir. Bu, FastAPI’nin eski sürümlerindeki davranışla aynıdır.
-/// info | Bilgi
+/// note | Not
Bu davranış ve yapılandırma FastAPI 0.132.0’da eklendi.
diff --git a/docs/tr/docs/advanced/websockets.md b/docs/tr/docs/advanced/websockets.md
index d15d63559..103a0aa18 100644
--- a/docs/tr/docs/advanced/websockets.md
+++ b/docs/tr/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ Diğer FastAPI endpoint'leri/*path operations* ile aynı şekilde çalışırlar
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note
Bu bir WebSocket olduğu için `HTTPException` raise etmek pek anlamlı değildir; bunun yerine `WebSocketException` raise ederiz.
diff --git a/docs/tr/docs/advanced/wsgi.md b/docs/tr/docs/advanced/wsgi.md
index 06a3f2834..84eb7981a 100644
--- a/docs/tr/docs/advanced/wsgi.md
+++ b/docs/tr/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@ Bunun için `WSGIMiddleware`'ı kullanabilir ve bunu WSGI uygulamanızı (örne
## `WSGIMiddleware` Kullanımı { #using-wsgimiddleware }
-/// info
+/// note | Not
Bunun için `a2wsgi` kurulmalıdır; örneğin `pip install a2wsgi` ile.
@@ -20,7 +20,7 @@ Ve sonra bunu bir path'in altına mount edin.
{* ../../docs_src/wsgi/tutorial001_py310.py hl[1,3,23] *}
-/// note
+/// note | Not
Önceden, `fastapi.middleware.wsgi` içindeki `WSGIMiddleware`'ın kullanılması öneriliyordu, ancak artık kullanımdan kaldırıldı.
diff --git a/docs/tr/docs/deployment/docker.md b/docs/tr/docs/deployment/docker.md
index 0b2da213c..3f73ec1ef 100644
--- a/docs/tr/docs/deployment/docker.md
+++ b/docs/tr/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | Bilgi
+/// note | Not
Paket bağımlılıklarını tanımlamak ve yüklemek için başka formatlar ve araçlar da vardır.
@@ -556,7 +556,7 @@ Container kullanıyorsanız (örn. Docker, Kubernetes), temelde iki yaklaşım v
**Birden fazla container**'ınız varsa ve muhtemelen her biri **tek process** çalıştırıyorsa (ör. bir **Kubernetes** cluster'ında), replication yapılan worker container'lar çalışmadan **önce**, **başlatmadan önceki adımlar**ın işini yapan **ayrı bir container** kullanmak isteyebilirsiniz (tek container, tek process).
-/// info | Bilgi
+/// note | Not
Kubernetes kullanıyorsanız, bu muhtemelen bir [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) olur.
diff --git a/docs/tr/docs/deployment/fastapicloud.md b/docs/tr/docs/deployment/fastapicloud.md
index 890e31915..eecf25d66 100644
--- a/docs/tr/docs/deployment/fastapicloud.md
+++ b/docs/tr/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-FastAPI uygulamanızı [FastAPI Cloud](https://fastapicloud.com)'a **tek bir komutla** deploy edebilirsiniz. Henüz yapmadıysanız gidip bekleme listesine katılın. 🚀
-
-## Giriş Yapma { #login }
-
-Önceden bir **FastAPI Cloud** hesabınız olduğundan emin olun (sizi bekleme listesinden davet ettik 😉).
-
-Ardından giriş yapın:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## Deploy { #deploy }
-
-Şimdi uygulamanızı **tek bir komutla** deploy edin:
+FastAPI uygulamanızı [FastAPI Cloud](https://fastapicloud.com)'a yalnızca **tek bir komutla** deploy edebilirsiniz. 🚀
@@ -36,20 +16,22 @@ Deploying to FastAPI Cloud...
+CLI, FastAPI uygulamanızı otomatik olarak algılar ve buluta deploy eder. Giriş yapmadıysanız, kimlik doğrulamasını tamamlamak için tarayıcınız açılır.
+
Hepsi bu! Artık uygulamanıza o URL üzerinden erişebilirsiniz. ✨
## FastAPI Cloud Hakkında { #about-fastapi-cloud }
**[FastAPI Cloud](https://fastapicloud.com)**, **FastAPI**'nin arkasındaki aynı yazar ve ekip tarafından geliştirilmiştir.
-Bir API'yi minimum eforla **geliştirme**, **deploy etme** ve **erişilebilir kılma** sürecini sadeleştirir.
+Bir API'yi minimum eforla **geliştirme**, **deploy etme** ve **erişim** süreçlerini sadeleştirir.
FastAPI ile uygulama geliştirirken elde ettiğiniz aynı **developer experience**'ı, onları buluta **deploy etmeye** de taşır. 🎉
Ayrıca bir uygulamayı deploy ederken ihtiyaç duyacağınız pek çok şeyi de sizin için halleder; örneğin:
* HTTPS
-* Replication (çoğaltma), request'lere göre autoscaling ile
+* Replication, request'lere göre autoscaling ile
* vb.
FastAPI Cloud, *FastAPI and friends* açık kaynak projelerinin birincil sponsoru ve finansman sağlayıcısıdır. ✨
@@ -62,4 +44,4 @@ FastAPI uygulamalarını deploy etmek için cloud sağlayıcınızın kendi kıl
## Kendi server'ınıza deploy etme { #deploy-your-own-server }
-Bu **Deployment** kılavuzunun ilerleyen bölümlerinde tüm detayları da ele alacağız; böylece neler olduğunu, nelerin gerçekleşmesi gerektiğini ve FastAPI uygulamalarını kendi başınıza (kendi server'larınızla da) nasıl deploy edebileceğinizi anlayacaksınız. 🤓
+Bu **Deployment** kılavuzunun ilerleyen bölümlerinde size tüm detayları da öğreteceğim; böylece neler olduğunu, nelerin gerçekleşmesi gerektiğini ve FastAPI uygulamalarını kendi başınıza, kendi server'larınızla da nasıl deploy edebileceğinizi anlayacaksınız. 🤓
diff --git a/docs/tr/docs/deployment/manually.md b/docs/tr/docs/deployment/manually.md
index 08a548172..de3d14348 100644
--- a/docs/tr/docs/deployment/manually.md
+++ b/docs/tr/docs/deployment/manually.md
@@ -56,7 +56,6 @@ Buna alternatif birkaç seçenek daha vardır, örneğin:
* [Hypercorn](https://hypercorn.readthedocs.io/): diğer özelliklerin yanında HTTP/2 ve Trio ile uyumlu bir ASGI server.
* [Daphne](https://github.com/django/daphne): Django Channels için geliştirilmiş ASGI server.
* [Granian](https://github.com/emmett-framework/granian): Python uygulamaları için bir Rust HTTP server.
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit, hafif ve çok yönlü bir web uygulaması runtime'ıdır.
## Sunucu Makinesi ve Sunucu Programı { #server-machine-and-server-program }
diff --git a/docs/tr/docs/deployment/server-workers.md b/docs/tr/docs/deployment/server-workers.md
index 0cb9831a8..878048e32 100644
--- a/docs/tr/docs/deployment/server-workers.md
+++ b/docs/tr/docs/deployment/server-workers.md
@@ -17,7 +17,7 @@ Uygulamaları deploy ederken, çok çekirdekten (multiple cores) faydalanmak ve
Burada, `fastapi` komutunu kullanarak ya da `uvicorn` komutunu doğrudan çalıştırarak worker process'lerle Uvicorn'u nasıl kullanacağınızı göstereceğim.
-/// info | Bilgi
+/// note | Not
Container kullanıyorsanız (örneğin Docker veya Kubernetes ile), bununla ilgili daha fazlasını bir sonraki bölümde anlatacağım: [Container'larda FastAPI - Docker](docker.md).
diff --git a/docs/tr/docs/how-to/extending-openapi.md b/docs/tr/docs/how-to/extending-openapi.md
index 7fe8649e1..bbda88ca2 100644
--- a/docs/tr/docs/how-to/extending-openapi.md
+++ b/docs/tr/docs/how-to/extending-openapi.md
@@ -25,9 +25,17 @@ Ve `get_openapi()` fonksiyonu şu parametreleri alır:
* `openapi_version`: Kullanılan OpenAPI specification sürümü. Varsayılan olarak en günceli: `3.1.0`.
* `summary`: API'nin kısa özeti.
* `description`: API'nizin açıklaması; markdown içerebilir ve dokümanlarda gösterilir.
-* `routes`: route'ların listesi; bunların her biri kayıtlı *path operations*'lardır. `app.routes` içinden alınırlar.
+* `routes`: Uygulamadan gelen route'lar; `app.routes` içinden alınır. FastAPI, kayıtlı *path operations*'ları toplamak için bunları kullanır; eklenen router'lardan gelenler de dahildir.
-/// info | Bilgi
+/// tip | Teknik Detaylar
+
+`app.routes` daha alt seviyede bir route ağacıdır. Yalnızca son `APIRoute` objelerini değil, FastAPI'nin dahili olarak eklenen router'lar için kullandığı aday route'ları da içerebilir.
+
+Yine de `app.routes`'i `get_openapi()`'ye geçebilirsiniz. FastAPI, etkili path operation'ları toplamak için bu route ağacını gezecektir.
+
+///
+
+/// note | Bilgi
`summary` parametresi OpenAPI 3.1.0 ve üzeri sürümlerde vardır; FastAPI 0.99.0 ve üzeri tarafından desteklenmektedir.
diff --git a/docs/tr/docs/how-to/separate-openapi-schemas.md b/docs/tr/docs/how-to/separate-openapi-schemas.md
index c26411d29..c2948269b 100644
--- a/docs/tr/docs/how-to/separate-openapi-schemas.md
+++ b/docs/tr/docs/how-to/separate-openapi-schemas.md
@@ -85,7 +85,7 @@ Bunun muhtemelen en yaygın nedeni, halihazırda autogenerated client kodların
Bu durumda **FastAPI**'de bu özelliği `separate_input_output_schemas=False` parametresiyle kapatabilirsiniz.
-/// info | Bilgi
+/// note | Not
`separate_input_output_schemas` desteği FastAPI `0.102.0` sürümünde eklendi. 🤓
diff --git a/docs/tr/docs/index.md b/docs/tr/docs/index.md
index f6101be0d..edc8a5138 100644
--- a/docs/tr/docs/index.md
+++ b/docs/tr/docs/index.md
@@ -492,9 +492,7 @@ Daha fazla özellik içeren daha kapsamlı bir örnek için
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+CLI, FastAPI uygulamanızı otomatik olarak algılar ve cloud'a deploy eder. Giriş yapmadıysanız, kimlik doğrulama sürecini tamamlamak için tarayıcınız açılır.
+
Hepsi bu! Artık uygulamanıza bu URL'den erişebilirsiniz. ✨
#### FastAPI Cloud hakkında { #about-fastapi-cloud }
diff --git a/docs/tr/docs/tutorial/bigger-applications.md b/docs/tr/docs/tutorial/bigger-applications.md
index fb0d2e73d..b44d5bb9b 100644
--- a/docs/tr/docs/tutorial/bigger-applications.md
+++ b/docs/tr/docs/tutorial/bigger-applications.md
@@ -44,7 +44,7 @@ from app.routers import items
///
* `app` dizini her şeyi içerir. Ayrıca boş bir `app/__init__.py` dosyası olduğu için bir "Python package" (bir "Python module" koleksiyonu) olur: `app`.
-* İçinde bir `app/main.py` dosyası vardır. Bir Python package'in (içinde `__init__.py` dosyası olan bir dizinin) içinde olduğundan, o package'in bir "module"’üdür: `app.main`.
+* İçinde bir `app/main.py` dosyası vardır. Bir Python package’in (içinde `__init__.py` dosyası olan bir dizinin) içinde olduğundan, o package’in bir "module"’üdür: `app.main`.
* Benzer şekilde `app/dependencies.py` dosyası da bir "module"’dür: `app.dependencies`.
* `app/routers/` adında bir alt dizin vardır ve içinde başka bir `__init__.py` dosyası bulunur; dolayısıyla bu bir "Python subpackage"’dir: `app.routers`.
* `app/routers/items.py` dosyası `app/routers/` package’i içinde olduğundan bir submodule’dür: `app.routers.items`.
@@ -77,7 +77,7 @@ Diyelim ki sadece kullanıcıları yönetmeye ayrılmış dosyanız `/app/router
Kullanıcılarla ilgili *path operation*’ları, kodun geri kalanından ayrı tutmak istiyorsunuz; böylece düzenli kalır.
-Ancak bu hâlâ aynı **FastAPI** uygulaması/web API’sinin bir parçasıdır (aynı "Python Package" içinde).
+Namun bu hâlâ aynı **FastAPI** uygulaması/web API’sinin bir parçasıdır (aynı "Python Package" içinde).
Bu module için *path operation*’ları `APIRouter` kullanarak oluşturabilirsiniz.
@@ -123,7 +123,7 @@ Bu yüzden onları ayrı bir `dependencies` module’üne koyuyoruz (`app/depend
Örneği basit tutmak için uydurma bir header kullanıyoruz.
-Ancak gerçek senaryolarda, entegre [Security yardımcı araçlarını](security/index.md) kullanarak daha iyi sonuç alırsınız.
+Namun gerçek senaryolarda, entegre [Security yardımcı araçlarını](security/index.md) kullanarak daha iyi sonuç alırsınız.
///
@@ -230,7 +230,7 @@ from .dependencies import get_token_header
* `dependencies` module’ünü bul (`app/routers/dependencies.py` gibi hayali bir dosya)...
* ve oradan `get_token_header` function’ını import et.
-Ama o dosya yok; bizim dependency’lerimiz `app/dependencies.py` dosyasında.
+Namun o dosya yok; bizim dependency’lerimiz `app/dependencies.py` dosyasında.
Uygulama/dosya yapımızın nasıl göründüğünü hatırlayın:
@@ -396,17 +396,17 @@ Böylece o router içindeki tüm route’lar uygulamanın bir parçası olarak d
/// note | Teknik Detaylar
-Aslında içeride, `APIRouter` içinde tanımlanan her *path operation* için bir *path operation* oluşturur.
+Router ana uygulamaya dahil edildiğinde FastAPI, orijinal `APIRouter`’ı ve içindeki `APIRoute`’ları etkin tutar.
-Yani perde arkasında, her şey tek bir uygulamaymış gibi çalışır.
+Bu da, özel (custom) `APIRouter` ve `APIRoute` alt sınıflarının, router dahil edildikten sonra da işleyişe katılabileceği anlamına gelir.
///
/// tip | İpucu
-Router’ları dahil ederken performans konusunda endişelenmeniz gerekmez.
+Router’ları dahil ederken performans konusunda endişelenmeyin.
-Bu işlem mikrosaniyeler sürer ve sadece startup sırasında olur.
+Bu mekanizma hafif olacak ve her request'e ek yük bindirmeyecek şekilde tasarlanmıştır.
Dolayısıyla performansı etkilemez. ⚡
@@ -437,7 +437,7 @@ Sonuç olarak, uygulamamızda `admin` module’ündeki her bir *path operation*
* `get_token_header` dependency’si.
* `418` response’u. 🍵
-Ancak bu sadece bizim uygulamamızdaki o `APIRouter` için geçerlidir; onu kullanan diğer kodlar için değil.
+Namun bu sadece bizim uygulamamızdaki o `APIRouter` için geçerlidir; onu kullanan diğer kodlar için değil.
Dolayısıyla örneğin diğer projeler aynı `APIRouter`’ı farklı bir authentication yöntemiyle kullanabilir.
@@ -453,15 +453,15 @@ ve `app.include_router()` ile eklenen diğer tüm *path operation*’larla birli
/// note | Çok Teknik Detaylar
-**Not**: Bu oldukça teknik bir detay; büyük ihtimalle **direkt geçebilirsiniz**.
+Not: Bu, muhtemelen doğrudan atlayabileceğiniz oldukça teknik bir detaydır.
---
`APIRouter`’lar "mount" edilmez; uygulamanın geri kalanından izole değildir.
-Çünkü *path operation*’larını OpenAPI şemasına ve kullanıcı arayüzlerine dahil etmek istiyoruz.
+Bunun nedeni, onların *path operation*’larını OpenAPI şemasına ve kullanıcı arayüzlerine dahil etmek istememizdir.
-Onları tamamen izole edip bağımsız şekilde "mount" edemediğimiz için, *path operation*’lar doğrudan eklenmek yerine "klonlanır" (yeniden oluşturulur).
+FastAPI, orijinal router’ları ve *path operation*’ları etkin tutar; istekleri işlerken ve OpenAPI üretirken router prefix’lerini, dependency’leri, tag’leri, responses’ları ve diğer metaverileri birleştirir.
///
@@ -490,7 +490,7 @@ Komuta dosya yolunu da verebilirsiniz, örneğin:
$ fastapi dev app/main.py
```
-Ama o zaman her `fastapi` komutunu çalıştırdığınızda doğru yolu hatırlayıp geçirmeniz gerekir.
+Namun o zaman her `fastapi` komutunu çalıştırdığınızda doğru yolu hatırlayıp geçirmeniz gerekir.
Ayrıca, diğer araçlar uygulamayı bulamayabilir; örneğin [VS Code Eklentisi](../editor-support.md) veya [FastAPI Cloud](https://fastapicloud.com). Bu yüzden `pyproject.toml` içinde `entrypoint` kullanmanız önerilir.
@@ -532,4 +532,16 @@ Bir `APIRouter`’ı `FastAPI` uygulamasına dahil ettiğiniz gibi, bir `APIRout
router.include_router(other_router)
```
-`router`’ı `FastAPI` uygulamasına dahil etmeden önce bunu yaptığınızdan emin olun; böylece `other_router` içindeki *path operation*’lar da dahil edilmiş olur.
+Bunu, `router`’ı `FastAPI` uygulamasına dahil etmeden önce de sonra da yapabilirsiniz. FastAPI, `other_router` içindeki *path operation*’ları yönlendirmeye (routing) ve OpenAPI’ye yine dahil eder.
+
+Aynı şey, router’lara daha sonra eklenen *path operation*’lar için de geçerlidir. Önceden yapılmış dahil etme üzerinden de görünür olurlar.
+
+/// warning | Teknik Detaylar
+
+Bir router’ı dahil ettikten sonra `router.routes`’i doğrudan değiştirmekten kaçının. FastAPI, router dahilini canlı (live) kabul eder; bu nedenle orijinal router ve içindeki route’lar, yönlendirme ve OpenAPI üretiminin bir parçası olarak kalır.
+
+Route ve router eklemek için path operation decorator’ları ve `.include_router()` gibi belgelenmiş API’leri kullanın.
+
+`router.routes`’i, route tanımlarını ve dahil edilmiş router’ları barındırabilen daha alt seviye bir route ağacı olarak düşünün; bunu nihai *path operation*’ların düz bir listesiymiş gibi kullanmaktan kaçının.
+
+///
diff --git a/docs/tr/docs/tutorial/body-multiple-params.md b/docs/tr/docs/tutorial/body-multiple-params.md
index 4cd381b86..be6ab676d 100644
--- a/docs/tr/docs/tutorial/body-multiple-params.md
+++ b/docs/tr/docs/tutorial/body-multiple-params.md
@@ -111,7 +111,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Bilgi
+/// note | Not
`Body`, `Query`, `Path` ve daha sonra göreceğiniz diğerleriyle aynı ek validasyon ve metadata parametrelerine de sahiptir.
@@ -126,7 +126,7 @@ Varsayılan olarak **FastAPI**, body'nin doğrudan bu modelin içeriği olmasın
Ancak, ek body parametreleri tanımladığınızda olduğu gibi, `item` anahtarı olan bir JSON ve onun içinde modelin içeriğini beklemesini istiyorsanız, `Body`'nin özel parametresi olan `embed`'i kullanabilirsiniz:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
yani şöyle:
diff --git a/docs/tr/docs/tutorial/body-nested-models.md b/docs/tr/docs/tutorial/body-nested-models.md
index 4f078e035..bcf3057ef 100644
--- a/docs/tr/docs/tutorial/body-nested-models.md
+++ b/docs/tr/docs/tutorial/body-nested-models.md
@@ -135,7 +135,7 @@ Bu, aşağıdaki gibi bir JSON body bekler (dönüştürür, doğrular, doküman
}
```
-/// info | Bilgi
+/// note | Not
`images` key’inin artık image object’lerinden oluşan bir list içerdiğine dikkat edin.
@@ -147,7 +147,7 @@ Bu, aşağıdaki gibi bir JSON body bekler (dönüştürür, doğrular, doküman
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Bilgi
+/// note | Not
`Offer`’ın bir `Item` list’i olduğuna, `Item`’ların da opsiyonel bir `Image` list’ine sahip olduğuna dikkat edin.
diff --git a/docs/tr/docs/tutorial/body.md b/docs/tr/docs/tutorial/body.md
index 26f51ffec..74b3d3707 100644
--- a/docs/tr/docs/tutorial/body.md
+++ b/docs/tr/docs/tutorial/body.md
@@ -8,7 +8,7 @@ API'niz neredeyse her zaman bir **response** body göndermek zorundadır. Ancak
Bir **request** body tanımlamak için, tüm gücü ve avantajlarıyla [Pydantic](https://docs.pydantic.dev/) modellerini kullanırsınız.
-/// info | Bilgi
+/// note | Not
Veri göndermek için şunlardan birini kullanmalısınız: `POST` (en yaygını), `PUT`, `DELETE` veya `PATCH`.
diff --git a/docs/tr/docs/tutorial/cookie-param-models.md b/docs/tr/docs/tutorial/cookie-param-models.md
index 0fa399c6a..9b4984bcf 100644
--- a/docs/tr/docs/tutorial/cookie-param-models.md
+++ b/docs/tr/docs/tutorial/cookie-param-models.md
@@ -6,7 +6,7 @@ Bu sayede **model'i yeniden kullanabilir**, **birden fazla yerde** tekrar tekrar
/// note | Not
-This is supported since FastAPI version `0.115.0`. 🤓
+Bu özellik FastAPI'nin `0.115.0` sürümünden itibaren desteklenmektedir. 🤓
///
@@ -32,7 +32,7 @@ Tanımlanan cookie'leri `/docs` altındaki docs UI'da görebilirsiniz:
-/// info | Bilgi
+/// note | Not
Tarayıcıların cookie'leri özel biçimlerde ve arka planda yönetmesi nedeniyle, **JavaScript**'in cookie'lere erişmesine kolayca izin vermediğini aklınızda bulundurun.
diff --git a/docs/tr/docs/tutorial/cookie-params.md b/docs/tr/docs/tutorial/cookie-params.md
index 28b57fd7e..2cec37fd0 100644
--- a/docs/tr/docs/tutorial/cookie-params.md
+++ b/docs/tr/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@ Ancak `fastapi`'dan `Query`, `Path`, `Cookie` ve diğerlerini import ettiğinizd
///
-/// info | Bilgi
+/// note | Not
Cookie'leri tanımlamak için `Cookie` kullanmanız gerekir, aksi halde parametreler query parametreleri olarak yorumlanır.
///
-/// info | Bilgi
+/// note | Not
**Tarayıcılar cookie'leri** özel şekillerde ve arka planda işlediği için, **JavaScript**'in onlara dokunmasına kolayca izin **vermezler**.
diff --git a/docs/tr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/tr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index 8764d736f..caafcafaa 100644
--- a/docs/tr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/tr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@ Ayrıca kodunuzda kullanılmayan bir parametreyi gören yeni geliştiricilerin b
///
-/// info | Bilgi
+/// note | Not
Bu örnekte uydurma özel header'lar olan `X-Key` ve `X-Token` kullanıyoruz.
diff --git a/docs/tr/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/tr/docs/tutorial/dependencies/dependencies-with-yield.md
index 5ed7660c5..7f56a95c7 100644
--- a/docs/tr/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/tr/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -1,6 +1,6 @@
# `yield` ile Dependency'ler { #dependencies-with-yield }
-FastAPI, işini bitirdikten sonra ek adımlar çalıştıran dependency'leri destekler.
+FastAPI, işini bitirdikten sonra ek adımlar çalıştıran dependency'leri destekler.
Bunu yapmak için `return` yerine `yield` kullanın ve ek adımları (kodu) `yield` satırından sonra yazın.
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info | Bilgi
+/// note | Not
Client'a yalnızca **tek bir response** gönderilir. Bu, error response'lardan biri olabilir ya da *path operation*'dan dönen response olabilir.
diff --git a/docs/tr/docs/tutorial/dependencies/index.md b/docs/tr/docs/tutorial/dependencies/index.md
index 6cf626e05..21809fc0a 100644
--- a/docs/tr/docs/tutorial/dependencies/index.md
+++ b/docs/tr/docs/tutorial/dependencies/index.md
@@ -51,7 +51,7 @@ Bu örnekte, bu dependency şunları bekler:
Sonra da bu değerleri içeren bir `dict` döndürür.
-/// info | Bilgi
+/// note | Not
FastAPI, `Annotated` desteğini 0.95.0 sürümünde ekledi (ve önermeye başladı).
@@ -106,7 +106,7 @@ common_parameters --> read_users
Bu şekilde paylaşılan kodu bir kez yazarsınız ve onu *path operation*'larda çağırma işini **FastAPI** halleder.
-/// check | Ek bilgi
+/// tip | İpucu
Dikkat edin: Bunu "register" etmek ya da benzeri bir şey yapmak için özel bir class oluşturup **FastAPI**'ye bir yere geçirmeniz gerekmez.
diff --git a/docs/tr/docs/tutorial/dependencies/sub-dependencies.md b/docs/tr/docs/tutorial/dependencies/sub-dependencies.md
index ab196d829..706b5a4f7 100644
--- a/docs/tr/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/tr/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@ Sonra bu bağımlılığı şöyle kullanabiliriz:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | Bilgi
+/// note | Not
Dikkat edin, *path operation function* içinde yalnızca tek bir bağımlılık tanımlıyoruz: `query_or_cookie_extractor`.
diff --git a/docs/tr/docs/tutorial/first-steps.md b/docs/tr/docs/tutorial/first-steps.md
index 0ffa28dbf..1d5cf6fbc 100644
--- a/docs/tr/docs/tutorial/first-steps.md
+++ b/docs/tr/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ Bu da şuna eşdeğer olur:
from backend.main import app
```
-### Path ile `fastapi dev` { #fastapi-dev-with-path }
+### Path ile veya `--entrypoint` CLI seçeneğiyle `fastapi dev` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
Dosya path'ini `fastapi dev` komutuna da verebilirsiniz; hangi FastAPI app objesini kullanacağını tahmin eder:
@@ -188,29 +188,19 @@ Dosya path'ini `fastapi dev` komutuna da verebilirsiniz; hangi FastAPI app objes
$ fastapi dev main.py
```
-Ancak `fastapi` komutunu her çağırdığınızda doğru path'i geçmeyi hatırlamanız gerekir.
-
-Ayrıca, [VS Code Eklentisi](../editor-support.md) veya [FastAPI Cloud](https://fastapicloud.com) gibi başka araçlar da onu bulamayabilir; bu yüzden `pyproject.toml` içindeki `entrypoint`'i kullanmanız önerilir.
-
-### Uygulamanızı Yayınlayın (opsiyonel) { #deploy-your-app-optional }
-
-İsterseniz FastAPI uygulamanızı [FastAPI Cloud](https://fastapicloud.com)'a deploy edebilirsiniz; henüz katılmadıysanız gidip bekleme listesine yazılın. 🚀
-
-Zaten bir **FastAPI Cloud** hesabınız varsa (bekleme listesinden sizi davet ettiysek 😉), uygulamanızı tek komutla deploy edebilirsiniz.
-
-Deploy etmeden önce giriş yaptığınızdan emin olun:
-
-
+Veya `fastapi dev` komutuna `--entrypoint` seçeneğini de geçebilirsiniz:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+Ancak `fastapi` komutunu her çağırdığınızda doğru path'i veya entrypoint'i geçmeyi hatırlamanız gerekir.
+
+Ayrıca, [VS Code Eklentisi](../editor-support.md) veya [FastAPI Cloud](https://fastapicloud.com) gibi başka araçlar da onu bulamayabilir; bu yüzden `pyproject.toml` içindeki `entrypoint`'i kullanmanız önerilir.
-Ardından uygulamanızı deploy edin:
+### Uygulamanızı Yayınlayın (opsiyonel) { #deploy-your-app-optional }
+
+İsterseniz FastAPI uygulamanızı [FastAPI Cloud](https://fastapicloud.com)'a tek komutla deploy edebilirsiniz. 🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+CLI, FastAPI uygulamanızı otomatik olarak algılar ve buluta deploy eder. Giriş yapmadıysanız, kimlik doğrulama işlemini tamamlamak için tarayıcınız açılır.
+
Bu kadar! Artık uygulamanıza o URL üzerinden erişebilirsiniz. ✨
## Adım Adım Özetleyelim { #recap-step-by-step }
@@ -270,7 +262,7 @@ https://example.com/items/foo
/items/foo
```
-/// info | Bilgi
+/// note | Not
Bir "path" genellikle "endpoint" veya "route" olarak da adlandırılır.
@@ -322,7 +314,7 @@ Biz de bunlara "**operation**" diyeceğiz.
* path `/`
* get operation kullanarak
-/// info | `@decorator` Bilgisi
+/// note | `@decorator` Bilgisi
Python'daki `@something` söz dizimi "decorator" olarak adlandırılır.
diff --git a/docs/tr/docs/tutorial/metadata.md b/docs/tr/docs/tutorial/metadata.md
index a8d44570f..5ed3f8580 100644
--- a/docs/tr/docs/tutorial/metadata.md
+++ b/docs/tr/docs/tutorial/metadata.md
@@ -74,9 +74,9 @@ Kullandığınız tüm tag'ler için metadata eklemek zorunda değilsiniz.
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | Bilgi
+/// note | Not
-Tag'ler hakkında daha fazlası için: [Path Operation Configuration](path-operation-configuration.md#tags).
+Tag'ler hakkında daha fazlası için: [Path Operation Yapılandırması](path-operation-configuration.md#tags).
///
diff --git a/docs/tr/docs/tutorial/path-operation-configuration.md b/docs/tr/docs/tutorial/path-operation-configuration.md
index 3653090af..75057bb26 100644
--- a/docs/tr/docs/tutorial/path-operation-configuration.md
+++ b/docs/tr/docs/tutorial/path-operation-configuration.md
@@ -66,19 +66,19 @@ Interactive docs’ta şöyle kullanılacaktır:
-## Response description { #response-description }
+## Response Açıklaması { #response-description }
`response_description` parametresi ile response açıklamasını belirtebilirsiniz:
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Bilgi
+/// note | Not
`response_description` özellikle response’u ifade eder; `description` ise genel olarak *path operation*’ı ifade eder.
///
-/// check | Ek bilgi
+/// tip | İpucu
OpenAPI, her *path operation* için bir response description zorunlu kılar.
diff --git a/docs/tr/docs/tutorial/path-params-numeric-validations.md b/docs/tr/docs/tutorial/path-params-numeric-validations.md
index 43da894bb..1e6121f99 100644
--- a/docs/tr/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/tr/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Bilgi
+/// note | Not
FastAPI, 0.95.0 sürümünde `Annotated` desteğini ekledi (ve bunu önermeye başladı).
@@ -56,7 +56,7 @@ Dolayısıyla fonksiyonunuzu şöyle tanımlayabilirsiniz:
{* ../../docs_src/path_params_numeric_validations/tutorial002_py310.py hl[7] *}
-Namun şunu unutmayın: `Annotated` kullanırsanız bu problem olmaz; çünkü `Query()` veya `Path()` için fonksiyon parametresi default değerlerini kullanmıyorsunuz.
+Ancak şunu unutmayın: `Annotated` kullanırsanız bu problem olmaz; çünkü `Query()` veya `Path()` için fonksiyon parametresi default değerlerini kullanmıyorsunuz.
{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py310.py *}
@@ -131,7 +131,7 @@ Ayrıca sayısal doğrulamalar da tanımlayabilirsiniz:
* `lt`: `l`ess `t`han
* `le`: `l`ess than or `e`qual
-/// info | Bilgi
+/// note | Not
`Query`, `Path` ve ileride göreceğiniz diğer class'lar ortak bir `Param` class'ının alt class'larıdır.
diff --git a/docs/tr/docs/tutorial/path-params.md b/docs/tr/docs/tutorial/path-params.md
index c29d8567e..d1a9b6fca 100644
--- a/docs/tr/docs/tutorial/path-params.md
+++ b/docs/tr/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@ Standart Python tip belirteçlerini kullanarak path parametresinin tipini fonksi
Bu durumda, `item_id` bir `int` olarak tanımlanır.
-/// check | Ek bilgi
+/// tip | İpucu
Bu sayede, fonksiyon içinde hata denetimi, kod tamamlama vb. konularda editör desteğine kavuşursunuz.
@@ -34,7 +34,7 @@ Bu örneği çalıştırıp tarayıcınızda [http://127.0.0.1:8000/items/3](htt
{"item_id":3}
```
-/// check | Ek bilgi
+/// tip | İpucu
Dikkat edin: fonksiyonunuzun aldığı (ve döndürdüğü) değer olan `3`, string `"3"` değil, bir Python `int`'idir.
@@ -66,7 +66,7 @@ Ancak tarayıcınızda [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/i
Aynı hata, şu örnekte olduğu gibi `int` yerine `float` verirseniz de ortaya çıkar: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Ek bilgi
+/// tip | İpucu
Yani, aynı Python tip tanımıyla birlikte **FastAPI** size veri doğrulama sağlar.
@@ -82,7 +82,7 @@ Tarayıcınızı [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) adresi
-/// check | Ek bilgi
+/// tip | İpucu
Yine, sadece aynı Python tip tanımıyla **FastAPI** size otomatik ve interaktif dokümantasyon (Swagger UI entegrasyonuyla) sağlar.
diff --git a/docs/tr/docs/tutorial/query-params-str-validations.md b/docs/tr/docs/tutorial/query-params-str-validations.md
index 7012cca20..7abea5a2f 100644
--- a/docs/tr/docs/tutorial/query-params-str-validations.md
+++ b/docs/tr/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ Bunu yapmak için önce şunları import edin:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Bilgi
+/// note | Not
FastAPI, 0.95.0 sürümünde `Annotated` desteğini ekledi (ve önermeye başladı).
@@ -348,7 +348,7 @@ O zaman bir `alias` tanımlayabilirsiniz; bu alias, parametre değerini bulmak i
Diyelim ki artık bu parametreyi istemiyorsunuz.
-Bazı client’lar hâlâ kullandığı için bir süre tutmanız gerekiyor, ama dokümanların bunu açıkça deprecated olarak göstermesini istiyorsunuz.
+Bazı client’lar hâlâ kullandığı için bir süre tutmanız gerekiyor, ama dokümanların bunu açıkça kullanımdan kalkmış olarak göstermesini istiyorsunuz.
O zaman `Query`’ye `deprecated=True` parametresini geçin:
@@ -382,7 +382,7 @@ Pydantic’te [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/vali
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Bilgi
+/// note | Not
Bu özellik Pydantic 2 ve üzeri sürümlerde mevcuttur. 😎
diff --git a/docs/tr/docs/tutorial/query-params.md b/docs/tr/docs/tutorial/query-params.md
index fa485f51a..56e191f05 100644
--- a/docs/tr/docs/tutorial/query-params.md
+++ b/docs/tr/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ Aynı şekilde, varsayılan değerlerini `None` yaparak isteğe bağlı query pa
Bu durumda, fonksiyon parametresi `q` isteğe bağlı olur ve varsayılan olarak `None` olur.
-/// check | Ek bilgi
+/// tip | İpucu
Ayrıca, **FastAPI** path parametresi olan `item_id`'nin bir path parametresi olduğunu ve `q`'nun path olmadığını fark edecek kadar akıllıdır; dolayısıyla bu bir query parametresidir.
diff --git a/docs/tr/docs/tutorial/request-files.md b/docs/tr/docs/tutorial/request-files.md
index 0ba4f8af6..d1f4656d9 100644
--- a/docs/tr/docs/tutorial/request-files.md
+++ b/docs/tr/docs/tutorial/request-files.md
@@ -2,11 +2,11 @@
İstemcinin upload edeceği dosyaları `File` kullanarak tanımlayabilirsiniz.
-/// info | Bilgi
+/// note | Not
Upload edilen dosyaları alabilmek için önce [`python-multipart`](https://github.com/Kludex/python-multipart) yükleyin.
-Bir [virtual environment](../virtual-environments.md) oluşturduğunuzdan, aktive ettiğinizden ve ardından paketi yüklediğinizden emin olun. Örneğin:
+Bir [Sanal ortam](../virtual-environments.md) oluşturduğunuzdan, aktive ettiğinizden ve ardından paketi yüklediğinizden emin olun. Örneğin:
```console
$ pip install python-multipart
@@ -28,7 +28,7 @@ Bunun nedeni, upload edilen dosyaların "form data" olarak gönderilmesidir.
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Bilgi
+/// note | Not
`File`, doğrudan `Form`’dan türeyen bir sınıftır.
diff --git a/docs/tr/docs/tutorial/request-form-models.md b/docs/tr/docs/tutorial/request-form-models.md
index 30fdaee13..6f5532b58 100644
--- a/docs/tr/docs/tutorial/request-form-models.md
+++ b/docs/tr/docs/tutorial/request-form-models.md
@@ -2,11 +2,11 @@
FastAPI'de **form field**'larını tanımlamak için **Pydantic model**'lerini kullanabilirsiniz.
-/// info | Bilgi
+/// note | Not
Form'ları kullanmak için önce [`python-multipart`](https://github.com/Kludex/python-multipart)'ı yükleyin.
-Bir [virtual environment](../virtual-environments.md) oluşturduğunuzdan, onu etkinleştirdiğinizden ve ardından paketi kurduğunuzdan emin olun. Örneğin:
+Bir [Sanal ortam](../virtual-environments.md) oluşturduğunuzdan, onu etkinleştirdiğinizden ve ardından paketi kurduğunuzdan emin olun. Örneğin:
```console
$ pip install python-multipart
diff --git a/docs/tr/docs/tutorial/request-forms-and-files.md b/docs/tr/docs/tutorial/request-forms-and-files.md
index 96f5adcc2..fc50491ce 100644
--- a/docs/tr/docs/tutorial/request-forms-and-files.md
+++ b/docs/tr/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
`File` ve `Form` kullanarak aynı anda hem dosyaları hem de form alanlarını tanımlayabilirsiniz.
-/// info | Bilgi
+/// note | Not
Yüklenen dosyaları ve/veya form verisini almak için önce [`python-multipart`](https://github.com/Kludex/python-multipart) paketini kurun.
diff --git a/docs/tr/docs/tutorial/request-forms.md b/docs/tr/docs/tutorial/request-forms.md
index 0b2f39f13..12139992f 100644
--- a/docs/tr/docs/tutorial/request-forms.md
+++ b/docs/tr/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
JSON yerine form alanlarını almanız gerektiğinde `Form` kullanabilirsiniz.
-/// info | Bilgi
+/// note | Not
Formları kullanmak için önce [`python-multipart`](https://github.com/Kludex/python-multipart) paketini kurun.
@@ -28,11 +28,11 @@ Form parametrelerini `Body` veya `Query` için yaptığınız gibi oluşturun:
Örneğin OAuth2 spesifikasyonunun kullanılabileceği ("password flow" olarak adlandırılan) yollardan birinde, form alanları olarak bir `username` ve `password` göndermek zorunludur.
-Spesifikasyon, alanların adının tam olarak `username` ve `password` olmasını ve JSON değil form alanları olarak gönderilmesini gerektirir.
+spesifikasyon, alanların adının tam olarak `username` ve `password` olmasını ve JSON değil form alanları olarak gönderilmesini gerektirir.
`Form` ile `Body` (ve `Query`, `Path`, `Cookie`) ile yaptığınız aynı konfigürasyonları tanımlayabilirsiniz; validasyon, örnekler, alias (örn. `username` yerine `user-name`) vb. dahil.
-/// info | Bilgi
+/// note | Not
`Form`, doğrudan `Body`'den miras alan bir sınıftır.
@@ -62,7 +62,7 @@ Bu encoding'ler ve form alanları hakkında daha fazla okumak isterseniz, [
-/// check | Authorize butonu!
+/// tip | Authorize butonu!
Artık parıl parıl yeni bir "Authorize" butonunuz var.
@@ -118,7 +118,7 @@ O yüzden basitleştirilmiş bu bakış açısından üzerinden geçelim:
Bu örnekte **OAuth2**’yi, **Password** flow ile, **Bearer** token kullanarak uygulayacağız. Bunu `OAuth2PasswordBearer` sınıfı ile yaparız.
-/// info | Bilgi
+/// note | Not
"Bearer" token tek seçenek değildir.
@@ -140,7 +140,7 @@ Burada `tokenUrl="token"`, henüz oluşturmadığımız göreli bir URL olan `to
Göreli URL kullandığımız için, API’niz `https://example.com/` adresinde olsaydı `https://example.com/token` anlamına gelirdi. Ama API’niz `https://example.com/api/v1/` adresinde olsaydı, bu kez `https://example.com/api/v1/token` anlamına gelirdi.
-Göreli URL kullanmak, [Behind a Proxy](../../advanced/behind-a-proxy.md) gibi daha ileri kullanım senaryolarında bile uygulamanızın çalışmaya devam etmesini garanti etmek açısından önemlidir.
+Göreli URL kullanmak, [Bir Proxy Arkasında](../../advanced/behind-a-proxy.md) gibi daha ileri kullanım senaryolarında bile uygulamanızın çalışmaya devam etmesini garanti etmek açısından önemlidir.
///
@@ -148,7 +148,7 @@ Bu parametre o endpoint’i / *path operation*’ı oluşturmaz; fakat `/token`
Birazdan gerçek path operation’ı da oluşturacağız.
-/// info | Teknik Detaylar
+/// note | Teknik Detaylar
Eğer çok katı bir "Pythonista" iseniz, `token_url` yerine `tokenUrl` şeklindeki parametre adlandırma stilini sevmeyebilirsiniz.
@@ -176,7 +176,7 @@ Bu dependency, *path operation function* içindeki `token` parametresine atanaca
**FastAPI**, bu dependency’yi OpenAPI şemasında (ve otomatik API dokümanlarında) bir "security scheme" tanımlamak için kullanabileceğini bilir.
-/// info | Teknik Detaylar
+/// note | Teknik Detaylar
**FastAPI**, bir dependency içinde tanımlanan `OAuth2PasswordBearer` sınıfını OpenAPI’de security scheme tanımlamak için kullanabileceğini bilir; çünkü bu sınıf `fastapi.security.oauth2.OAuth2`’den kalıtım alır, o da `fastapi.security.base.SecurityBase`’den kalıtım alır.
diff --git a/docs/tr/docs/tutorial/security/get-current-user.md b/docs/tr/docs/tutorial/security/get-current-user.md
index cc7f7a51b..429f6dcc9 100644
--- a/docs/tr/docs/tutorial/security/get-current-user.md
+++ b/docs/tr/docs/tutorial/security/get-current-user.md
@@ -52,7 +52,7 @@ Burada `Depends` kullandığınız için **FastAPI** karışıklık yaşamaz.
///
-/// check | Ek bilgi
+/// tip | İpucu
Bu dependency sisteminin tasarımı, hepsi `User` modeli döndüren farklı dependency'lere (farklı "dependable"lara) sahip olmamıza izin verir.
diff --git a/docs/tr/docs/tutorial/security/oauth2-jwt.md b/docs/tr/docs/tutorial/security/oauth2-jwt.md
index 4b68bc451..077d23f1b 100644
--- a/docs/tr/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/tr/docs/tutorial/security/oauth2-jwt.md
@@ -18,7 +18,7 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4
Şifrelenmiş değildir; yani herkes içeriğindeki bilgiyi geri çıkarabilir.
-Ancak imzalanmıştır. Bu yüzden, sizin ürettiğiniz bir token'ı aldığınızda, gerçekten onu sizin ürettiğinizi doğrulayabilirsiniz.
+Namun imzalanmıştır. Bu yüzden, sizin ürettiğiniz bir token'ı aldığınızda, gerçekten onu sizin ürettiğinizi doğrulayabilirsiniz.
Bu şekilde, örneğin 1 haftalık süre sonu (expiration) olan bir token oluşturabilirsiniz. Sonra kullanıcı ertesi gün token ile geri geldiğinde, kullanıcının hâlâ sisteminizde oturum açmış olduğunu bilirsiniz.
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | Bilgi
+/// note | Not
RSA veya ECDSA gibi dijital imza algoritmaları kullanmayı planlıyorsanız, `pyjwt[crypto]` bağımlılığı olan `cryptography` kütüphanesini kurmalısınız.
@@ -213,7 +213,7 @@ Uygulamayı, öncekiyle aynı şekilde authorize edin.
Username: `johndoe`
Password: `secret`
-/// check | Ek bilgi
+/// tip | İpucu
Kodun hiçbir yerinde düz metin password "`secret`" yok; sadece hash'lenmiş hâli var.
diff --git a/docs/tr/docs/tutorial/security/simple-oauth2.md b/docs/tr/docs/tutorial/security/simple-oauth2.md
index 9893cc800..961e70400 100644
--- a/docs/tr/docs/tutorial/security/simple-oauth2.md
+++ b/docs/tr/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ Genelde belirli güvenlik izinlerini (permission) belirtmek için kullanılırla
* `instagram_basic` Facebook / Instagram tarafından kullanılır.
* `https://www.googleapis.com/auth/drive` Google tarafından kullanılır.
-/// info | Bilgi
+/// note | Not
OAuth2’de bir "scope", gerekli olan belirli bir izni ifade eden basit bir string’dir.
@@ -72,7 +72,7 @@ Bunu zorlamak istiyorsanız, `OAuth2PasswordRequestForm` yerine `OAuth2PasswordR
* Opsiyonel `client_id` (bu örnekte ihtiyacımız yok).
* Opsiyonel `client_secret` (bu örnekte ihtiyacımız yok).
-/// info | Bilgi
+/// note | Not
`OAuth2PasswordRequestForm`, `OAuth2PasswordBearer` gibi **FastAPI**’ye özel “özel bir sınıf” değildir.
@@ -144,7 +144,7 @@ UserInDB(
)
```
-/// info | Bilgi
+/// note | Not
`**user_dict` için daha kapsamlı bir açıklama için [**Extra Models** dokümantasyonundaki ilgili bölüme](../extra-models.md#about-user-in-dict) geri dönüp bakın.
@@ -196,7 +196,7 @@ Dolayısıyla endpoint’imizde kullanıcıyı ancak kullanıcı varsa, doğru
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Bilgi
+/// note | Not
Burada `Bearer` değerine sahip ek `WWW-Authenticate` header’ını döndürmemiz de spesifikasyonun bir parçasıdır.
diff --git a/docs/tr/docs/tutorial/server-sent-events.md b/docs/tr/docs/tutorial/server-sent-events.md
index 385541012..5f3621de4 100644
--- a/docs/tr/docs/tutorial/server-sent-events.md
+++ b/docs/tr/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@
Bu, [JSON Lines Akışı](stream-json-lines.md) ile benzerdir ancak tarayıcılar tarafından yerel olarak desteklenen [`EventSource` API'si](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) ile `text/event-stream` formatını kullanır.
-/// info | Bilgi
+/// note | Not
FastAPI 0.135.0'da eklendi.
diff --git a/docs/tr/docs/tutorial/stream-json-lines.md b/docs/tr/docs/tutorial/stream-json-lines.md
index 200689d71..d9755d168 100644
--- a/docs/tr/docs/tutorial/stream-json-lines.md
+++ b/docs/tr/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
Bir veri dizisini “akış” olarak göndermek istediğiniz durumlar olabilir; bunu **JSON Lines** ile yapabilirsiniz.
-/// info | Bilgi
+/// note | Not
FastAPI 0.134.0 ile eklendi.
@@ -48,7 +48,7 @@ Response’un `application/json` yerine `application/jsonl` içerik türü (Cont
Bir JSON dizisine (Python list eşdeğeri) çok benzer; ancak öğeler `[]` içine alınmak ve araya `,` konmak yerine, her satırda **bir JSON nesnesi** vardır; bunlar yeni satır karakteri ile ayrılır.
-/// info | Bilgi
+/// note | Not
Önemli nokta, uygulamanız her satırı sırayla üretebilirken, istemcinin de önceki satırları tüketmeye devam edebilmesidir.
diff --git a/docs/tr/docs/tutorial/testing.md b/docs/tr/docs/tutorial/testing.md
index c5f8692f7..4e223d983 100644
--- a/docs/tr/docs/tutorial/testing.md
+++ b/docs/tr/docs/tutorial/testing.md
@@ -8,7 +8,7 @@ Bununla birlikte **FastAPI** ile [pytest](https://docs.pytest.org/)'i doğrudan
## `TestClient` Kullanımı { #using-testclient }
-/// info | Bilgi
+/// note | Not
`TestClient` kullanmak için önce [`httpx`](https://www.python-httpx.org)'i kurun.
@@ -141,7 +141,7 @@ Sonra testlerinizde aynısını uygularsınız.
Backend'e veri geçme hakkında daha fazla bilgi için (`httpx` veya `TestClient` kullanarak) [HTTPX dokümantasyonu](https://www.python-httpx.org)'na bakın.
-/// info | Bilgi
+/// note | Not
`TestClient`'ın Pydantic model'lerini değil, JSON'a dönüştürülebilen verileri aldığını unutmayın.
diff --git a/docs/uk/docs/advanced/additional-responses.md b/docs/uk/docs/advanced/additional-responses.md
index 2d2005837..3b30645f6 100644
--- a/docs/uk/docs/advanced/additional-responses.md
+++ b/docs/uk/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@
///
-/// info | Інформація
+/// note | Примітка
Ключ `model` не є частиною OpenAPI.
@@ -183,7 +183,7 @@
///
-/// info | Інформація
+/// note | Примітка
Поки ви явно не вкажете інший тип медіа в параметрі `responses`, FastAPI вважатиме, що відповідь має той самий тип медіа, що й основний клас відповіді (типово `application/json`).
diff --git a/docs/uk/docs/advanced/advanced-dependencies.md b/docs/uk/docs/advanced/advanced-dependencies.md
index 48a10ba4d..2fd7b96f0 100644
--- a/docs/uk/docs/advanced/advanced-dependencies.md
+++ b/docs/uk/docs/advanced/advanced-dependencies.md
@@ -52,7 +52,7 @@ checker(q="somequery")
{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[22] *}
-/// tip | Порада
+/// tip
Усе це може здаватися надуманим. І поки що може бути не дуже зрозуміло, навіщо це корисно.
@@ -66,7 +66,7 @@ checker(q="somequery")
## Залежності з `yield`, `HTTPException`, `except` та фоновими задачами { #dependencies-with-yield-httpexception-except-and-background-tasks }
-/// warning | Попередження
+/// warning
Найімовірніше, вам не знадобляться ці технічні деталі.
@@ -98,7 +98,7 @@ checker(q="somequery")
Цю поведінку змінено у 0.118.0: завершальний код після `yield` знову виконується після відправлення відповіді.
-/// info | Інформація
+/// note
Як побачите нижче, це дуже схоже на поведінку до версії 0.106.0, але з кількома покращеннями та виправленнями помилок у крайових випадках.
@@ -150,7 +150,7 @@ checker(q="somequery")
У **FastAPI** 0.106.0 це змінено, щоб не утримувати ресурси під час очікування, поки відповідь піде мережею.
-/// tip | Порада
+/// tip
Крім того, фонова задача зазвичай є незалежним набором логіки, який слід обробляти окремо, з власними ресурсами (наприклад, власним з'єднанням з базою даних).
diff --git a/docs/uk/docs/advanced/custom-response.md b/docs/uk/docs/advanced/custom-response.md
index 4ed7616bf..aa4c39ee0 100644
--- a/docs/uk/docs/advanced/custom-response.md
+++ b/docs/uk/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | Інформація
+/// note | Примітка
Параметр `response_class` також визначатиме «медіа-тип» відповіді.
@@ -65,7 +65,7 @@
///
-/// info | Інформація
+/// note | Примітка
Звісно, фактичні заголовок `Content-Type`, код статусу тощо прийдуть з об'єкта `Response`, який ви повернули.
diff --git a/docs/uk/docs/advanced/dataclasses.md b/docs/uk/docs/advanced/dataclasses.md
index 1c91304b0..57c03c149 100644
--- a/docs/uk/docs/advanced/dataclasses.md
+++ b/docs/uk/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ FastAPI побудовано поверх **Pydantic**, і я показував
Це працює так само, як із моделями Pydantic. Насправді під капотом це також досягається за допомогою Pydantic.
-/// info
+/// note | Примітка
Майте на увазі, що dataclasses не можуть робити все те, що можуть моделі Pydantic.
@@ -64,7 +64,7 @@ Dataclass буде автоматично перетворено на dataclass
6. Тут ми повертаємо словник, що містить `items`, який є списком dataclass.
- FastAPI усе ще здатний серіалізувати дані до JSON.
+ FastAPI усе ще здатний серіалізувати дані до JSON.
7. Тут у `response_model` використано анотацію типу список dataclass `Author`.
diff --git a/docs/uk/docs/advanced/events.md b/docs/uk/docs/advanced/events.md
index 33f6314fe..4a935eeaa 100644
--- a/docs/uk/docs/advanced/events.md
+++ b/docs/uk/docs/advanced/events.md
@@ -120,7 +120,7 @@ async with lifespan(app):
Тут функція-обробник події `shutdown` запише текстовий рядок `"Application shutdown"` у файл `log.txt`.
-/// info | Інформація
+/// note | Примітка
У функції `open()` параметр `mode="a"` означає «append», тож рядок буде додано після всього, що є у файлі, без перезапису попереднього вмісту.
@@ -152,7 +152,7 @@ async with lifespan(app):
Під капотом, у технічній специфікації ASGI, це частина [Протоколу тривалості життя](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), і там визначені події `startup` і `shutdown`.
-/// info | Інформація
+/// note | Примітка
Ви можете прочитати більше про обробники `lifespan` у [документації Starlette про Lifespan](https://www.starlette.dev/lifespan/).
diff --git a/docs/uk/docs/advanced/generate-clients.md b/docs/uk/docs/advanced/generate-clients.md
index d1b7e9c0c..b50bb1524 100644
--- a/docs/uk/docs/advanced/generate-clients.md
+++ b/docs/uk/docs/advanced/generate-clients.md
@@ -31,7 +31,6 @@ FastAPI автоматично генерує специфікації **OpenAPI
Наприклад, ви можете спробувати:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
Деякі з цих рішень також можуть бути з відкритим кодом або мати безкоштовні тарифи, тож ви можете спробувати їх без фінансових зобов'язань. Інші комерційні генератори SDK також доступні й їх можна знайти онлайн. 🤓
diff --git a/docs/uk/docs/advanced/openapi-callbacks.md b/docs/uk/docs/advanced/openapi-callbacks.md
index 5c5c96661..a4bb1c822 100644
--- a/docs/uk/docs/advanced/openapi-callbacks.md
+++ b/docs/uk/docs/advanced/openapi-callbacks.md
@@ -167,13 +167,13 @@ https://www.external.org/events/invoices/2expen51ve
На цьому етапі ви маєте потрібні операції шляху зворотного виклику (ті, які має реалізувати *зовнішній розробник* у *зовнішньому API*) у створеному вище маршрутизаторі зворотного виклику.
-Тепер використайте параметр `callbacks` у декораторі операції шляху вашого API, щоб передати атрибут `.routes` (це насправді просто `list` маршрутів/операцій шляху) з цього маршрутизатора зворотного виклику:
+Тепер використайте параметр `callbacks` у декораторі операції шляху вашого API, щоб передати атрибут `.routes` з цього маршрутизатора зворотного виклику:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | Порада
-Зверніть увагу, що ви передаєте не сам маршрутизатор (`invoices_callback_router`) у `callback=`, а атрибут `.routes`, тобто `invoices_callback_router.routes`.
+Зверніть увагу, що ви передаєте не сам маршрутизатор (`invoices_callback_router`) у `callbacks=`, а його `.routes`, тобто `invoices_callback_router.routes`. FastAPI використає ці маршрути, щоб згенерувати документацію OpenAPI для зворотних викликів.
///
diff --git a/docs/uk/docs/advanced/openapi-webhooks.md b/docs/uk/docs/advanced/openapi-webhooks.md
index bf51f5466..b46b0ce46 100644
--- a/docs/uk/docs/advanced/openapi-webhooks.md
+++ b/docs/uk/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@
Це значно спростить для ваших користувачів **реалізацію їхніх API** для отримання ваших запитів **вебхуків**; вони навіть зможуть згенерувати частину власного коду API автоматично.
-/// info | Інформація
+/// note | Примітка
Вебхуки доступні в OpenAPI 3.1.0 і вище, підтримуються FastAPI `0.99.0` і вище.
@@ -36,7 +36,7 @@
Визначені вами вебхуки потраплять до **схеми OpenAPI** та автоматичного **інтерфейсу документації**.
-/// info | Інформація
+/// note | Примітка
Об'єкт `app.webhooks` насправді є просто `APIRouter` - тим самим типом, який ви використовуєте, структуризуючи застосунок у кількох файлах.
diff --git a/docs/uk/docs/advanced/path-operation-advanced-configuration.md b/docs/uk/docs/advanced/path-operation-advanced-configuration.md
index f760209ab..07508422c 100644
--- a/docs/uk/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/uk/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@
### Використання назви *функції операції шляху* як operationId { #using-the-path-operation-function-name-as-the-operationid }
-Якщо ви хочете використовувати назви функцій ваших API як `operationId`, ви можете пройтися по всіх них і переписати `operation_id` кожної *операції шляху*, використовуючи їхній `APIRoute.name`.
+Якщо ви хочете використовувати назви функцій ваших API як `operationId`, ви можете передати власну `generate_unique_id_function` до `FastAPI`.
-Зробіть це після додавання всіх *операцій шляху*.
+Функція отримує кожен `APIRoute` і повертає `operationId`, який слід використовувати для цієї операції шляху.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Порада
-
-Якщо ви вручну викликаєте `app.openapi()`, оновіть усі `operationId` до цього.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Попередження
diff --git a/docs/uk/docs/advanced/response-directly.md b/docs/uk/docs/advanced/response-directly.md
index 30d8f5860..18318e6f3 100644
--- a/docs/uk/docs/advanced/response-directly.md
+++ b/docs/uk/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@
Ви можете повертати `Response` або будь-який його підклас.
-/// info | Інформація
+/// note | Примітка
`JSONResponse` сам є підкласом `Response`.
diff --git a/docs/uk/docs/advanced/security/oauth2-scopes.md b/docs/uk/docs/advanced/security/oauth2-scopes.md
index 7f5ba9692..769365d24 100644
--- a/docs/uk/docs/advanced/security/oauth2-scopes.md
+++ b/docs/uk/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OAuth2 зі scopes - це механізм, який використовуют
- `instagram_basic` використовується Facebook / Instagram.
- `https://www.googleapis.com/auth/drive` використовується Google.
-/// info | Інформація
+/// note | Примітка
В OAuth2 «scope» - це просто строка, що декларує конкретний потрібний дозвіл.
@@ -126,7 +126,7 @@ OAuth2 зі scopes - це механізм, який використовуют
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | Технічні деталі
+/// note | Технічні деталі
`Security` насправді є підкласом `Depends`, і має лише один додатковий параметр, який ми побачимо пізніше.
diff --git a/docs/uk/docs/advanced/stream-data.md b/docs/uk/docs/advanced/stream-data.md
index 4f12132e0..8ddfa38fb 100644
--- a/docs/uk/docs/advanced/stream-data.md
+++ b/docs/uk/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@
Але якщо ви хочете передавати потоком чисті бінарні дані або строки, ось як це зробити.
-/// info | Інформація
+/// note | Примітка
Додано у FastAPI 0.134.0.
@@ -90,7 +90,7 @@ FastAPI передаватиме кожний фрагмент даних до `
І часто їх читання є блокувальною операцією (що може блокувати цикл подій), адже дані зчитуються з диска або мережі.
-/// info | Інформація
+/// note | Примітка
Наведений вище приклад - виняток, адже об'єкт `io.BytesIO` вже в пам'яті, тож читання нічого не блокує.
diff --git a/docs/uk/docs/advanced/strict-content-type.md b/docs/uk/docs/advanced/strict-content-type.md
index a244ec901..7d3156b09 100644
--- a/docs/uk/docs/advanced/strict-content-type.md
+++ b/docs/uk/docs/advanced/strict-content-type.md
@@ -40,7 +40,7 @@ http://localhost:8000
Використовуючи фронтенд, ви можете змушувати AI-агента виконувати дії від вашого імені.
-Оскільки він працює локально, а не у відкритому інтернеті, ви вирішуєте не налаштовувати жодної автентифікації, просто покладаючись на доступ до локальної мережі.
+Оскільки він працює **локально**, а не у відкритому інтернеті, ви вирішуєте **не налаштовувати жодної автентифікації**, просто покладаючись на доступ до локальної мережі.
Один із ваших користувачів може встановити його і запустити локально.
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
З цим налаштуванням запити без заголовка `Content-Type` матимуть тіло, розібране як JSON, що відповідає поведінці старіших версій FastAPI.
-/// info | Інформація
+/// note | Примітка
Цю поведінку і конфігурацію додано у FastAPI 0.132.0.
diff --git a/docs/uk/docs/advanced/websockets.md b/docs/uk/docs/advanced/websockets.md
index aa290b389..1d96933be 100644
--- a/docs/uk/docs/advanced/websockets.md
+++ b/docs/uk/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ $ fastapi dev
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note
Оскільки це WebSocket, не має сенсу піднімати `HTTPException`, натомість ми піднімаємо `WebSocketException`.
diff --git a/docs/uk/docs/advanced/wsgi.md b/docs/uk/docs/advanced/wsgi.md
index 84d4aa460..51ca6f6fb 100644
--- a/docs/uk/docs/advanced/wsgi.md
+++ b/docs/uk/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@
## Використання `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | Інформація
+/// note | Примітка
Для цього потрібно встановити `a2wsgi`, наприклад за допомогою `pip install a2wsgi`.
diff --git a/docs/uk/docs/deployment/docker.md b/docs/uk/docs/deployment/docker.md
index 9d9afc0d1..ead651b2d 100644
--- a/docs/uk/docs/deployment/docker.md
+++ b/docs/uk/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | Інформація
+/// note | Примітка
Існують інші формати та інструменти для визначення і встановлення залежностей пакетів.
@@ -291,7 +291,7 @@ COPY ./requirements.txt /code/requirements.txt
Docker та інші інструменти збирають ці образи контейнерів інкрементально, додаючи один шар поверх іншого, починаючи з верхньої частини `Dockerfile` і додаючи будь-які файли, створені кожною інструкцією в `Dockerfile`.
-Docker та подібні інструменти також використовують внутрішній кеш під час збірки образу. Якщо файл не змінювався з моменту останньої збірки, тоді він повторно використає той самий шар, створений востаннє, замість копіювання файлу знову та створення нового шару з нуля.
+Docker та подібні інструменти також використовують внутрішній кеш під час збірки образу. Якщо файл не змінювався з моменту останньої збірки, тоді він повторно використає той самий шар, створений востанє, замість копіювання файлу знову та створення нового шару з нуля.
Просте уникнення копіювання файлів не обов’язково суттєво покращує ситуацію, але оскільки для цього кроку використано кеш, він може використати кеш і для наступного кроку. Наприклад, він може використати кеш для інструкції, яка встановлює залежності:
@@ -492,7 +492,7 @@ Traefik має інтеграції з Docker, Kubernetes та іншими, т
Наявність іншого менеджера процесів всередині контейнера (як це було б із кількома працівниками) лише додасть зайвої складності, яку, найімовірніше, ви вже вирішуєте на рівні кластера.
-### Контейнери з кількома процесами та особливі випадки { #containers-with-multiple-processes-and-special-cases }
+### Контейнери з кількоми процесами та особливі випадки { #containers-with-multiple-processes-and-special-cases }
Звісно, є особливі випадки, коли ви можете захотіти мати контейнер із кількома процесами-працівниками Uvicorn всередині.
@@ -556,7 +556,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
Якщо у вас кілька контейнерів, імовірно кожен запускає один процес (наприклад, у кластері Kubernetes), тоді ви, ймовірно, захочете мати окремий контейнер, який виконає попередні кроки в одному контейнері, запустивши один процес, перед запуском реплікованих контейнерів-працівників.
-/// info | Інформація
+/// note | Примітка
Якщо ви використовуєте Kubernetes, це, ймовірно, буде [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/).
diff --git a/docs/uk/docs/deployment/fastapicloud.md b/docs/uk/docs/deployment/fastapicloud.md
index 63d9fa459..cc59caa30 100644
--- a/docs/uk/docs/deployment/fastapicloud.md
+++ b/docs/uk/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-Ви можете розгорнути свій застосунок FastAPI на [FastAPI Cloud](https://fastapicloud.com) **однією командою**, приєднуйтесь до списку очікування, якщо ще ні. 🚀
-
-## Вхід { #login }
-
-Переконайтеся, що у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉).
-
-Потім увійдіть:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## Розгортання { #deploy }
-
-Тепер розгорніть свій застосунок **однією командою**:
+Ви можете розгорнути свій застосунок FastAPI на [FastAPI Cloud](https://fastapicloud.com) лише **однією командою**. 🚀
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
+CLI автоматично визначить ваш застосунок FastAPI та розгорне його у хмарі. Якщо ви не увійшли, ваш браузер відкриється, щоб завершити процес автентифікації.
+
Ось і все! Тепер ви можете отримати доступ до свого застосунку за цим URL. ✨
## Про FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/uk/docs/deployment/manually.md b/docs/uk/docs/deployment/manually.md
index 7ea2c78e3..9a6507403 100644
--- a/docs/uk/docs/deployment/manually.md
+++ b/docs/uk/docs/deployment/manually.md
@@ -56,13 +56,12 @@ FastAPI використовує стандарт для побудови Python
* [Hypercorn](https://hypercorn.readthedocs.io/): ASGI-сервер, сумісний з HTTP/2 і Trio, серед інших можливостей.
* [Daphne](https://github.com/django/daphne): ASGI-сервер, створений для Django Channels.
* [Granian](https://github.com/emmett-framework/granian): Rust HTTP-сервер для Python-застосунків.
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit - легке й універсальне середовище виконання вебзастосунків.
## Серверна машина і серверна програма { #server-machine-and-server-program }
Є невелика деталь щодо назв, яку варто пам'ятати. 💡
-Слово «**сервер**» зазвичай означає і віддалений/хмарний комп'ютер (фізична або віртуальна машина), і програму, що працює на цій машині (наприклад, Uvicorn).
+Слово «сервер» зазвичай означає і віддалений/хмарний комп'ютер (фізична або віртуальна машина), і програму, що працює на цій машині (наприклад, Uvicorn).
Майте на увазі, що коли ви бачите слово «сервер» загалом, воно може стосуватися будь-якого з цих двох значень.
diff --git a/docs/uk/docs/deployment/server-workers.md b/docs/uk/docs/deployment/server-workers.md
index f165bb707..3bbf4454a 100644
--- a/docs/uk/docs/deployment/server-workers.md
+++ b/docs/uk/docs/deployment/server-workers.md
@@ -17,7 +17,7 @@
Тут я покажу, як використовувати Uvicorn із процесами-працівниками за допомогою команди `fastapi` або безпосередньо команди `uvicorn`.
-/// info | Інформація
+/// note | Примітка
Якщо ви використовуєте контейнери, наприклад з Docker або Kubernetes, я розповім про це більше в наступному розділі: [FastAPI у контейнерах - Docker](docker.md).
diff --git a/docs/uk/docs/how-to/extending-openapi.md b/docs/uk/docs/how-to/extending-openapi.md
index fcd0982a9..4267d37b9 100644
--- a/docs/uk/docs/how-to/extending-openapi.md
+++ b/docs/uk/docs/how-to/extending-openapi.md
@@ -25,9 +25,17 @@
- `openapi_version`: Версія специфікації OpenAPI, що використовується. Типово остання: `3.1.0`.
- `summary`: Короткий підсумок API.
- `description`: Опис вашого API; може містити markdown і буде показаний у документації.
-- `routes`: Список маршрутів, це кожна з зареєстрованих *операцій шляху*. Їх беруть з `app.routes`.
+- `routes`: Маршрути із застосунку, взяті з `app.routes`. FastAPI використовує їх для збирання зареєстрованих *операцій шляху*, включно з тими, що з підключених роутерів.
-/// info | Інформація
+/// tip | Технічні деталі
+
+`app.routes` - це нижчорівневе дерево маршрутів. Воно може містити кандидати маршрутів, які FastAPI внутрішньо використовує для підключених роутерів, а не лише кінцеві об'єкти `APIRoute`.
+
+Ви все одно можете передати `app.routes` до `get_openapi()`. FastAPI обійде це дерево маршрутів, щоб зібрати фактичні операції шляху.
+
+///
+
+/// note | Примітка
Параметр `summary` доступний в OpenAPI 3.1.0 і вище, підтримується FastAPI 0.99.0 і вище.
diff --git a/docs/uk/docs/how-to/separate-openapi-schemas.md b/docs/uk/docs/how-to/separate-openapi-schemas.md
index 7e6fcbf5f..3903aac7f 100644
--- a/docs/uk/docs/how-to/separate-openapi-schemas.md
+++ b/docs/uk/docs/how-to/separate-openapi-schemas.md
@@ -1,6 +1,6 @@
# Окремі схеми OpenAPI для введення та виведення, чи ні { #separate-openapi-schemas-for-input-and-output-or-not }
-Відколи вийшов **Pydantic v2**, згенерований OpenAPI став трохи точнішим і більш коректним, ніж раніше. 😎
+Відколи вийшов **Pydantic v2**, згенерований OpenAPI став трохи точнішим і більш **коректним**, ніж раніше. 😎
Насправді подекуди буде навіть **дві схеми JSON** в OpenAPI для тієї самої моделі Pydantic: для введення та для виведення - залежно від наявності значень за замовчуванням.
@@ -84,7 +84,7 @@
У такому разі ви можете вимкнути цю можливість у **FastAPI** параметром `separate_input_output_schemas=False`.
-/// info | Інформація
+/// note | Примітка
Підтримку `separate_input_output_schemas` додано у FastAPI `0.102.0`. 🤓
diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md
index 2b770ff39..bcc429c7e 100644
--- a/docs/uk/docs/index.md
+++ b/docs/uk/docs/index.md
@@ -492,9 +492,7 @@ item: Item
### Розгортання застосунку (необовʼязково) { #deploy-your-app-optional }
-За бажання ви можете розгорнути ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com), перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀
-
-Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.
+За бажання ви можете розгорнути ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com) однією командою. 🚀
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+CLI автоматично визначить ваш застосунок FastAPI і розгорне його в хмарі. Якщо ви не ввійшли в обліковий запис, ваш браузер відкриється для завершення процесу автентифікації.
+
Ось і все! Тепер ви можете отримати доступ до вашого застосунку за цією URL-адресою. ✨
#### Про FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/uk/docs/tutorial/bigger-applications.md b/docs/uk/docs/tutorial/bigger-applications.md
index 3a31ece46..db2bf11c6 100644
--- a/docs/uk/docs/tutorial/bigger-applications.md
+++ b/docs/uk/docs/tutorial/bigger-applications.md
@@ -382,11 +382,11 @@ from .routers.users import router
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *}
-/// note | Примітка
+/// note | Технічні деталі
-`users.router` містить `APIRouter` у файлі `app/routers/users.py`.
+FastAPI зберігає оригінальний `APIRouter` і його `APIRoute` активними після включення router'а до основного застосунку.
-А `items.router` містить `APIRouter` у файлі `app/routers/items.py`.
+Це означає, що користувацькі підкласи `APIRouter` і `APIRoute` і надалі братимуть участь після включення router'а.
///
@@ -394,19 +394,11 @@ from .routers.users import router
Це включить усі маршрути з цього router'а як частину застосунку.
-/// note | Технічні деталі
-
-Фактично, всередині для кожної *операції шляху*, оголошеної в `APIRouter`, буде створена окрема *операція шляху*.
-
-Тобто за лаштунками все працюватиме так, ніби це один і той самий застосунок.
-
-///
-
/// tip | Порада
Вам не потрібно перейматися продуктивністю під час включення router'ів.
-Це займе мікросекунди і відбуватиметься лише під час запуску.
+Це спроєктовано як легковагове рішення і не додає накладних витрат до кожного запиту.
Тож це не вплине на продуктивність. ⚡
@@ -461,7 +453,7 @@ from .routers.users import router
Це тому, що ми хочемо включати їхні *операції шляху* в схему OpenAPI та інтерфейси користувача.
-Оскільки ми не можемо просто ізолювати їх і «змонтувати» незалежно від решти, *операції шляху* «клонуються» (створюються заново), а не включаються безпосередньо.
+FastAPI зберігає оригінальні router'и та операції шляху активними й поєднує префікси router'ів, залежності, мітки, відповіді та інші метадані під час обробки запитів і генерації OpenAPI.
///
@@ -532,4 +524,16 @@ $ fastapi dev
router.include_router(other_router)
```
-Переконайтеся, що ви робите це до включення `router` в застосунок `FastAPI`, щоб *операції шляху* з `other_router` також були включені.
+Ви можете зробити це до або після включення `router` у застосунок `FastAPI`. FastAPI все одно включить *операції шляху* з `other_router` у маршрутизацію та OpenAPI.
+
+Те саме стосується *операцій шляху*, доданих пізніше до router'ів. Вони також будуть видимі через попереднє включення.
+
+/// warning | Технічні деталі
+
+Уникайте прямої мутації `router.routes` після включення router'а. FastAPI розглядає включення router'а як «живе», тому оригінальний router і його маршрути залишаються частиною маршрутизації та генерації OpenAPI.
+
+Використовуйте задокументовані API, такі як декоратори *операцій шляху* і `.include_router()`, щоб додавати маршрути та router'и.
+
+Сприймайте `router.routes` як нижчорівневе дерево маршрутів, яке може містити визначення маршрутів і включені router'и, і уникайте покладатися на нього як на плаский список кінцевих *операцій шляху*.
+
+///
diff --git a/docs/uk/docs/tutorial/body-multiple-params.md b/docs/uk/docs/tutorial/body-multiple-params.md
index a0db2b186..8658e4a9b 100644
--- a/docs/uk/docs/tutorial/body-multiple-params.md
+++ b/docs/uk/docs/tutorial/body-multiple-params.md
@@ -111,7 +111,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Інформація
+/// note | Примітка
`Body` також має всі ті самі додаткові параметри валідації та метаданих, що й `Query`, `Path` та інші, які ви побачите пізніше.
@@ -126,7 +126,7 @@ q: str | None = None
Але якщо ви хочете, щоб він очікував JSON з ключем `item`, а всередині нього - вміст моделі, як це відбувається, коли ви оголошуєте додаткові параметри тіла, ви можете використати спеціальний параметр `Body` - `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
як у прикладі:
diff --git a/docs/uk/docs/tutorial/body-nested-models.md b/docs/uk/docs/tutorial/body-nested-models.md
index 97fea36dc..6919d3e11 100644
--- a/docs/uk/docs/tutorial/body-nested-models.md
+++ b/docs/uk/docs/tutorial/body-nested-models.md
@@ -136,7 +136,7 @@ my_list: list[str]
}
```
-/// info | Інформація
+/// note | Примітка
Зверніть увагу, що тепер ключ `images` містить список об'єктів зображень.
@@ -148,7 +148,7 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Інформація
+/// note | Примітка
Зверніть увагу, що в моделі `Offer` є список `Item`ів, які, своєю чергою, можуть мати необов'язковий список `Image`ів.
diff --git a/docs/uk/docs/tutorial/body.md b/docs/uk/docs/tutorial/body.md
index 91c4b4252..bd1a8f128 100644
--- a/docs/uk/docs/tutorial/body.md
+++ b/docs/uk/docs/tutorial/body.md
@@ -8,7 +8,7 @@
Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://docs.pydantic.dev/) моделі з усією їх потужністю та перевагами.
-/// info | Інформація
+/// note | Примітка
Щоб надіслати дані, ви повинні використовувати один із: `POST` (більш поширений), `PUT`, `DELETE` або `PATCH`.
diff --git a/docs/uk/docs/tutorial/cookie-param-models.md b/docs/uk/docs/tutorial/cookie-param-models.md
index dab57c536..add562dfd 100644
--- a/docs/uk/docs/tutorial/cookie-param-models.md
+++ b/docs/uk/docs/tutorial/cookie-param-models.md
@@ -32,13 +32,13 @@
-/// info | Інформація
+/// note | Примітка
Майте на увазі, що оскільки **браузери обробляють cookies** особливим чином і «за лаштунками», вони **не** дозволяють **JavaScript** легко з ними працювати.
Якщо ви зайдете до **інтерфейсу документації API** за адресою `/docs`, ви зможете побачити **документацію** для cookies у ваших *операціях шляху*.
-Але навіть якщо ви заповните дані й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не будуть відправлені, і ви побачите **помилку**, ніби ви не ввели жодних значень.
+Але навіть якщо ви **заповните дані** й натиснете "Execute", оскільки інтерфейс документації працює з **JavaScript**, cookies не будуть відправлені, і ви побачите **помилку**, ніби ви не ввели жодних значень.
///
@@ -73,4 +73,4 @@
## Підсумок { #summary }
-Ви можете використовувати **Pydantic-моделі** для оголошення **cookies** у **FastAPI**. 😎
+Ви можете використовувати **Pydantic-моделі** для оголошення **кукі** у **FastAPI**. 😎
diff --git a/docs/uk/docs/tutorial/cookie-params.md b/docs/uk/docs/tutorial/cookie-params.md
index 3a2e6fa24..b55c37774 100644
--- a/docs/uk/docs/tutorial/cookie-params.md
+++ b/docs/uk/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@
///
-/// info
+/// note
Для визначення кукі ви маєте використовувати `Cookie`, тому що в іншому випадку параметри будуть інтерпретовані як параметри запиту.
///
-/// info
+/// note
Майте на увазі, що оскільки **браузери обробляють кукі** спеціальним чином і за лаштунками, вони **не** дозволяють **JavaScript** легко взаємодіяти з ними.
diff --git a/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index a82461c8d..f82150919 100644
--- a/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@
///
-/// info | Інформація
+/// note | Примітка
У цьому прикладі ми використовуємо вигадані власні заголовки `X-Key` і `X-Token`.
diff --git a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md
index 53b49e61b..348cbf25b 100644
--- a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info | Інформація
+/// note | Примітка
Лише **одна відповідь** буде надіслана клієнту. Це може бути одна з помилкових відповідей або відповідь від *операції шляху*.
diff --git a/docs/uk/docs/tutorial/dependencies/index.md b/docs/uk/docs/tutorial/dependencies/index.md
index bea5f598d..2021db260 100644
--- a/docs/uk/docs/tutorial/dependencies/index.md
+++ b/docs/uk/docs/tutorial/dependencies/index.md
@@ -51,7 +51,7 @@
Потім вона просто повертає `dict`, що містить ці значення.
-/// info | Інформація
+/// note | Примітка
FastAPI додав підтримку `Annotated` (і почав її рекомендувати) у версії 0.95.0.
@@ -106,7 +106,7 @@ common_parameters --> read_users
Таким чином ви пишете спільний код один раз, а **FastAPI** подбає про його виклик для ваших *операцій шляху*.
-/// check | Перевірте
+/// tip | Порада
Зверніть увагу, що вам не потрібно створювати спеціальний клас і передавати його кудись у **FastAPI**, щоб «зареєструвати» його чи щось подібне.
@@ -138,7 +138,7 @@ commons: Annotated[dict, Depends(common_parameters)]
Залежності продовжать працювати як очікується, і **найкраще** те, що **інформація про типи буде збережена**, а це означає, що ваш редактор зможе й надалі надавати **автозаповнення**, **помилки в рядку** тощо. Те саме і для інших інструментів, як-от `mypy`.
-Це буде особливо корисно у **великій кодовій базі**, де ви використовуєте **одні й ті самі залежності** знову і знову в **багатьох *операціях шляху***.
+Це буде особливо корисно у **великій кодовій базі**, де ви використовуєте **одні й ті ж залежності** знову і знову в **багатьох *операціях шляху***.
## Бути `async` чи не бути `async` { #to-async-or-not-to-async }
diff --git a/docs/uk/docs/tutorial/dependencies/sub-dependencies.md b/docs/uk/docs/tutorial/dependencies/sub-dependencies.md
index 4e7488086..c98d917c1 100644
--- a/docs/uk/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/uk/docs/tutorial/dependencies/sub-dependencies.md
@@ -4,7 +4,7 @@
Вони можуть бути настільки глибокими, наскільки потрібно.
-FastAPI подбає про їх розв'язання.
+**FastAPI** подбає про їх розв'язання.
## Перша залежність «dependable» { #first-dependency-dependable }
@@ -35,11 +35,11 @@ FastAPI подбає про їх розв'язання.
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | Інформація
+/// note | Примітка
Зверніть увагу, що ми оголошуємо лише одну залежність у функції операції шляху — `query_or_cookie_extractor`.
-Але FastAPI знатиме, що спочатку треба розв'язати `query_extractor`, щоб передати його результат у `query_or_cookie_extractor` під час виклику.
+Але **FastAPI** знатиме, що спочатку треба розв'язати `query_extractor`, щоб передати його результат у `query_or_cookie_extractor` під час виклику.
///
@@ -56,7 +56,7 @@ query_extractor --> query_or_cookie_extractor --> read_query
## Використання тієї ж залежності кілька разів { #using-the-same-dependency-multiple-times }
-Якщо одна з ваших залежностей оголошена кілька разів для однієї операції шляху, наприклад, кілька залежностей мають спільну підзалежність, FastAPI знатиме, що цю підзалежність потрібно викликати лише один раз на запит.
+Якщо одна з ваших залежностей оголошена кілька разів для однієї операції шляху, наприклад, кілька залежностей мають спільну підзалежність, **FastAPI** знатиме, що цю підзалежність потрібно викликати лише один раз на запит.
І він збереже повернуте значення у «кеш» і передасть його всім «dependants», яким воно потрібне в цьому конкретному запиті, замість того щоб викликати залежність кілька разів для одного й того ж запиту.
@@ -88,7 +88,7 @@ async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False
## Підсумок { #recap }
-Попри всі модні терміни, система впровадження залежностей досить проста.
+Попри всі модні терміни, система **впровадження залежностей** досить проста.
Це просто функції, які виглядають так само, як функції операцій шляху.
diff --git a/docs/uk/docs/tutorial/first-steps.md b/docs/uk/docs/tutorial/first-steps.md
index 0f46890d9..2557d646c 100644
--- a/docs/uk/docs/tutorial/first-steps.md
+++ b/docs/uk/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ entrypoint = "backend.main:app"
from backend.main import app
```
-### `fastapi dev` із шляхом { #fastapi-dev-with-path }
+### `fastapi dev` із шляхом або з параметром CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
Ви також можете передати шлях до файлу в команду `fastapi dev`, і вона вгадає обʼєкт FastAPI app, який слід використовувати:
@@ -188,29 +188,19 @@ from backend.main import app
$ fastapi dev main.py
```
-Але вам доведеться щоразу памʼятати передавати правильний шлях під час виклику команди `fastapi`.
-
-Крім того, інші інструменти можуть не знайти його, наприклад [Розширення VS Code](../editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендується використовувати `entrypoint` у `pyproject.toml`.
-
-### Розгорніть ваш застосунок (необовʼязково) { #deploy-your-app-optional }
-
-За бажанням ви можете розгорнути ваш FastAPI-застосунок у [FastAPI Cloud](https://fastapicloud.com), перейдіть і приєднайтеся до списку очікування, якщо ви цього ще не зробили. 🚀
-
-Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою.
-
-Перед розгортанням переконайтеся, що ви увійшли:
-
-
+Або ви також можете передати параметр `--entrypoint` команді `fastapi dev`:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+Але вам доведеться щоразу памʼятати передавати правильний шлях\entrypoint під час виклику команди `fastapi`.
+
+Крім того, інші інструменти можуть не знайти його, наприклад [Розширення VS Code](../editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендується використовувати `entrypoint` у `pyproject.toml`.
+
+### Розгорніть ваш застосунок (необовʼязково) { #deploy-your-app-optional }
-Потім розгорніть ваш застосунок:
+За бажанням ви можете розгорнути ваш FastAPI-застосунок у [FastAPI Cloud](https://fastapicloud.com) однією командою. 🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+CLI автоматично визначить ваш застосунок FastAPI і розгорне його в хмарі. Якщо ви не ввійшли, ваш браузер відкриється для завершення процесу автентифікації.
+
Ось і все! Тепер ви можете отримати доступ до вашого застосунку за цим URL. ✨
## Підібʼємо підсумки, крок за кроком { #recap-step-by-step }
@@ -270,7 +262,7 @@ https://example.com/items/foo
/items/foo
```
-/// info
+/// note | Примітка
«Шлях» також зазвичай називають «ендпоінтом» або «маршрутом».
@@ -322,7 +314,7 @@ https://example.com/items/foo
* шляху `/`
* використовуючи get операція
-/// info | `@decorator` Інформація
+/// note | `@decorator` Інформація
Синтаксис `@something` у Python називається «декоратором».
@@ -349,7 +341,7 @@ https://example.com/items/foo
* `@app.patch()`
* `@app.trace()`
-/// tip
+/// tip | Порада
Ви можете використовувати кожну операцію (HTTP-метод) як забажаєте.
@@ -383,7 +375,7 @@ https://example.com/items/foo
{* ../../docs_src/first_steps/tutorial003_py310.py hl[7] *}
-/// note
+/// note | Примітка
Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry).
diff --git a/docs/uk/docs/tutorial/metadata.md b/docs/uk/docs/tutorial/metadata.md
index ee1fdaf6d..d34b83b38 100644
--- a/docs/uk/docs/tutorial/metadata.md
+++ b/docs/uk/docs/tutorial/metadata.md
@@ -1,6 +1,6 @@
# Метадані та URL-адреси документації { #metadata-and-docs-urls }
-Ви можете налаштувати кілька конфігурацій метаданих у Вашому додатку **FastAPI**.
+Ви можете налаштувати кілька конфігурацій метаданих у вашому додатку **FastAPI**.
## Метадані для API { #metadata-for-api }
@@ -11,7 +11,7 @@
| `title` | `str` | Назва API. |
| `summary` | `str` | Короткий підсумок API. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0. |
| `description` | `str` | Короткий опис API. Може використовувати Markdown. |
-| `version` | `string` | Версія API. Це версія Вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. |
+| `version` | `string` | Версія API. Це версія вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. |
| `terms_of_service` | `str` | URL до умов використання API. Якщо вказано, має бути у форматі URL. |
| `contact` | `dict` | Інформація для контакту з опублікованим API. Може містити кілька полів. contact поля
| Параметр | Тип | Опис |
|---|
name | str | Ідентифікаційне ім'я контактної особи або організації. |
url | str | URL, що вказує на контактну інформацію. МАЄ бути у форматі URL. |
email | str | Адреса електронної пошти контактної особи або організації. МАЄ бути у форматі адреси електронної пошти. |
|
| `license_info` | `dict` | Інформація про ліцензію для опублікованого API. Може містити кілька полів. license_info поля
| Параметр | Тип | Опис |
|---|
name | str | ОБОВ'ЯЗКОВО (якщо встановлено license_info). Назва ліцензії для API. |
identifier | str | Ліцензійний вираз за [SPDX](https://spdx.org/licenses/) для API. Поле identifier взаємовиключне з полем url. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | URL до ліцензії, яка використовується для API. МАЄ бути у форматі URL. |
|
@@ -32,7 +32,7 @@
## Ідентифікатор ліцензії { #license-identifier }
-З початку використання OpenAPI 3.1.0 та FastAPI 0.99.0 Ви також можете налаштувати `license_info` за допомогою `identifier` замість `url`.
+З початку використання OpenAPI 3.1.0 та FastAPI 0.99.0 ви також можете налаштувати `license_info` за допомогою `identifier` замість `url`.
Наприклад:
@@ -46,7 +46,7 @@
Кожен словник може містити:
-* `name` (**обов'язково**): `str` з тією ж назвою тегу, яку Ви використовуєте у параметрі `tags` у Ваших *операціях шляху* та `APIRouter`s.
+* `name` (**обов'язково**): `str` з тією ж назвою тегу, яку ви використовуєте у параметрі `tags` у ваших *операціях шляху* та `APIRouter`s.
* `description`: `str` з коротким описом тегу. Може містити Markdown і буде показано в інтерфейсі документації.
* `externalDocs`: `dict`, який описує зовнішню документацію з такими полями:
* `description`: `str` з коротким описом зовнішньої документації.
@@ -64,7 +64,7 @@
/// tip | Порада
-Вам не потрібно додавати метадані для всіх тегів, які Ви використовуєте.
+Вам не потрібно додавати метадані для всіх тегів, які ви використовуєте.
///
@@ -74,7 +74,7 @@
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | Інформація
+/// note | Примітка
Детальніше про теги читайте в розділі [Конфігурація операції шляху](path-operation-configuration.md#tags).
@@ -82,7 +82,7 @@
### Перевірте документацію { #check-the-docs }
-Тепер, якщо Ви перевірите документацію, вона покаже всі додаткові метадані:
+Тепер, якщо ви перевірите документацію, вона покаже всі додаткові метадані:
@@ -96,13 +96,13 @@
За замовчуванням схема OpenAPI надається за адресою `/openapi.json`.
-Але Ви можете налаштувати це за допомогою параметра `openapi_url`.
+Але ви можете налаштувати це за допомогою параметра `openapi_url`.
Наприклад, щоб налаштувати його на `/api/v1/openapi.json`:
{* ../../docs_src/metadata/tutorial002_py310.py hl[3] *}
-Якщо Ви хочете повністю вимкнути схему OpenAPI, Ви можете встановити `openapi_url=None`, це також вимкне інтерфейси документації, які її використовують.
+Якщо ви хочете повністю вимкнути схему OpenAPI, ви можете встановити `openapi_url=None`, це також вимкне інтерфейси документації, які її використовують.
## URL-адреси документації { #docs-urls }
diff --git a/docs/uk/docs/tutorial/path-operation-configuration.md b/docs/uk/docs/tutorial/path-operation-configuration.md
index 292066c1f..47ae65f3e 100644
--- a/docs/uk/docs/tutorial/path-operation-configuration.md
+++ b/docs/uk/docs/tutorial/path-operation-configuration.md
@@ -72,13 +72,13 @@ FastAPI підтримує це так само, як і зі звичайним
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Інформація
+/// note | Примітка
Зверніть увагу, що `response_description` стосується саме відповіді, а `description` стосується «операції шляху» загалом.
///
-/// check | Перевірте
+/// tip | Порада
OpenAPI визначає, що кожна «операція шляху» потребує опису відповіді.
diff --git a/docs/uk/docs/tutorial/path-params-numeric-validations.md b/docs/uk/docs/tutorial/path-params-numeric-validations.md
index 39397a3b1..8320ee8c4 100644
--- a/docs/uk/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/uk/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Інформація
+/// note | Примітка
FastAPI додав підтримку `Annotated` (і почав рекомендувати його використання) у версії 0.95.0.
@@ -131,7 +131,7 @@ Python нічого не зробить із цією `*`, але розпізн
* `lt`: `l`ess `t`han
* `le`: `l`ess than or `e`qual
-/// info | Інформація
+/// note | Примітка
`Query`, `Path` та інші класи, які ви побачите пізніше, є підкласами спільного класу `Param`.
diff --git a/docs/uk/docs/tutorial/path-params.md b/docs/uk/docs/tutorial/path-params.md
index eb05a4412..12fdecae3 100644
--- a/docs/uk/docs/tutorial/path-params.md
+++ b/docs/uk/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@
У цьому випадку `item_id` оголошено як `int`.
-/// check | Перевірте
+/// tip | Порада
Це дасть вам підтримку редактора всередині функції з перевірками помилок, автодоповненням тощо.
@@ -34,7 +34,7 @@
{"item_id":3}
```
-/// check | Перевірте
+/// tip | Порада
Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, — це `3`, як Python `int`, а не рядок `"3"`.
@@ -66,7 +66,7 @@
Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Перевірте
+/// tip | Порада
Отже, з тим самим оголошенням типу в Python **FastAPI** надає вам валідацію даних.
@@ -82,7 +82,7 @@
-/// check | Перевірте
+/// tip | Порада
Знову ж таки, лише з тим самим оголошенням типу в Python **FastAPI** надає вам автоматичну, інтерактивну документацію (з інтеграцією Swagger UI).
diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md
index afe86d482..bca5874c2 100644
--- a/docs/uk/docs/tutorial/query-params-str-validations.md
+++ b/docs/uk/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ FastAPI знатиме, що значення `q` не є обов’язков
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Інформація
+/// note | Примітка
FastAPI додав підтримку `Annotated` (і почав рекомендувати його) у версії 0.95.0.
@@ -381,7 +381,7 @@ Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Інформація
+/// note | Примітка
Це доступно з версії Pydantic 2 або вище. 😎
diff --git a/docs/uk/docs/tutorial/query-params.md b/docs/uk/docs/tutorial/query-params.md
index b665a620e..755b9e21a 100644
--- a/docs/uk/docs/tutorial/query-params.md
+++ b/docs/uk/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ http://127.0.0.1:8000/items/?skip=20
У цьому випадку параметр функції `q` буде необов’язковим і за замовчуванням матиме значення `None`.
-/// check | Перевірте
+/// tip | Порада
Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` — ні, отже, це параметр query.
diff --git a/docs/uk/docs/tutorial/request-files.md b/docs/uk/docs/tutorial/request-files.md
index f81e468d0..b7179c393 100644
--- a/docs/uk/docs/tutorial/request-files.md
+++ b/docs/uk/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Ви можете визначити файли, які будуть завантажуватися клієнтом, використовуючи `File`.
-/// info | Інформація
+/// note | Примітка
Щоб отримувати завантажені файли, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Інформація
+/// note | Примітка
`File` — це клас, який безпосередньо успадковує `Form`.
diff --git a/docs/uk/docs/tutorial/request-form-models.md b/docs/uk/docs/tutorial/request-form-models.md
index 6f785016d..c61eeeaab 100644
--- a/docs/uk/docs/tutorial/request-form-models.md
+++ b/docs/uk/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
У FastAPI ви можете використовувати **Pydantic-моделі** для оголошення **полів форми**.
-/// info
+/// note | Примітка
Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -14,7 +14,7 @@ $ pip install python-multipart
///
-/// note
+/// note | Примітка
Це підтримується, починаючи з FastAPI версії `0.113.0`. 🤓
@@ -40,7 +40,7 @@ $ pip install python-multipart
У деяких особливих випадках (ймовірно, не дуже поширених) ви можете **обмежити** поля форми лише тими, які були оголошені в Pydantic-моделі. І **заборонити** будь-які **додаткові** поля.
-/// note
+/// note | Примітка
Це підтримується, починаючи з FastAPI версії `0.114.0`. 🤓
diff --git a/docs/uk/docs/tutorial/request-forms-and-files.md b/docs/uk/docs/tutorial/request-forms-and-files.md
index c6d254808..74de8018c 100644
--- a/docs/uk/docs/tutorial/request-forms-and-files.md
+++ b/docs/uk/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Ви можете одночасно визначати файли та поля форми, використовуючи `File` і `Form`.
-/// info | Інформація
+/// note | Примітка
Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/uk/docs/tutorial/request-forms.md b/docs/uk/docs/tutorial/request-forms.md
index d02b85068..382826a40 100644
--- a/docs/uk/docs/tutorial/request-forms.md
+++ b/docs/uk/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
Коли вам потрібно отримувати поля форми замість JSON, ви можете використовувати `Form`.
-/// info | Інформація
+/// note | Примітка
Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -26,13 +26,13 @@ $ pip install python-multipart
{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *}
-Наприклад, один зі способів використання специфікації OAuth2 (так званий «password flow») вимагає надсилати `username` та `password` як поля форми.
+Наприклад, один зі способів використання специфікації OAuth2 (так званий «потік паролю») вимагає надсилати `username` та `password` як поля форми.
специфікація вимагає, щоб ці поля мали точні назви `username` і `password` та надсилалися у вигляді полів форми, а не JSON.
З `Form` ви можете оголошувати ті ж конфігурації, що і з `Body` (та `Query`, `Path`, `Cookie`), включаючи валідацію, приклади, псевдоніми (наприклад, `user-name` замість `username`) тощо.
-/// info | Інформація
+/// note | Примітка
`Form` — це клас, який безпосередньо наслідується від `Body`.
diff --git a/docs/uk/docs/tutorial/response-model.md b/docs/uk/docs/tutorial/response-model.md
index 86f12bff4..a5c297289 100644
--- a/docs/uk/docs/tutorial/response-model.md
+++ b/docs/uk/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPI використовуватиме цей `response_model` для вик
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Інформація
+/// note | Примітка
Щоб використовувати `EmailStr`, спочатку встановіть [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -182,7 +182,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
### Повернути Response напряму { #return-a-response-directly }
-Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md).
+Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у просунутому посібнику користувача](../advanced/response-directly.md).
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
@@ -251,7 +251,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
}
```
-/// info | Інформація
+/// note | Примітка
Ви також можете використовувати:
diff --git a/docs/uk/docs/tutorial/response-status-code.md b/docs/uk/docs/tutorial/response-status-code.md
index d453510f9..3915a53ed 100644
--- a/docs/uk/docs/tutorial/response-status-code.md
+++ b/docs/uk/docs/tutorial/response-status-code.md
@@ -18,7 +18,7 @@
Параметр `status_code` приймає число з HTTP кодом статусу.
-/// info | Інформація
+/// note | Примітка
`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus).
diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md
index 742871e39..b63a2d253 100644
--- a/docs/uk/docs/tutorial/schema-extra-example.md
+++ b/docs/uk/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@
///
-/// info | Інформація
+/// note | Примітка
OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку `examples`, що є частиною стандарту **Схеми JSON**.
@@ -155,7 +155,7 @@ OpenAPI також додала поля `example` і `examples` до інших
* `File()`
* `Form()`
-/// info | Інформація
+/// note | Примітка
Цей старий специфічний для OpenAPI параметр `examples` тепер називається `openapi_examples`, починаючи з FastAPI `0.103.0`.
@@ -171,7 +171,7 @@ OpenAPI також додала поля `example` і `examples` до інших
Це нове поле `examples` у Схемі JSON - це **просто `list`** прикладів, а не `dict` з додатковими метаданими, як в інших місцях OpenAPI (описаних вище).
-/// info | Інформація
+/// note | Примітка
Навіть після релізу OpenAPI 3.1.0 з цією новою простішою інтеграцією зі Схемою JSON, протягом певного часу Swagger UI, інструмент, який надає автоматичну документацію, не підтримував OpenAPI 3.1.0 (тепер підтримує, починаючи з версії 5.0.0 🎉).
diff --git a/docs/uk/docs/tutorial/security/first-steps.md b/docs/uk/docs/tutorial/security/first-steps.md
index bfe196223..aa0d21e2e 100644
--- a/docs/uk/docs/tutorial/security/first-steps.md
+++ b/docs/uk/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@
## Запустіть { #run-it }
-/// info | Інформація
+/// note | Примітка
Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматично встановлюється з **FastAPI**, коли ви виконуєте команду `pip install "fastapi[standard]"`.
@@ -60,7 +60,7 @@ $ fastapi dev
-/// check | Кнопка Authorize!
+/// tip | Кнопка Authorize!
У вас уже є нова блискуча кнопка «Authorize».
@@ -118,7 +118,7 @@ OAuth2 був спроєктований так, щоб backend або API мо
У цьому прикладі ми використаємо **OAuth2** з потоком **Password**, використовуючи токен **Bearer**. Це робиться за допомогою класу `OAuth2PasswordBearer`.
-/// info | Інформація
+/// note | Примітка
«Bearer»-токен - не єдиний варіант.
@@ -148,7 +148,7 @@ OAuth2 був спроєктований так, щоб backend або API мо
Незабаром ми також створимо фактичну операцію шляху.
-/// info | Інформація
+/// note | Примітка
Якщо ви дуже строгий «Pythonista», вам може не подобатися стиль імені параметра `tokenUrl` замість `token_url`.
@@ -176,7 +176,7 @@ oauth2_scheme(some, parameters)
**FastAPI** знатиме, що може використати цю залежність, щоб визначити «схему безпеки» в схемі OpenAPI (і в автоматичній документації API).
-/// info | Технічні деталі
+/// note | Технічні деталі
**FastAPI** знатиме, що може використати клас `OAuth2PasswordBearer` (оголошений у залежності), щоб визначити схему безпеки в OpenAPI, тому що він наслідує `fastapi.security.oauth2.OAuth2`, який своєю чергою наслідує `fastapi.security.base.SecurityBase`.
diff --git a/docs/uk/docs/tutorial/security/get-current-user.md b/docs/uk/docs/tutorial/security/get-current-user.md
index 2371ad9fc..b3643a439 100644
--- a/docs/uk/docs/tutorial/security/get-current-user.md
+++ b/docs/uk/docs/tutorial/security/get-current-user.md
@@ -52,7 +52,7 @@
///
-/// check | Перевірте
+/// tip | Порада
Те, як спроєктована ця система залежностей, дозволяє мати різні залежності (різні «залежні»), які всі повертають модель `User`.
diff --git a/docs/uk/docs/tutorial/security/oauth2-jwt.md b/docs/uk/docs/tutorial/security/oauth2-jwt.md
index 64774af6d..1213afe7b 100644
--- a/docs/uk/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/uk/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | Інформація
+/// note | Примітка
Якщо ви плануєте використовувати алгоритми цифрового підпису на кшталт RSA або ECDSA, слід встановити залежність криптобібліотеки `pyjwt[crypto]`.
@@ -213,7 +213,7 @@ JWT може використовуватися й для інших речей,
Username: `johndoe`
Password: `secret`
-/// check | Перевірте
+/// tip | Порада
Зверніть увагу, що ніде в коді немає відкритого пароля "`secret`", ми маємо лише хешовану версію.
diff --git a/docs/uk/docs/tutorial/security/simple-oauth2.md b/docs/uk/docs/tutorial/security/simple-oauth2.md
index 7c83e4c2a..686839982 100644
--- a/docs/uk/docs/tutorial/security/simple-oauth2.md
+++ b/docs/uk/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ OAuth2 визначає, що під час використання «пото
- `instagram_basic` використовується Facebook / Instagram.
- `https://www.googleapis.com/auth/drive` використовується Google.
-/// info | Інформація
+/// note | Примітка
У OAuth2 «scope» — це просто строка, що оголошує конкретний потрібний дозвіл.
@@ -72,7 +72,7 @@ OAuth2 визначає, що під час використання «пото
- Необов'язковим `client_id` (для нашого прикладу не потрібно).
- Необов'язковим `client_secret` (для нашого прикладу не потрібно).
-/// info | Інформація
+/// note | Примітка
`OAuth2PasswordRequestForm` — не спеціальний клас для **FastAPI**, як `OAuth2PasswordBearer`.
@@ -144,7 +144,7 @@ UserInDB(
)
```
-/// info | Інформація
+/// note | Примітка
Для повнішого пояснення `**user_dict` перегляньте [документацію для **Додаткових моделей**](../extra-models.md#about-user-in-dict).
@@ -196,7 +196,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Інформація
+/// note | Примітка
Додатковий заголовок `WWW-Authenticate` зі значенням `Bearer`, який ми тут повертаємо, також є частиною специфікації.
diff --git a/docs/uk/docs/tutorial/server-sent-events.md b/docs/uk/docs/tutorial/server-sent-events.md
index 8234085cf..ffb56e3cb 100644
--- a/docs/uk/docs/tutorial/server-sent-events.md
+++ b/docs/uk/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@
Це подібно до [Потік JSON Lines](stream-json-lines.md), але використовує формат `text/event-stream`, який нативно підтримується браузерами через [API `EventSource`](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Інформація
+/// note | Примітка
Додано у FastAPI 0.135.0.
@@ -81,7 +81,7 @@ FastAPI подбає про коректне виконання, щоб воно
## Сирі дані { #raw-data }
-Якщо потрібно надіслати дані **без** кодування в JSON, використовуйте `raw_data` замість `data`.
+Якщо потрібно надіслати дані без кодування в JSON, використовуйте `raw_data` замість `data`.
Це корисно для надсилання попередньо відформатованого тексту, рядків логів або спеціальних значень «значення-сторож», як-от `[DONE]`.
@@ -103,7 +103,7 @@ FastAPI подбає про коректне виконання, щоб воно
## SSE з POST { #sse-with-post }
-SSE працює з **будь-яким HTTP-методом**, не лише з `GET`.
+SSE працює з будь-яким HTTP-методом, не лише з `GET`.
Це корисно для протоколів на кшталт [MCP](https://modelcontextprotocol.io), які транслюють SSE через `POST`:
@@ -113,8 +113,8 @@ SSE працює з **будь-яким HTTP-методом**, не лише з
FastAPI реалізує деякі найкращі практики SSE «з коробки».
-- Надсилати **коментар «keep alive» `ping`** кожні 15 секунд, коли не було жодного повідомлення, щоб запобігти закриттю з'єднання деякими проксі, як рекомендовано у [Специфікації HTML: Події, надіслані сервером](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
-- Встановити заголовок `Cache-Control: no-cache`, щоб **запобігти кешуванню** потоку.
-- Встановити спеціальний заголовок `X-Accel-Buffering: no`, щоб **запобігти буферизації** у деяких проксі, наприклад Nginx.
+- Надсилати коментар «keep alive» `ping` кожні 15 секунд, коли не було жодного повідомлення, щоб запобігти закриттю з'єднання деякими проксі, як рекомендовано у [Специфікації HTML: Події, надіслані сервером](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
+- Встановити заголовок `Cache-Control: no-cache`, щоб запобігти кешуванню потоку.
+- Встановити спеціальний заголовок `X-Accel-Buffering: no`, щоб запобігти буферизації у деяких проксі, наприклад Nginx.
Вам не потрібно нічого з цим робити, воно працює «з коробки». 🤓
diff --git a/docs/uk/docs/tutorial/stream-json-lines.md b/docs/uk/docs/tutorial/stream-json-lines.md
index f7be4a1b2..488e36e75 100644
--- a/docs/uk/docs/tutorial/stream-json-lines.md
+++ b/docs/uk/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
У вас може бути послідовність даних, яку ви хочете надсилати у **«потоці»**, це можна зробити за допомогою **JSON Lines**.
-/// info | Інформація
+/// note | Примітка
Додано в FastAPI 0.134.0.
@@ -48,7 +48,7 @@ sequenceDiagram
Це дуже схоже на масив JSON (еквівалент списку Python), але замість того, щоб бути загорнутим у `[]` і мати `,` між елементами, тут є **по одному об’єкту JSON на рядок**, вони розділені символом нового рядка.
-/// info | Інформація
+/// note | Примітка
Важливо те, що ваш застосунок зможе по черзі створювати кожен рядок, поки клієнт споживає попередні рядки.
diff --git a/docs/uk/docs/tutorial/testing.md b/docs/uk/docs/tutorial/testing.md
index ccae2303a..059e5cec0 100644
--- a/docs/uk/docs/tutorial/testing.md
+++ b/docs/uk/docs/tutorial/testing.md
@@ -8,7 +8,7 @@
## Використання `TestClient` { #using-testclient }
-/// info | Інформація
+/// note | Примітка
Щоб використовувати `TestClient`, спочатку встановіть [`httpx`](https://www.python-httpx.org).
@@ -144,7 +144,7 @@ $ pip install httpx
Докладніше про передачу даних у бекенд (за допомогою `httpx` або `TestClient`) можна знайти в [документації HTTPX](https://www.python-httpx.org).
-/// info | Інформація
+/// note | Примітка
Зверніть увагу, що `TestClient` отримує дані, які можна конвертувати в JSON, а не Pydantic-моделі.
diff --git a/docs/zh-hant/docs/advanced/additional-responses.md b/docs/zh-hant/docs/advanced/additional-responses.md
index 118c65e04..552ce2e23 100644
--- a/docs/zh-hant/docs/advanced/additional-responses.md
+++ b/docs/zh-hant/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@
///
-/// info | 說明
+/// note | 注意
`model` 這個鍵不屬於 OpenAPI。
@@ -183,7 +183,7 @@
///
-/// info | 說明
+/// note | 注意
除非你在 `responses` 參數中明確指定不同的媒體型別,否則 FastAPI 會假設回應的媒體型別與主回應類別相同(預設為 `application/json`)。
diff --git a/docs/zh-hant/docs/advanced/advanced-dependencies.md b/docs/zh-hant/docs/advanced/advanced-dependencies.md
index 559ca245f..880d92ce9 100644
--- a/docs/zh-hant/docs/advanced/advanced-dependencies.md
+++ b/docs/zh-hant/docs/advanced/advanced-dependencies.md
@@ -98,7 +98,7 @@ checker(q="somequery")
這個行為在 0.118.0 被還原,使得 `yield` 之後的結束程式碼會在回應送出之後才被執行。
-/// info | 資訊
+/// note | 注意
如下所見,這與 0.106.0 之前的行為非常類似,但對一些邊界情況做了多項改進與錯誤修正。
diff --git a/docs/zh-hant/docs/advanced/custom-response.md b/docs/zh-hant/docs/advanced/custom-response.md
index c8355937c..76631e37e 100644
--- a/docs/zh-hant/docs/advanced/custom-response.md
+++ b/docs/zh-hant/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@ FastAPI 預設回傳 JSON 回應。
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info
+/// note
參數 `response_class` 也會用來定義回應的「media type」。
@@ -65,7 +65,7 @@ FastAPI 預設回傳 JSON 回應。
///
-/// info
+/// note
當然,實際的 `Content-Type` 標頭、狀態碼等,會來自你回傳的 `Response` 物件。
diff --git a/docs/zh-hant/docs/advanced/dataclasses.md b/docs/zh-hant/docs/advanced/dataclasses.md
index a18b421c4..0a673889e 100644
--- a/docs/zh-hant/docs/advanced/dataclasses.md
+++ b/docs/zh-hant/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ FastAPI 建立在 **Pydantic** 之上,我之前示範過如何使用 Pydantic
它的運作方式與 Pydantic 模型相同;實際上,底層就是透過 Pydantic 達成的。
-/// info
+/// note
請記得,dataclass 無法做到 Pydantic 模型能做的一切。
diff --git a/docs/zh-hant/docs/advanced/events.md b/docs/zh-hant/docs/advanced/events.md
index 7def525fa..60014a90a 100644
--- a/docs/zh-hant/docs/advanced/events.md
+++ b/docs/zh-hant/docs/advanced/events.md
@@ -120,7 +120,7 @@ async with lifespan(app):
在這裡,`shutdown` 事件處理器函式會把一行文字 `"Application shutdown"` 寫入檔案 `log.txt`。
-/// info
+/// note
在 `open()` 函式中,`mode="a"` 表示「append(附加)」;也就是說,這行文字會加在檔案現有內容之後,而不會覆寫先前的內容。
@@ -152,7 +152,7 @@ async with lifespan(app):
在底層的 ASGI 技術規範中,這屬於 [Lifespan Protocol](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) 的一部分,並定義了 `startup` 與 `shutdown` 兩種事件。
-/// info
+/// note
你可以在 [Starlette 的 Lifespan 文件](https://www.starlette.dev/lifespan/) 讀到更多關於 Starlette `lifespan` 處理器的資訊。
diff --git a/docs/zh-hant/docs/advanced/generate-clients.md b/docs/zh-hant/docs/advanced/generate-clients.md
index c1aa88ef7..a56877ccd 100644
--- a/docs/zh-hant/docs/advanced/generate-clients.md
+++ b/docs/zh-hant/docs/advanced/generate-clients.md
@@ -31,7 +31,6 @@ FastAPI 會自動產生 **OpenAPI 3.1** 規格,因此你使用的任何工具
例如,你可以嘗試:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
其中有些方案也可能是開源或提供免費方案,讓你不需財務承諾就能試用。其他商業的 SDK 產生器也不少,你可以在網路上找到。🤓
diff --git a/docs/zh-hant/docs/advanced/openapi-callbacks.md b/docs/zh-hant/docs/advanced/openapi-callbacks.md
index 3b01f4201..8b4af6dd3 100644
--- a/docs/zh-hant/docs/advanced/openapi-callbacks.md
+++ b/docs/zh-hant/docs/advanced/openapi-callbacks.md
@@ -167,13 +167,13 @@ https://www.external.org/events/invoices/2expen51ve
此時你已經在先前建立的回呼 router 中,擁有所需的回呼「路徑操作(們)」(也就是「外部開發者」應該在「外部 API」中實作的那些)。
-現在在「你的 API 的路徑操作裝飾器」中使用參數 `callbacks`,將該回呼 router 的屬性 `.routes`(實際上就是一個由路由/「路徑操作」所組成的 `list`)傳入:
+現在在「你的 API 的路徑操作裝飾器」中使用參數 `callbacks`,將該回呼 router 的屬性 `.routes` 傳入:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip
-注意你傳給 `callback=` 的不是整個 router 本身(`invoices_callback_router`),而是它的屬性 `.routes`,也就是 `invoices_callback_router.routes`。
+注意你不是把整個 router 本身(`invoices_callback_router`)傳給 `callbacks=`,而是它的 `.routes`,也就是 `invoices_callback_router.routes`。FastAPI 會使用這些路由來產生回呼的 OpenAPI 文件。
///
diff --git a/docs/zh-hant/docs/advanced/openapi-webhooks.md b/docs/zh-hant/docs/advanced/openapi-webhooks.md
index 18206c447..0e5789aa1 100644
--- a/docs/zh-hant/docs/advanced/openapi-webhooks.md
+++ b/docs/zh-hant/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@
這能讓你的使用者更容易實作他們的 API 以接收你的 webhook 請求,甚至可能自動產生部分他們自己的 API 程式碼。
-/// info
+/// note
Webhook 功能自 OpenAPI 3.1.0 起提供,FastAPI `0.99.0` 以上版本支援。
@@ -36,7 +36,7 @@ Webhook 功能自 OpenAPI 3.1.0 起提供,FastAPI `0.99.0` 以上版本支援
你定義的 webhook 會出現在 OpenAPI 結構描述與自動產生的文件 UI 中。
-/// info
+/// note
`app.webhooks` 其實就是一個 `APIRouter`,與你在將應用拆分為多個檔案時所使用的型別相同。
diff --git a/docs/zh-hant/docs/advanced/path-operation-advanced-configuration.md b/docs/zh-hant/docs/advanced/path-operation-advanced-configuration.md
index f1607a1da..e342ccc11 100644
--- a/docs/zh-hant/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/zh-hant/docs/advanced/path-operation-advanced-configuration.md
@@ -16,21 +16,15 @@
### 使用路徑操作函式(path operation function)的名稱作為 operationId { #using-the-path-operation-function-name-as-the-operationid }
-如果你想用 API 的函式名稱作為 `operationId`,你可以遍歷所有路徑,並使用各自的 `APIRoute.name` 覆寫每個*路徑操作*的 `operation_id`。
+如果你想用 API 的函式名稱作為 `operationId`,你可以在 `FastAPI` 中傳入自訂的 `generate_unique_id_function`。
-應在加入所有*路徑操作*之後再這麼做。
+該函式會接收每個 `APIRoute` 並回傳該路徑操作要使用的 `operationId`。
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip
-
-如果你會手動呼叫 `app.openapi()`,請務必先更新所有 `operationId` 再呼叫。
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning
-如果你這樣做,必須確保每個*路徑操作函式*都有唯一的名稱,
+如果你這樣做,必須確保每個*路徑操作函式*都有唯一的名稱。
即使它們位於不同的模組(Python 檔案)中。
diff --git a/docs/zh-hant/docs/advanced/response-directly.md b/docs/zh-hant/docs/advanced/response-directly.md
index 16face261..c4b8cb075 100644
--- a/docs/zh-hant/docs/advanced/response-directly.md
+++ b/docs/zh-hant/docs/advanced/response-directly.md
@@ -10,7 +10,7 @@
/// tip
-通常使用 [回應模型](../tutorial/response-model.md) 會有更好的效能,因為那樣會在 Rust 端使用 Pydantic 來序列化資料,而不是直接回傳 `JSONResponse`。
+通常使用 [回應模型](../tutorial/response-model.md) 會有更好的效能,因為那樣會在 Rust 端使用 Pydantic 來序列化資料。
///
@@ -18,7 +18,7 @@
其實,你可以回傳任何 `Response`,或其任何子類別。
-/// info
+/// note
`JSONResponse` 本身就是 `Response` 的子類別。
diff --git a/docs/zh-hant/docs/advanced/security/oauth2-scopes.md b/docs/zh-hant/docs/advanced/security/oauth2-scopes.md
index 05088be7e..d0a6ad014 100644
--- a/docs/zh-hant/docs/advanced/security/oauth2-scopes.md
+++ b/docs/zh-hant/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OAuth2 規格將「scopes」定義為以空白分隔的一串字串列表。
- `instagram_basic` 是 Facebook / Instagram 使用的。
- `https://www.googleapis.com/auth/drive` 是 Google 使用的。
-/// info
+/// note
在 OAuth2 中,「scope」只是宣告所需特定權限的一個字串。
@@ -126,7 +126,7 @@ OAuth2 規格將「scopes」定義為以空白分隔的一串字串列表。
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | 技術細節
+/// note | 技術細節
`Security` 其實是 `Depends` 的子類別,僅多了一個我們稍後會看到的參數。
diff --git a/docs/zh-hant/docs/advanced/stream-data.md b/docs/zh-hant/docs/advanced/stream-data.md
index 0f55ae651..d28cd35ec 100644
--- a/docs/zh-hant/docs/advanced/stream-data.md
+++ b/docs/zh-hant/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@
但如果你想串流純二進位資料或字串,以下是做法。
-/// info
+/// note
已在 FastAPI 0.134.0 新增。
@@ -90,7 +90,7 @@ FastAPI 會如實將每個資料區塊交給 `StreamingResponse`,不會嘗試
而且在許多情況下,讀取它們會是阻塞操作(可能阻塞事件迴圈),因為資料是從磁碟或網路讀取。
-/// info
+/// note
上面的範例其實是例外,因為 `io.BytesIO` 物件已在記憶體中,讀取不會阻塞任何東西。
diff --git a/docs/zh-hant/docs/advanced/strict-content-type.md b/docs/zh-hant/docs/advanced/strict-content-type.md
index 9d2ffb843..e4735c3e8 100644
--- a/docs/zh-hant/docs/advanced/strict-content-type.md
+++ b/docs/zh-hant/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
啟用此設定後,缺少 `Content-Type` 標頭的請求會將其主體解析為 JSON,這與舊版 FastAPI 的行為相同。
-/// info | 資訊
+/// note | 注意
此行為與設定新增於 FastAPI 0.132.0。
diff --git a/docs/zh-hant/docs/advanced/websockets.md b/docs/zh-hant/docs/advanced/websockets.md
index 57f51bcfb..29a95498c 100644
--- a/docs/zh-hant/docs/advanced/websockets.md
+++ b/docs/zh-hant/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ $ fastapi dev
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note
因為這是 WebSocket,拋出 `HTTPException` 並沒有意義,因此我們改為拋出 `WebSocketException`。
diff --git a/docs/zh-hant/docs/advanced/wsgi.md b/docs/zh-hant/docs/advanced/wsgi.md
index c1baff34e..944720bb6 100644
--- a/docs/zh-hant/docs/advanced/wsgi.md
+++ b/docs/zh-hant/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@
## 使用 `WSGIMiddleware` { #using-wsgimiddleware }
-/// info
+/// note
這需要先安裝 `a2wsgi`,例如使用 `pip install a2wsgi`。
diff --git a/docs/zh-hant/docs/deployment/docker.md b/docs/zh-hant/docs/deployment/docker.md
index 03b9f2f76..650873887 100644
--- a/docs/zh-hant/docs/deployment/docker.md
+++ b/docs/zh-hant/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | 資訊
+/// note | 注意
還有其他格式與工具可以用來定義與安裝套件相依。
@@ -556,7 +556,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
如果你有「多個容器」,且每個容器大概都只執行「單一行程」(例如在一個 Kubernetes 叢集中),那你可能會想要一個「獨立的容器」來完成「前置步驟」的工作,並只在單一容器、單一行程中執行,接著才啟動多個複本的工作容器。
-/// info | 資訊
+/// note | 注意
如果你使用 Kubernetes,這大概會是一個 [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)。
diff --git a/docs/zh-hant/docs/deployment/fastapicloud.md b/docs/zh-hant/docs/deployment/fastapicloud.md
index 4b6fb86b4..0d5c5e7b1 100644
--- a/docs/zh-hant/docs/deployment/fastapicloud.md
+++ b/docs/zh-hant/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-你可以用「一行指令」把你的 FastAPI 應用程式部署到 [FastAPI Cloud](https://fastapicloud.com)。如果你還沒加入,快去登記等候名單吧!🚀
-
-## 登入 { #login }
-
-請先確認你已經有 **FastAPI Cloud** 帳號(我們已從等候名單邀請你 😉)。
-
-然後登入:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## 部署 { #deploy }
-
-現在用「一行指令」部署你的應用:
+你可以只用 **一個指令** 就把你的 FastAPI 應用程式部署到 [FastAPI Cloud](https://fastapicloud.com)。🚀
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
+CLI 會自動偵測你的 FastAPI 應用並將其部署到雲端。若你尚未登入,瀏覽器會自動開啟以完成驗證流程。
+
就這樣!現在你可以透過該 URL 造訪你的應用。✨
## 關於 FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/zh-hant/docs/deployment/manually.md b/docs/zh-hant/docs/deployment/manually.md
index 71e9e27c8..2260f6942 100644
--- a/docs/zh-hant/docs/deployment/manually.md
+++ b/docs/zh-hant/docs/deployment/manually.md
@@ -56,7 +56,6 @@ FastAPI 採用建立 Python 網頁框架與伺服器的標準 依賴注入** 系統。
+* 一個非常強大且易用的 **依賴注入** 系統。
* 安全與驗證,包含支援 **OAuth2** 搭配 **JWT tokens** 與 **HTTP Basic** 驗證。
* 宣告**深度巢狀 JSON 模型**的進階(但同樣簡單)技巧(感謝 Pydantic)。
* 與 [Strawberry](https://strawberry.rocks) 及其他函式庫的 **GraphQL** 整合。
@@ -492,9 +492,7 @@ item: Item
### 部署你的應用(可選) { #deploy-your-app-optional }
-你也可以選擇將 FastAPI 應用部署到 [FastAPI Cloud](https://fastapicloud.com),如果你還沒加入,去登記等候名單吧。🚀
-
-如果你已經有 **FastAPI Cloud** 帳號(我們已從等候名單邀請你 😉),你可以用一個指令部署你的應用。
+你可以選擇只用一個指令,將 FastAPI 應用部署到 [FastAPI Cloud](https://fastapicloud.com)。🚀
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+CLI 會自動偵測你的 FastAPI 應用並將其部署到雲端。若你尚未登入,系統會開啟瀏覽器以完成驗證流程。
+
就這樣!現在你可以在該 URL 造訪你的應用。✨
#### 關於 FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/zh-hant/docs/tutorial/bigger-applications.md b/docs/zh-hant/docs/tutorial/bigger-applications.md
index 73adef3f0..60dd4f350 100644
--- a/docs/zh-hant/docs/tutorial/bigger-applications.md
+++ b/docs/zh-hant/docs/tutorial/bigger-applications.md
@@ -396,9 +396,9 @@ from .routers.users import router
/// note | 技術細節
-實際上,它會在內部為 `APIRouter` 中宣告的每一個「路徑操作」建立一個對應的「路徑操作」。
+當 router 被納入主應用時,FastAPI 會保留原本的 `APIRouter` 與其 `APIRoute` 仍然是活的。
-所以在幕後,它實際運作起來就像是一個單一的應用。
+這表示自訂的 `APIRouter` 與 `APIRoute` 子類別在被納入之後依然會參與運作。
///
@@ -406,7 +406,7 @@ from .routers.users import router
把 router 納入時不需要擔心效能。
-這只會在啟動時花費微秒等級,且只發生一次。
+這個設計相當輕量,且避免為每次請求增加額外負擔。
因此不會影響效能。⚡
@@ -461,7 +461,7 @@ from .routers.users import router
這是因為我們要把它們的路徑操作包含進 OpenAPI 結構與使用者介面中。
-由於無法將它們隔離並獨立「掛載」,所以這些路徑操作會被「複製」(重新建立),而不是直接包含進來。
+FastAPI 會保留原始的 routers 與路徑操作處於活躍狀態,並在處理請求與產生 OpenAPI 時,合併 router 的前綴、相依性、標籤、回應與其他中繼資料。
///
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-請確保在把 `router` 納入 `FastAPI` 應用之前先這麼做,這樣 `other_router` 的路徑操作也會被包含進去。
+你可以在把 `router` 納入 `FastAPI` 應用的前或後這麼做。FastAPI 仍會在路由與 OpenAPI 中包含 `other_router` 的路徑操作。
+
+同樣地,之後新增到這些 routers 的路徑操作也適用。透過先前的納入,它們也會被看見。
+
+/// warning | 技術細節
+
+避免在納入 router 之後直接修改 `router.routes`。FastAPI 將 router 的納入視為即時的,因此原始 router 與其 routes 仍然是路由與 OpenAPI 產生的一部分。
+
+請使用有文件記載的 API,例如路徑操作的裝飾器與 `.include_router()` 來新增路由與 routers。
+
+把 `router.routes` 視為較低階的路由樹結構,它可能同時包含路由定義與被納入的 routers,避免將它當成最終路徑操作的平lat清單來依賴。
+
+///
diff --git a/docs/zh-hant/docs/tutorial/body-multiple-params.md b/docs/zh-hant/docs/tutorial/body-multiple-params.md
index 1c334f51f..e511b2ea5 100644
--- a/docs/zh-hant/docs/tutorial/body-multiple-params.md
+++ b/docs/zh-hant/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | 注意
+/// note | 注意
`Body` 也具有與 `Query`、`Path` 以及之後你會看到的其他工具相同的額外驗證與中繼資料參數。
@@ -123,7 +123,7 @@ q: str | None = None
但如果你想讓它像宣告多個 Body 參數時那樣,期望一個帶有 `item` 鍵、其內含模型內容的 JSON,你可以使用 `Body` 的特殊參數 `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
如下:
diff --git a/docs/zh-hant/docs/tutorial/body-nested-models.md b/docs/zh-hant/docs/tutorial/body-nested-models.md
index f7b8627b4..161920acd 100644
--- a/docs/zh-hant/docs/tutorial/body-nested-models.md
+++ b/docs/zh-hant/docs/tutorial/body-nested-models.md
@@ -134,8 +134,7 @@ my_list: list[str]
]
}
```
-
-/// info
+/// note
注意 `images` 鍵現在是一個由 image 物件組成的列表。
@@ -147,7 +146,7 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info
+/// note
請注意,`Offer` 具有一個 `Item` 的列表,而每個 `Item` 又有一個可選的 `Image` 列表。
diff --git a/docs/zh-hant/docs/tutorial/body.md b/docs/zh-hant/docs/tutorial/body.md
index 08246f513..aff55730b 100644
--- a/docs/zh-hant/docs/tutorial/body.md
+++ b/docs/zh-hant/docs/tutorial/body.md
@@ -8,7 +8,7 @@
要宣告**請求**本文,你會使用 [Pydantic](https://docs.pydantic.dev/) 模型,享受其完整的功能與優點。
-/// info
+/// note
要傳送資料,應使用下列其中一種方法:`POST`(最常見)、`PUT`、`DELETE` 或 `PATCH`。
diff --git a/docs/zh-hant/docs/tutorial/cookie-param-models.md b/docs/zh-hant/docs/tutorial/cookie-param-models.md
index 8997903e3..7eade4b86 100644
--- a/docs/zh-hant/docs/tutorial/cookie-param-models.md
+++ b/docs/zh-hant/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@
-/// info
+/// note
請注意,由於**瀏覽器會以特殊且在背景進行的方式處理 Cookie**,因此**不會**輕易允許 **JavaScript** 存取它們。
diff --git a/docs/zh-hant/docs/tutorial/cookie-params.md b/docs/zh-hant/docs/tutorial/cookie-params.md
index cc9d4b682..e24a87ede 100644
--- a/docs/zh-hant/docs/tutorial/cookie-params.md
+++ b/docs/zh-hant/docs/tutorial/cookie-params.md
@@ -24,19 +24,19 @@
///
-/// info
+/// note
要宣告 cookies,你需要使用 `Cookie`,否則參數會被當作查詢參數(query parameters)來解析。
///
-/// info
+/// note
-請注意,由於瀏覽器以特殊且在背後處理的方式管理 cookies,它們通常不允許 JavaScript 輕易存取它們。
+請注意,由於**瀏覽器會以特殊方式並在背後處理 cookies**,因此**不**容易讓 **JavaScript** 觸碰到它們。
-如果你前往位於 `/docs` 的 API 文件介面,你可以在你的路徑操作(path operations)的文件中看到 cookies 的說明。
+如果你前往位於 `/docs` 的 **API 文件介面**,你可以在你的*路徑操作(path operations)*中看到 cookies 的**文件**。
-但即使你填入資料並點擊「Execute」,由於該文件介面是以 JavaScript 運作,cookies 不會被送出,你會看到一則錯誤訊息,就好像你沒有填任何值一樣。
+但即使你**填入資料**並點擊「Execute」,由於該文件介面是以 **JavaScript** 運作,cookies 不會被送出,你會看到一則**錯誤**訊息,就好像你沒有填任何值一樣。
///
diff --git a/docs/zh-hant/docs/tutorial/debugging.md b/docs/zh-hant/docs/tutorial/debugging.md
index 1230ed6cc..9501dec5c 100644
--- a/docs/zh-hant/docs/tutorial/debugging.md
+++ b/docs/zh-hant/docs/tutorial/debugging.md
@@ -72,7 +72,7 @@ from myapp import app
就不會被執行。
-/// info | 說明
+/// note
想了解更多,參考 [Python 官方文件](https://docs.python.org/3/library/__main__.html)。
diff --git a/docs/zh-hant/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/zh-hant/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index bd5711624..0b548b8e8 100644
--- a/docs/zh-hant/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/zh-hant/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,11 +28,11 @@
///
-/// info
+/// note
在這個範例中我們使用了自訂的(虛構的)標頭 `X-Key` 與 `X-Token`。
-但在實際情況下,當你實作安全機制時,使用整合的 [Security utilities(下一章)](../security/index.md) 會獲得更多好處。
+但在實際情況下,當你實作安全機制時,使用整合的 [安全工具(下一章)](../security/index.md) 會獲得更多好處。
///
diff --git a/docs/zh-hant/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/zh-hant/docs/tutorial/dependencies/dependencies-with-yield.md
index 8174dca40..59d575fb0 100644
--- a/docs/zh-hant/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/zh-hant/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info
+/// note
只會向用戶端送出「一個回應」。可能是其中一個錯誤回應,或是來自該路徑操作的回應。
diff --git a/docs/zh-hant/docs/tutorial/dependencies/index.md b/docs/zh-hant/docs/tutorial/dependencies/index.md
index 86aea50f0..04d2019b7 100644
--- a/docs/zh-hant/docs/tutorial/dependencies/index.md
+++ b/docs/zh-hant/docs/tutorial/dependencies/index.md
@@ -49,7 +49,7 @@
然後它只會回傳一個包含這些值的 `dict`。
-/// info | 說明
+/// note | 注意
FastAPI 在 0.95.0 版新增了對 `Annotated` 的支援(並開始建議使用)。
@@ -104,7 +104,7 @@ common_parameters --> read_users
如此一來,你只需撰寫一次共用程式碼,**FastAPI** 會替你的各個「路徑操作」呼叫它。
-/// check | 檢查
+/// tip | 提示
注意,你不必建立特殊的類別並把它傳到 **FastAPI** 去「註冊」或做類似的事。
diff --git a/docs/zh-hant/docs/tutorial/dependencies/sub-dependencies.md b/docs/zh-hant/docs/tutorial/dependencies/sub-dependencies.md
index 50c4e1790..a2a2ac308 100644
--- a/docs/zh-hant/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/zh-hant/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info
+/// note
注意,在路徑操作函式中我們只宣告了一個相依項 `query_or_cookie_extractor`。
diff --git a/docs/zh-hant/docs/tutorial/first-steps.md b/docs/zh-hant/docs/tutorial/first-steps.md
index d6b1a72e3..8d644abd1 100644
--- a/docs/zh-hant/docs/tutorial/first-steps.md
+++ b/docs/zh-hant/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ entrypoint = "backend.main:app"
from backend.main import app
```
-### 搭配路徑使用 `fastapi dev` { #fastapi-dev-with-path }
+### 使用路徑或 `--entrypoint` 命令列選項執行 `fastapi dev` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
你也可以把檔案路徑傳給 `fastapi dev` 指令,它會自動猜測要使用的 FastAPI app 物件:
@@ -188,29 +188,19 @@ from backend.main import app
$ fastapi dev main.py
```
-但這樣每次執行 `fastapi` 指令時都要記得傳入正確路徑。
-
-此外,其他工具可能找不到它,例如 [VS Code 擴充套件](../editor-support.md) 或 [FastAPI Cloud](https://fastapicloud.com),因此建議在 `pyproject.toml` 中使用 `entrypoint`。
-
-### 部署你的應用程式(可選) { #deploy-your-app-optional }
-
-你可以選擇將你的 FastAPI 應用程式部署到 [FastAPI Cloud](https://fastapicloud.com),如果還沒有,去加入候補名單吧。🚀
-
-如果你已經有 **FastAPI Cloud** 帳號(我們已從候補名單邀請你 😉),你可以用一個指令部署你的應用程式。
-
-部署之前,先確保你已登入:
-
-
+或者,你也可以把 `--entrypoint` 選項傳給 `fastapi dev` 指令:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+但這樣每次執行 `fastapi` 指令時都要記得傳入正確的路徑\entrypoint。
+
+此外,其他工具可能找不到它,例如 [VS Code 擴充套件](../editor-support.md) 或 [FastAPI Cloud](https://fastapicloud.com),因此建議在 `pyproject.toml` 中使用 `entrypoint`。
-接著部署你的應用程式:
+### 部署你的應用程式(可選) { #deploy-your-app-optional }
+
+你可以選擇將你的 FastAPI 應用程式部署到 [FastAPI Cloud](https://fastapicloud.com),只要一行指令。🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+CLI 會自動偵測你的 FastAPI 應用並將它部署到雲端。若你尚未登入,瀏覽器會開啟以完成驗證流程。
+
就這樣!現在你可以透過該 URL 存取你的應用程式了。✨
## 逐步回顧 { #recap-step-by-step }
@@ -270,7 +262,7 @@ https://example.com/items/foo
/items/foo
```
-/// info
+/// note
「路徑」也常被稱為「端點 endpoint」或「路由 route」。
@@ -322,7 +314,7 @@ https://example.com/items/foo
* 路徑 `/`
* 使用 get 操作
-/// info | `@decorator` 說明
+/// note | `@decorator` 說明
Python 中的 `@something` 語法被稱為「裝飾器」。
diff --git a/docs/zh-hant/docs/tutorial/metadata.md b/docs/zh-hant/docs/tutorial/metadata.md
index 720b5d87c..6a54724a5 100644
--- a/docs/zh-hant/docs/tutorial/metadata.md
+++ b/docs/zh-hant/docs/tutorial/metadata.md
@@ -74,9 +74,9 @@
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | 資訊
+/// note | 注意
-在 [Path Operation Configuration](path-operation-configuration.md#tags) 中閱讀更多關於標籤的內容。
+在 [路徑操作設定](path-operation-configuration.md#tags) 中閱讀更多關於標籤的內容。
///
diff --git a/docs/zh-hant/docs/tutorial/path-operation-configuration.md b/docs/zh-hant/docs/tutorial/path-operation-configuration.md
index 9ca738a98..8461f2521 100644
--- a/docs/zh-hant/docs/tutorial/path-operation-configuration.md
+++ b/docs/zh-hant/docs/tutorial/path-operation-configuration.md
@@ -72,13 +72,13 @@
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | 資訊
+/// note | 注意
請注意,`response_description` 專指回應,而 `description` 則是針對整個「路徑操作」的一般描述。
///
-/// check | 檢查
+/// tip
OpenAPI 規範要求每個「路徑操作」都必須有一個回應描述。
diff --git a/docs/zh-hant/docs/tutorial/path-params-numeric-validations.md b/docs/zh-hant/docs/tutorial/path-params-numeric-validations.md
index 68eb837e9..fd8bf0cec 100644
--- a/docs/zh-hant/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/zh-hant/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info
+/// note
FastAPI 在 0.95.0 版加入並開始推薦使用 `Annotated`。
@@ -131,7 +131,7 @@ Python 不會對這個 `*` 做任何事,但它會知道後續的所有參數
* `lt`:小於(`l`ess `t`han)
* `le`:小於或等於(`l`ess than or `e`qual)
-/// info
+/// note
你之後會看到的 `Query`、`Path` 與其他類別,都是共同父類別 `Param` 的子類別。
diff --git a/docs/zh-hant/docs/tutorial/path-params.md b/docs/zh-hant/docs/tutorial/path-params.md
index d46e32bb1..4e8d3dd8f 100644
--- a/docs/zh-hant/docs/tutorial/path-params.md
+++ b/docs/zh-hant/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@
在這個例子裡,`item_id` 被宣告為 `int`。
-/// check
+/// tip
這會在你的函式中提供編輯器支援,包括錯誤檢查、自動完成等。
@@ -34,7 +34,7 @@
{"item_id":3}
```
-/// check
+/// tip
注意你的函式接收(並回傳)的值是 `3`,也就是 Python 的 `int`,而不是字串 `"3"`。
@@ -66,7 +66,7 @@
同樣的錯誤也會在你提供 `float` 而不是 `int` 時出現,例如:[http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check
+/// tip
因此,搭配相同的 Python 型別宣告,**FastAPI** 會為你進行資料驗證。
@@ -82,7 +82,7 @@
-/// check
+/// tip
同樣地,只要使用那個 Python 型別宣告,**FastAPI** 就會提供自動、互動式的文件(整合 Swagger UI)。
diff --git a/docs/zh-hant/docs/tutorial/query-params-str-validations.md b/docs/zh-hant/docs/tutorial/query-params-str-validations.md
index 0932c8d90..1c247b0f8 100644
--- a/docs/zh-hant/docs/tutorial/query-params-str-validations.md
+++ b/docs/zh-hant/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ FastAPI 會因為預設值是 `= None` 而知道 `q` 不是必填。
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | 說明
+/// note | 注意
FastAPI 自 0.95.0 版起加入並開始推薦使用 `Annotated`。
@@ -167,7 +167,7 @@ q: str = Query(default="rick")
## 加入正規表示式 { #add-regular-expressions }
-你可以定義參數必須符合的 regular expression `pattern`:
+你可以定義參數必須符合的 正規表示式 `pattern`:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
@@ -381,7 +381,7 @@ Pydantic 也有 [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | 說明
+/// note | 注意
這需搭配 Pydantic 2 或以上版本。😎
@@ -411,7 +411,7 @@ Pydantic 也有 [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
#### 隨機項目 { #a-random-item }
-透過 `data.items()` 我們會得到一個包含每個字典項目鍵值對 tuple 的 iterable object。
+透過 `data.items()` 我們會得到一個包含每個字典項目鍵值對 tuple 的 可疊代物件。
我們用 `list(data.items())` 把這個可疊代物件轉成正式的 `list`。
diff --git a/docs/zh-hant/docs/tutorial/query-params.md b/docs/zh-hant/docs/tutorial/query-params.md
index 89c083456..24b0cb404 100644
--- a/docs/zh-hant/docs/tutorial/query-params.md
+++ b/docs/zh-hant/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ http://127.0.0.1:8000/items/?skip=20
在這種情況下,函式參數 `q` 為選用,且預設為 `None`。
-/// check | 注意
+/// tip | 提示
另外請注意,FastAPI 能辨識出路徑參數 `item_id` 是路徑參數,而 `q` 不是,因此 `q` 會被當作查詢參數。
diff --git a/docs/zh-hant/docs/tutorial/request-files.md b/docs/zh-hant/docs/tutorial/request-files.md
index 4e20544ea..1d95bf0cd 100644
--- a/docs/zh-hant/docs/tutorial/request-files.md
+++ b/docs/zh-hant/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
你可以使用 `File` 定義由用戶端上傳的檔案。
-/// info
+/// note
若要接收上傳的檔案,請先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。
@@ -28,7 +28,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info
+/// note
`File` 是直接繼承自 `Form` 的類別。
diff --git a/docs/zh-hant/docs/tutorial/request-form-models.md b/docs/zh-hant/docs/tutorial/request-form-models.md
index f8a0e8c6c..9bafb0ef7 100644
--- a/docs/zh-hant/docs/tutorial/request-form-models.md
+++ b/docs/zh-hant/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
你可以使用 **Pydantic 模型** 在 FastAPI 中宣告 **表單欄位**。
-/// info | 說明
+/// note | 注意
要使用表單,首先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。
diff --git a/docs/zh-hant/docs/tutorial/request-forms-and-files.md b/docs/zh-hant/docs/tutorial/request-forms-and-files.md
index c508bf7f7..2db9e283b 100644
--- a/docs/zh-hant/docs/tutorial/request-forms-and-files.md
+++ b/docs/zh-hant/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
你可以使用 `File` 與 `Form` 同時定義檔案與表單欄位。
-/// info
+/// note
要接收上傳的檔案與/或表單資料,請先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。
diff --git a/docs/zh-hant/docs/tutorial/request-forms.md b/docs/zh-hant/docs/tutorial/request-forms.md
index d38db96f1..28d50c3af 100644
--- a/docs/zh-hant/docs/tutorial/request-forms.md
+++ b/docs/zh-hant/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
當你需要接收表單欄位而不是 JSON 時,可以使用 `Form`。
-/// info
+/// note
要使用表單,請先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。
@@ -32,7 +32,7 @@ $ pip install python-multipart
使用 `Form` 時,你可以宣告與 `Body`(以及 `Query`、`Path`、`Cookie`)相同的設定,包括驗證、範例、別名(例如用 `user-name` 取代 `username`)等。
-/// info
+/// note
`Form` 是一個直接繼承自 `Body` 的類別。
diff --git a/docs/zh-hant/docs/tutorial/response-model.md b/docs/zh-hant/docs/tutorial/response-model.md
index d9ad9d9d1..be276945b 100644
--- a/docs/zh-hant/docs/tutorial/response-model.md
+++ b/docs/zh-hant/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPI 會使用這個 `response_model` 來做所有的資料文件、驗證等
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | 說明
+/// note | 注意
要使用 `EmailStr`,請先安裝 [`email-validator`](https://github.com/JoshData/python-email-validator)。
@@ -251,7 +251,7 @@ FastAPI 在內部會搭配 Pydantic 做一些事情,來確保不會把類別
}
```
-/// info | 說明
+/// note | 注意
你也可以使用:
diff --git a/docs/zh-hant/docs/tutorial/response-status-code.md b/docs/zh-hant/docs/tutorial/response-status-code.md
index 9ac2e41da..9ed047fa5 100644
--- a/docs/zh-hant/docs/tutorial/response-status-code.md
+++ b/docs/zh-hant/docs/tutorial/response-status-code.md
@@ -18,7 +18,7 @@
參數 `status_code` 接受一個數字作為 HTTP 狀態碼。
-/// info | 資訊
+/// note | 注意
`status_code` 也可以接收一個 `IntEnum`,例如 Python 的 [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)。
@@ -27,7 +27,7 @@
它會:
* 在回應中傳回該狀態碼。
-* 在 OpenAPI 結構中如此記錄(因此也會反映在使用者介面中):
+* 在 OpenAPI 構架中如此記錄(因此也會反映在使用者介面中):
diff --git a/docs/zh-hant/docs/tutorial/schema-extra-example.md b/docs/zh-hant/docs/tutorial/schema-extra-example.md
index 1c2caef85..01c4a217a 100644
--- a/docs/zh-hant/docs/tutorial/schema-extra-example.md
+++ b/docs/zh-hant/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@
///
-/// info
+/// note
OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)新增了對 `examples` 的支援,這是 **JSON Schema** 標準的一部分。
@@ -155,7 +155,7 @@ OpenAPI 也在規範的其他部分新增了 `example` 與 `examples` 欄位:
* `File()`
* `Form()`
-/// info
+/// note
這個舊的、OpenAPI 特定的 `examples` 參數,從 FastAPI `0.103.0` 起改名為 `openapi_examples`。
@@ -171,7 +171,7 @@ OpenAPI 也在規範的其他部分新增了 `example` 與 `examples` 欄位:
JSON Schema 中新的 `examples` 欄位「就是一個 `list`」的範例集合,而不是像 OpenAPI 其他地方(如上所述)那樣附帶額外中繼資料的 `dict`。
-/// info
+/// note
即使 OpenAPI 3.1.0 已發佈並與 JSON Schema 有更簡潔的整合,一段時間內提供自動文件的 Swagger UI 並不支援 OpenAPI 3.1.0(自 5.0.0 版起支援 🎉)。
diff --git a/docs/zh-hant/docs/tutorial/security/first-steps.md b/docs/zh-hant/docs/tutorial/security/first-steps.md
index 7f12ec1a3..b7db93b50 100644
--- a/docs/zh-hant/docs/tutorial/security/first-steps.md
+++ b/docs/zh-hant/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@
## 執行 { #run-it }
-/// info
+/// note
當你使用 `pip install "fastapi[standard]"` 指令安裝時,[`python-multipart`](https://github.com/Kludex/python-multipart) 套件會隨 FastAPI 自動安裝。
@@ -60,7 +60,7 @@ $ fastapi dev
-/// check | Authorize 按鈕!
+/// tip | Authorize 按鈕!
你會看到一個新的「Authorize」按鈕。
@@ -118,7 +118,7 @@ FastAPI 提供多層抽象的工具來實作這些安全機制。
本例將使用 OAuth2 的 Password 流程,並以 Bearer token 進行驗證;我們會用 `OAuth2PasswordBearer` 類別來完成。
-/// info
+/// note
「Bearer」token 不是唯一選項。
@@ -148,7 +148,7 @@ FastAPI 提供多層抽象的工具來實作這些安全機制。
我們很快也會建立實際的路徑操作。
-/// info
+/// note
如果你是非常嚴格的「Pythonista」,可能不喜歡參數名稱用 `tokenUrl` 而不是 `token_url`。
@@ -176,7 +176,7 @@ oauth2_scheme(some, parameters)
FastAPI 會知道可以使用這個相依性,在 OpenAPI(以及自動產生的 API 文件)中定義一個「安全性方案」。
-/// info | 技術細節
+/// note | 技術細節
FastAPI 之所以知道可以用(相依性中宣告的)`OAuth2PasswordBearer` 類別,在 OpenAPI 中定義安全性方案,是因為它繼承自 `fastapi.security.oauth2.OAuth2`,而後者又繼承自 `fastapi.security.base.SecurityBase`。
diff --git a/docs/zh-hant/docs/tutorial/security/get-current-user.md b/docs/zh-hant/docs/tutorial/security/get-current-user.md
index b223d4823..c17b6468e 100644
--- a/docs/zh-hant/docs/tutorial/security/get-current-user.md
+++ b/docs/zh-hant/docs/tutorial/security/get-current-user.md
@@ -52,7 +52,7 @@
///
-/// check | 檢查
+/// tip | 提示
這個依賴系統的設計讓我們可以有不同的依賴(不同的 "dependables"),都回傳 `User` 模型。
diff --git a/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md b/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md
index abd920ce6..dba108c74 100644
--- a/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | 說明
+/// note | 注意
如果你打算使用像 RSA 或 ECDSA 這類的數位簽章演算法,應該安裝帶有加密函式庫相依的 `pyjwt[crypto]`。
@@ -213,7 +213,7 @@ JWT 除了用來識別使用者並允許他直接對你的 API 執行操作外
Username: `johndoe`
Password: `secret`
-/// check | 檢查
+/// tip | 提示
注意在程式碼中完全沒有明文密碼「`secret`」,我們只有雜湊後的版本。
diff --git a/docs/zh-hant/docs/tutorial/security/simple-oauth2.md b/docs/zh-hant/docs/tutorial/security/simple-oauth2.md
index 251848aa5..de0fe386d 100644
--- a/docs/zh-hant/docs/tutorial/security/simple-oauth2.md
+++ b/docs/zh-hant/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ OAuth2 規範中,當使用「password flow」(我們現在使用的)時,
- `instagram_basic` 用在 Facebook / Instagram
- `https://www.googleapis.com/auth/drive` 用在 Google
-/// info
+/// note
在 OAuth2 裡,「scope」只是用來宣告特定所需權限的一個字串。
@@ -72,7 +72,7 @@ OAuth2 規範中,當使用「password flow」(我們現在使用的)時,
- 可選的 `client_id`(本例不需要)
- 可選的 `client_secret`(本例不需要)
-/// info
+/// note
`OAuth2PasswordRequestForm` 並不是像 `OAuth2PasswordBearer` 那樣對 **FastAPI** 來說的特殊類別。
@@ -128,7 +128,7 @@ OAuth2 規範中,當使用「password flow」(我們現在使用的)時,
{* ../../docs_src/security/tutorial003_an_py310.py hl[82:85] *}
-#### 關於 `**user_dict**` { #about-user-dict }
+#### 關於 `**user_dict` { #about-user-dict }
`UserInDB(**user_dict)` 的意思是:
@@ -144,7 +144,7 @@ UserInDB(
)
```
-/// info
+/// note
想更完整地了解 `**user_dict`,請回到[**額外模型** 的文件](../extra-models.md#about-user-in-dict)。
@@ -196,7 +196,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info
+/// note
這裡我們一併回傳值為 `Bearer` 的額外標頭 `WWW-Authenticate`,這也是規範的一部分。
diff --git a/docs/zh-hant/docs/tutorial/server-sent-events.md b/docs/zh-hant/docs/tutorial/server-sent-events.md
index ced91e358..e539f65d8 100644
--- a/docs/zh-hant/docs/tutorial/server-sent-events.md
+++ b/docs/zh-hant/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@
這與[串流 JSON Lines](stream-json-lines.md)類似,但使用瀏覽器原生支援、透過 [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) 的 `text/event-stream` 格式。
-/// info
+/// note
在 FastAPI 0.135.0 新增。
diff --git a/docs/zh-hant/docs/tutorial/stream-json-lines.md b/docs/zh-hant/docs/tutorial/stream-json-lines.md
index 204d32ffd..6276db788 100644
--- a/docs/zh-hant/docs/tutorial/stream-json-lines.md
+++ b/docs/zh-hant/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
當你有一連串資料想以「**串流**」方式傳送時,可以使用 **JSON Lines**。
-/// info
+/// note
在 FastAPI 0.134.0 新增。
@@ -48,7 +48,7 @@ sequenceDiagram
它和 JSON 陣列(相當於 Python 的 list)很像,但不同於用 `[]` 包起來並以 `,` 分隔項目,它是每一行各放一個 JSON 物件,彼此以換行字元分隔。
-/// info
+/// note
重點在於你的應用能夠逐行產生資料,同時用戶端在消耗前一行的資料。
diff --git a/docs/zh-hant/docs/tutorial/testing.md b/docs/zh-hant/docs/tutorial/testing.md
index f6bef5d96..ab9dac93c 100644
--- a/docs/zh-hant/docs/tutorial/testing.md
+++ b/docs/zh-hant/docs/tutorial/testing.md
@@ -8,7 +8,7 @@
## 使用 `TestClient` { #using-testclient }
-/// info
+/// note
要使用 `TestClient`,請先安裝 [`httpx`](https://www.python-httpx.org)。
@@ -144,7 +144,7 @@ $ pip install httpx
關於如何把資料傳給後端(使用 `httpx` 或 `TestClient`),更多資訊請參考 [HTTPX 文件](https://www.python-httpx.org)。
-/// info
+/// note
請注意,`TestClient` 接收的是可轉為 JSON 的資料,而不是 Pydantic models。
diff --git a/docs/zh/docs/advanced/additional-responses.md b/docs/zh/docs/advanced/additional-responses.md
index 365ba3db4..842d49b4c 100644
--- a/docs/zh/docs/advanced/additional-responses.md
+++ b/docs/zh/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@
///
-/// info | 信息
+/// note | 注意
`model` 键不是 OpenAPI 的一部分。
@@ -183,7 +183,7 @@
///
-/// info | 信息
+/// note | 注意
除非你在 `responses` 参数中明确指定不同的媒体类型,否则 FastAPI 会假设响应与主响应类具有相同的媒体类型(默认是 `application/json`)。
diff --git a/docs/zh/docs/advanced/advanced-dependencies.md b/docs/zh/docs/advanced/advanced-dependencies.md
index edaf964c9..da299a6bf 100644
--- a/docs/zh/docs/advanced/advanced-dependencies.md
+++ b/docs/zh/docs/advanced/advanced-dependencies.md
@@ -98,7 +98,7 @@ checker(q="somequery")
在 0.118.0 中,这一行为被回退为:让 `yield` 之后的退出代码在响应发送之后再执行。
-/// info | 信息
+/// note | 注意
如你在下文所见,这与 0.106.0 之前的行为非常相似,但对若干边界情况做了改进和修复。
diff --git a/docs/zh/docs/advanced/custom-response.md b/docs/zh/docs/advanced/custom-response.md
index ce595572d..053fa34c7 100644
--- a/docs/zh/docs/advanced/custom-response.md
+++ b/docs/zh/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | 信息
+/// note | 注意
参数 `response_class` 也会用来定义响应的「媒体类型」。
@@ -65,7 +65,7 @@
///
-/// info | 信息
+/// note | 注意
当然,实际的 `Content-Type` 头、状态码等等,将来自于你返回的 `Response` 对象。
diff --git a/docs/zh/docs/advanced/dataclasses.md b/docs/zh/docs/advanced/dataclasses.md
index 42b4e4cc4..a46615286 100644
--- a/docs/zh/docs/advanced/dataclasses.md
+++ b/docs/zh/docs/advanced/dataclasses.md
@@ -18,7 +18,7 @@ FastAPI 基于 **Pydantic** 构建,我已经向你展示过如何使用 Pydant
这与使用 Pydantic 模型时的工作方式相同。而且底层实际上也是借助 Pydantic 实现的。
-/// info | 信息
+/// note | 注意
请注意,数据类不能完成 Pydantic 模型能做的所有事情。
diff --git a/docs/zh/docs/advanced/events.md b/docs/zh/docs/advanced/events.md
index 0b647a438..e1bb2ed60 100644
--- a/docs/zh/docs/advanced/events.md
+++ b/docs/zh/docs/advanced/events.md
@@ -120,7 +120,7 @@ async with lifespan(app):
此处,`shutdown` 事件处理器函数会向文件 `log.txt` 写入一行文本 `"Application shutdown"`。
-/// info | 信息
+/// note | 注意
在 `open()` 函数中,`mode="a"` 指的是“追加”。因此这行文本会添加在文件已有内容之后,不会覆盖之前的内容。
@@ -152,7 +152,7 @@ async with lifespan(app):
在底层,这部分是 ASGI 技术规范中的 [Lifespan 协议](https://asgi.readthedocs.io/en/latest/specs/lifespan.html)的一部分,定义了称为 `startup` 和 `shutdown` 的事件。
-/// info | 信息
+/// note | 注意
你可以在 [Starlette 的 Lifespan 文档](https://www.starlette.dev/lifespan/) 中阅读更多关于 `lifespan` 处理器的内容。
diff --git a/docs/zh/docs/advanced/generate-clients.md b/docs/zh/docs/advanced/generate-clients.md
index 049241bc9..9feaf6cf5 100644
--- a/docs/zh/docs/advanced/generate-clients.md
+++ b/docs/zh/docs/advanced/generate-clients.md
@@ -31,7 +31,6 @@ FastAPI 会自动生成 **OpenAPI 3.1** 规范,因此你使用的任何工具
例如,你可以尝试:
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
其中一些方案也可能是开源的或提供免费层级,你可以不花钱就先试用。其他商业 SDK 生成器也可在网上找到。🤓
@@ -83,7 +82,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
///
-你发送的数据如果不符合要求,会在编辑器中显示内联错误:
+你发送的数据会有**内联错误**:
diff --git a/docs/zh/docs/advanced/openapi-callbacks.md b/docs/zh/docs/advanced/openapi-callbacks.md
index 49cef3648..f4f2e7b81 100644
--- a/docs/zh/docs/advanced/openapi-callbacks.md
+++ b/docs/zh/docs/advanced/openapi-callbacks.md
@@ -173,7 +173,7 @@ JSON 请求体包含如下内容:
/// tip | 提示
-注意,不能把路由本身(`invoices_callback_router`)传递给 `callbacks=`,要传递 `invoices_callback_router.routes` 中的 `.routes` 属性。
+注意,不能把路由本身(`invoices_callback_router`)传递给 `callbacks=`,要传递 `invoices_callback_router.routes` 中的 `.routes` 属性。FastAPI 会使用这些路由来生成回调的 OpenAPI 文档。
///
diff --git a/docs/zh/docs/advanced/openapi-webhooks.md b/docs/zh/docs/advanced/openapi-webhooks.md
index 3d6bcc9bc..8bec3b618 100644
--- a/docs/zh/docs/advanced/openapi-webhooks.md
+++ b/docs/zh/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@
这能让您的用户更轻松地**实现他们的 API** 来接收您的**网络钩子**请求,他们甚至可能能够自动生成一些自己的 API 代码。
-/// info | 信息
+/// note | 注意
网络钩子在 OpenAPI 3.1.0 及以上版本中可用,FastAPI `0.99.0` 及以上版本支持。
@@ -36,7 +36,7 @@
您定义的网络钩子将被包含在 `OpenAPI` 的架构中,并出现在自动生成的**文档 UI** 中。
-/// info | 信息
+/// note | 注意
`app.webhooks` 对象实际上只是一个 `APIRouter` ,与您在使用多个文件来构建应用程序时所使用的类型相同。
diff --git a/docs/zh/docs/advanced/path-operation-advanced-configuration.md b/docs/zh/docs/advanced/path-operation-advanced-configuration.md
index 67f3bd7e9..a9f2c1e86 100644
--- a/docs/zh/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/zh/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@
### 使用 *路径操作函数* 的函数名作为 operationId { #using-the-path-operation-function-name-as-the-operationid }
-如果你想用 API 的函数名作为 `operationId`,你可以遍历所有路径操作,并使用它们的 `APIRoute.name` 重写每个 *路径操作* 的 `operation_id`。
+如果你想用 API 的函数名作为 `operationId`,你可以向 `FastAPI` 传入自定义的 `generate_unique_id_function`。
-你应该在添加了所有 *路径操作* 之后执行此操作。
+该函数会接收每个 `APIRoute`,并返回用于该路径操作的 `operationId`。
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip
-
-如果你手动调用 `app.openapi()`,你应该在此之前更新 `operationId`。
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning
diff --git a/docs/zh/docs/advanced/response-directly.md b/docs/zh/docs/advanced/response-directly.md
index 196622146..f9a865137 100644
--- a/docs/zh/docs/advanced/response-directly.md
+++ b/docs/zh/docs/advanced/response-directly.md
@@ -5,9 +5,9 @@
如果你声明了 [响应模型](../tutorial/response-model.md),FastAPI 会使用它通过 Pydantic 将数据序列化为 JSON。
如果你没有声明响应模型,**FastAPI** 会使用在 [JSON 兼容编码器](../tutorial/encoder.md) 中阐述的 `jsonable_encoder`。
-然后,**FastAPI** 会在后台将这些兼容 JSON 的数据(比如字典)放到一个 `JSONResponse` 中,该 `JSONResponse` 会用来发送响应给客户端。
+然后,**FastAPI** 会将其放入一个 `JSONResponse` 中。
-但是你可以在你的 *路径操作* 中直接返回一个 `JSONResponse`。
+你也可以直接创建一个 `JSONResponse` 并返回它。
/// tip | 提示
@@ -17,9 +17,9 @@
## 返回 `Response` { #return-a-response }
-事实上,你可以返回任意 `Response` 或者任意 `Response` 的子类。
+你可以返回一个 `Response` 或其任意子类。
-/// info | 信息
+/// note | 注意
`JSONResponse` 本身是一个 `Response` 的子类。
diff --git a/docs/zh/docs/advanced/security/oauth2-scopes.md b/docs/zh/docs/advanced/security/oauth2-scopes.md
index a1ecc641c..db29e4916 100644
--- a/docs/zh/docs/advanced/security/oauth2-scopes.md
+++ b/docs/zh/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OAuth2 规范将“作用域”定义为由空格分隔的字符串列表。
* Facebook / Instagram 使用 `instagram_basic`
* Google 使用 `https://www.googleapis.com/auth/drive`
-/// info | 信息
+/// note | 注意
在 OAuth2 中,“作用域”只是一个声明所需特定权限的字符串。
@@ -126,7 +126,7 @@ OAuth2 规范将“作用域”定义为由空格分隔的字符串列表。
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | 技术细节
+/// note | 技术细节
`Security` 实际上是 `Depends` 的子类,它只多了一个我们稍后会看到的参数。
diff --git a/docs/zh/docs/advanced/stream-data.md b/docs/zh/docs/advanced/stream-data.md
index 322561ac1..366ab203b 100644
--- a/docs/zh/docs/advanced/stream-data.md
+++ b/docs/zh/docs/advanced/stream-data.md
@@ -4,7 +4,7 @@
但如果你想流式传输纯二进制数据或字符串,可以按下面的方法操作。
-/// info | 信息
+/// note | 注意
自 FastAPI 0.134.0 起新增。
@@ -90,7 +90,7 @@ FastAPI 会将每个数据块原样交给 `StreamingResponse`,不会尝试将
而且很多情况下,读取它们是一个阻塞操作(可能会阻塞事件循环),因为数据来自磁盘或网络。
-/// info | 信息
+/// note | 注意
上面的示例其实是个例外,因为 `io.BytesIO` 对象已经在内存中,所以读取它不会阻塞。
diff --git a/docs/zh/docs/advanced/strict-content-type.md b/docs/zh/docs/advanced/strict-content-type.md
index 973d1840c..0cf9242af 100644
--- a/docs/zh/docs/advanced/strict-content-type.md
+++ b/docs/zh/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
启用该设置后,缺少 `Content-Type` 头的请求其请求体也会按 JSON 解析,这与旧版本 FastAPI 的行为一致。
-/// info | 信息
+/// note | 注意
此行为和配置在 FastAPI 0.132.0 中新增。
diff --git a/docs/zh/docs/advanced/websockets.md b/docs/zh/docs/advanced/websockets.md
index d90ef8733..7950f90ea 100644
--- a/docs/zh/docs/advanced/websockets.md
+++ b/docs/zh/docs/advanced/websockets.md
@@ -111,11 +111,11 @@ $ fastapi dev
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note | 注意
由于这是一个 WebSocket,抛出 `HTTPException` 并不是很合理,而是抛出 `WebSocketException`。
-您可以使用[规范中定义的有效代码](https://tools.ietf.org/html/rfc6455#section-7.4.1)。
+您可以使用[规范中定义的有效关闭代码](https://tools.ietf.org/html/rfc6455#section-7.4.1)。
///
@@ -140,7 +140,7 @@ $ fastapi dev
* "Item ID",用于路径。
* "Token",作为查询参数。
-/// tip
+/// tip | 提示
注意,查询参数 `token` 将由依赖项处理。
@@ -168,13 +168,13 @@ $ fastapi dev
Client #1596980209979 left the chat
```
-/// tip
+/// tip | 提示
上面的应用程序是一个最小和简单的示例,用于演示如何处理和向多个 WebSocket 连接广播消息。
但请记住,由于所有内容都在内存中以单个列表的形式处理,因此它只能在进程运行时工作,并且只能使用单个进程。
-如果您需要与 FastAPI 集成更简单但更强大的功能,支持 Redis、PostgreSQL 或其他功能,请查看 [encode/broadcaster](https://github.com/encode/broadcaster)。
+如果您需要与 FastAPI 集成更简单但更健壮的方案,支持 Redis、PostgreSQL 或其他,请查看 [encode/broadcaster](https://github.com/encode/broadcaster)。
///
diff --git a/docs/zh/docs/advanced/wsgi.md b/docs/zh/docs/advanced/wsgi.md
index 038b672f8..f665c371f 100644
--- a/docs/zh/docs/advanced/wsgi.md
+++ b/docs/zh/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@
## 使用 `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | 信息
+/// note | 注意
需要安装 `a2wsgi`,例如使用 `pip install a2wsgi`。
diff --git a/docs/zh/docs/deployment/docker.md b/docs/zh/docs/deployment/docker.md
index aa7b60b50..c1b216953 100644
--- a/docs/zh/docs/deployment/docker.md
+++ b/docs/zh/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | 信息
+/// note | 注意
还有其他格式和工具可以定义并安装包依赖。
@@ -556,7 +556,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
如果你有**多个容器**,可能每个容器运行一个**单独进程**(例如在 **Kubernetes** 集群中),那么你可能希望使用一个**单独的容器**来执行**前置步骤**,在一个容器中运行一个进程,**在**启动那些复制的 worker 容器**之前**完成。
-/// info | 信息
+/// note | 注意
如果你使用 Kubernetes,这通常会是一个 [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)。
diff --git a/docs/zh/docs/deployment/fastapicloud.md b/docs/zh/docs/deployment/fastapicloud.md
index d43870993..9140e30c0 100644
--- a/docs/zh/docs/deployment/fastapicloud.md
+++ b/docs/zh/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-你可以用**一条命令**将你的 FastAPI 应用部署到 [FastAPI Cloud](https://fastapicloud.com),如果还没有,去加入候补名单吧。🚀
-
-## 登录 { #login }
-
-请确保你已有 **FastAPI Cloud** 账号(我们已从候补名单向你发出邀请 😉)。
-
-然后登录:
-
-
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## 部署 { #deploy }
-
-现在用**一条命令**部署你的应用:
+你可以用**一条命令**将你的 FastAPI 应用部署到 [FastAPI Cloud](https://fastapicloud.com)。🚀
@@ -36,6 +16,8 @@ Deploying to FastAPI Cloud...
+CLI 会自动检测你的 FastAPI 应用并将其部署到云端。如果你尚未登录,浏览器会自动打开以完成认证流程。
+
就这样!现在你可以通过该 URL 访问你的应用。✨
## 关于 FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/zh/docs/deployment/manually.md b/docs/zh/docs/deployment/manually.md
index c440aa924..a395f96da 100644
--- a/docs/zh/docs/deployment/manually.md
+++ b/docs/zh/docs/deployment/manually.md
@@ -56,7 +56,6 @@ FastAPI 使用了一种用于构建 Python Web 框架和服务器的标准,称
* [Hypercorn](https://hypercorn.readthedocs.io/): 与 HTTP/2 和 Trio 等兼容的 ASGI 服务器。
* [Daphne](https://github.com/django/daphne): 为 Django Channels 构建的 ASGI 服务器。
* [Granian](https://github.com/emmett-framework/granian): 基于 Rust 的 HTTP 服务器,专为 Python 应用设计。
-* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit 是一个轻量级且灵活的 Web 应用运行时环境。
## 服务器主机和服务器程序 { #server-machine-and-server-program }
diff --git a/docs/zh/docs/deployment/server-workers.md b/docs/zh/docs/deployment/server-workers.md
index add83ac1a..e20d9ef95 100644
--- a/docs/zh/docs/deployment/server-workers.md
+++ b/docs/zh/docs/deployment/server-workers.md
@@ -17,7 +17,7 @@
在本章节中,我将向您展示如何使用 `fastapi` 命令或直接使用 `uvicorn` 命令以**多工作进程模式**运行 **Uvicorn**。
-/// info | 信息
+/// note | 注意
如果您正在使用容器,例如 Docker 或 Kubernetes,我将在下一章中告诉您更多相关信息:[容器中的 FastAPI - Docker](docker.md)。
diff --git a/docs/zh/docs/how-to/extending-openapi.md b/docs/zh/docs/how-to/extending-openapi.md
index fd39e439f..9b8d1c07e 100644
--- a/docs/zh/docs/how-to/extending-openapi.md
+++ b/docs/zh/docs/how-to/extending-openapi.md
@@ -25,9 +25,17 @@
- `openapi_version`:使用的 OpenAPI 规范版本。默认是最新的 `3.1.0`。
- `summary`:API 的简短摘要。
- `description`:API 的描述,可包含 Markdown,并会展示在文档中。
-- `routes`:路由列表,即已注册的每个路径操作。来自 `app.routes`。
+- `routes`:应用的路由,来自 `app.routes`。FastAPI 使用它们来收集已注册的路径操作,包括来自已包含路由器的那些。
-/// info | 信息
+/// tip | 技术细节
+
+`app.routes` 是一个更底层的路由树。它可能包含 FastAPI 在内部用于包含的路由器的候选路由,而不仅仅是最终的 `APIRoute` 对象。
+
+你仍然可以把 `app.routes` 传给 `get_openapi()`。FastAPI 会遍历这棵路由树来收集实际生效的路径操作。
+
+///
+
+/// note | 注意
参数 `summary` 仅在 OpenAPI 3.1.0 及更高版本中可用,FastAPI 0.99.0 及以上版本支持。
@@ -61,7 +69,7 @@
你可以把 `.openapi_schema` 属性当作“缓存”,用来存储已生成的架构。
-这样一来,用户每次打开 API 文档时,应用就不必重新生成架构。
+这样一来,应用每次打开 API 文档时就不必重新生成架构。
它只会生成一次,后续请求都会使用同一份缓存的架构。
diff --git a/docs/zh/docs/how-to/separate-openapi-schemas.md b/docs/zh/docs/how-to/separate-openapi-schemas.md
index c3efe5f1a..19d372b46 100644
--- a/docs/zh/docs/how-to/separate-openapi-schemas.md
+++ b/docs/zh/docs/how-to/separate-openapi-schemas.md
@@ -85,7 +85,7 @@
这种情况下,你可以在 **FastAPI** 中通过参数 `separate_input_output_schemas=False` 禁用该特性。
-/// info | 信息
+/// note | 注意
对 `separate_input_output_schemas` 的支持是在 FastAPI `0.102.0` 中添加的。🤓
diff --git a/docs/zh/docs/index.md b/docs/zh/docs/index.md
index f89d0a653..74b799e5c 100644
--- a/docs/zh/docs/index.md
+++ b/docs/zh/docs/index.md
@@ -492,9 +492,7 @@ item: Item
### 部署你的应用(可选) { #deploy-your-app-optional }
-你可以选择把 FastAPI 应用部署到 [FastAPI Cloud](https://fastapicloud.com),如果还没有的话去加入候补名单吧。🚀
-
-如果你已经有 **FastAPI Cloud** 账号(我们从候补名单邀请了你 😉),你可以用一个命令部署你的应用。
+你可以选择用一条命令将 FastAPI 应用部署到 [FastAPI Cloud](https://fastapicloud.com)。🚀
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+CLI 会自动检测你的 FastAPI 应用并将其部署到云端。如果你尚未登录,浏览器会打开以完成认证流程。
+
就这样!现在你可以通过该 URL 访问你的应用了。✨
#### 关于 FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/zh/docs/tutorial/bigger-applications.md b/docs/zh/docs/tutorial/bigger-applications.md
index cbee84f35..1be1be628 100644
--- a/docs/zh/docs/tutorial/bigger-applications.md
+++ b/docs/zh/docs/tutorial/bigger-applications.md
@@ -396,9 +396,9 @@ from .routers.users import router
/// note | 技术细节
-实际上,它将在内部为声明在 `APIRouter` 中的每个*路径操作*创建一个*路径操作*。
+当在主应用中包含路由器时,FastAPI 会保留原始的 `APIRouter` 及其 `APIRoute` 处于活动状态。
-所以,在幕后,它实际上会像所有的东西都是同一个应用程序一样工作。
+这意味着自定义的 `APIRouter` 和 `APIRoute` 子类在被包含之后仍然能够参与工作。
///
@@ -406,7 +406,7 @@ from .routers.users import router
包含路由器时,你不必担心性能问题。
-这将花费几微秒时间,并且只会在启动时发生。
+这被设计为轻量级的,并且避免给每个请求增加开销。
因此,它不会影响性能。⚡
@@ -457,11 +457,11 @@ from .routers.users import router
---
-`APIRouter` 没有被「挂载」,它们与应用程序的其余部分没有隔离。
+`APIRouter` 并不是「挂载」的,它们并没有和应用程序的其余部分隔离。
-这是因为我们想要在 OpenAPI 模式和用户界面中包含它们的*路径操作*。
+这是因为我们希望在 OpenAPI 模式和用户界面中包含它们的*路径操作*。
-由于我们不能仅仅隔离它们并独立于其余部分来「挂载」它们,因此*路径操作*是被「克隆的」(重新创建),而不是直接包含。
+FastAPI 会保留原始的路由器和路径操作处于活动状态,并在处理请求和生成 OpenAPI 时组合路由器的前缀、依赖项、标签、响应以及其他元数据。
///
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-请确保在你将 `router` 包含到 `FastAPI` 应用程序之前进行此操作,以便 `other_router` 中的*路径操作*也能被包含进来。
+你可以在将 `router` 包含到 `FastAPI` 应用之前或之后执行此操作。FastAPI 仍然会在路由和 OpenAPI 中包含 `other_router` 中的*路径操作*。
+
+同样适用于之后添加到这些路由器的*路径操作*。它们也会通过先前的包含可见。
+
+/// warning | 技术细节
+
+在包含路由器之后,避免直接修改 `router.routes`。FastAPI 将路由器的包含视为「实时」的,因此原始路由器及其路由会继续参与路由和 OpenAPI 生成。
+
+使用文档化的 API(例如路径操作装饰器和 `.include_router()`)来添加路由和路由器。
+
+将 `router.routes` 视为较低层级的路由树,它可以包含路由定义和被包含的路由器;避免把它当作最终路径操作的扁平列表来依赖。
+
+///
diff --git a/docs/zh/docs/tutorial/body-multiple-params.md b/docs/zh/docs/tutorial/body-multiple-params.md
index 39b84904f..8cb465764 100644
--- a/docs/zh/docs/tutorial/body-multiple-params.md
+++ b/docs/zh/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | 信息
+/// note | 注意
`Body` 同样具有与 `Query`、`Path` 以及其他后面将看到的类完全相同的额外校验和元数据参数。
@@ -123,7 +123,7 @@ q: str | None = None
但是,如果你希望它期望一个拥有 `item` 键并在值中包含模型内容的 JSON,就像在声明额外的请求体参数时所做的那样,则可以使用一个特殊的 `Body` 参数 `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
比如:
diff --git a/docs/zh/docs/tutorial/body-nested-models.md b/docs/zh/docs/tutorial/body-nested-models.md
index 93a34da55..98e5168aa 100644
--- a/docs/zh/docs/tutorial/body-nested-models.md
+++ b/docs/zh/docs/tutorial/body-nested-models.md
@@ -135,7 +135,7 @@ Pydantic 模型的每个属性都具有类型。
}
```
-/// info | 信息
+/// note | 注意
请注意 `images` 键现在具有一组 image 对象是如何发生的。
@@ -147,9 +147,9 @@ Pydantic 模型的每个属性都具有类型。
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | 信息
+/// note | 注意
-请注意 `Offer` 拥有一组 `Item` 而反过来 `Item` 又是一个可选的 `Image` 列表是如何发生的。
+请注意 `Offer` 拥有一组 `Item` 而反过来 `Item` 又有一个可选的 `Image` 列表是如何发生的。
///
diff --git a/docs/zh/docs/tutorial/body.md b/docs/zh/docs/tutorial/body.md
index 0a4c9c5e5..ee4124e94 100644
--- a/docs/zh/docs/tutorial/body.md
+++ b/docs/zh/docs/tutorial/body.md
@@ -8,7 +8,7 @@
使用 [Pydantic](https://docs.pydantic.dev/) 模型来声明**请求体**,能充分利用它的功能和优点。
-/// info | 信息
+/// note | 注意
发送数据应使用以下之一:`POST`(最常见)、`PUT`、`DELETE` 或 `PATCH`。
diff --git a/docs/zh/docs/tutorial/cookie-param-models.md b/docs/zh/docs/tutorial/cookie-param-models.md
index 8e094c7d3..368fe4762 100644
--- a/docs/zh/docs/tutorial/cookie-param-models.md
+++ b/docs/zh/docs/tutorial/cookie-param-models.md
@@ -1,8 +1,8 @@
# Cookie 参数模型 { #cookie-parameter-models }
-如果您有一组相关的 **cookie**,您可以创建一个 **Pydantic 模型**来声明它们。🍪
+如果你有一组相关的 **cookie**,你可以创建一个 **Pydantic 模型**来声明它们。🍪
-这将允许您在**多个地方**能够**重用模型**,并且可以一次性声明所有参数的验证方式和元数据。😎
+这将允许你在**多个地方**能够**重用模型**,并且可以一次性声明所有参数的验证方式和元数据。😎
/// note | 注意
@@ -22,39 +22,39 @@
{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
-**FastAPI** 将从请求中接收到的 **cookie** 中**提取**出**每个字段**的数据,并提供您定义的 Pydantic 模型。
+**FastAPI** 将从请求中接收到的 **cookie** 中**提取**出**每个字段**的数据,并提供你定义的 Pydantic 模型。
## 查看文档 { #check-the-docs }
-您可以在文档 UI 的 `/docs` 中查看定义的 cookie:
+你可以在文档 UI 的 `/docs` 中查看定义的 cookie:
-/// info | 信息
+/// note | 注意
请记住,由于**浏览器**以特殊方式**处理 cookie**,并在后台进行操作,因此它们**不会**轻易允许 **JavaScript** 访问这些 cookie。
-如果您访问 `/docs` 的 **API 文档 UI**,您将能够查看您*路径操作*的 cookie **文档**。
+如果你访问 `/docs` 的 **API 文档 UI**,你将能够查看你*路径操作*的 cookie **文档**。
-但是即使您**填写数据**并点击“执行”,由于文档界面使用 **JavaScript**,cookie 将不会被发送。而您会看到一条**错误**消息,就好像您没有输入任何值一样。
+但是即使你**填写数据**并点击“执行”,由于文档界面使用 **JavaScript**,cookie 将不会被发送。而你会看到一条**错误**消息,就好像你没有输入任何值一样。
///
## 禁止额外的 Cookie { #forbid-extra-cookies }
-在某些特殊使用情况下(可能并不常见),您可能希望**限制**您想要接收的 cookie。
+在某些特殊使用情况下(可能并不常见),你可能希望**限制**你想要接收的 cookie。
-您的 API 现在可以控制自己的 cookie 同意。🤪🍪
+你的 API 现在可以控制自己的 cookie 同意。🤪🍪
-您可以使用 Pydantic 的模型配置来禁止( `forbid` )任何额外( `extra` )字段:
+你可以使用 Pydantic 的模型配置来禁止( `forbid` )任何额外( `extra` )字段:
{* ../../docs_src/cookie_param_models/tutorial002_an_py310.py hl[10] *}
如果客户端尝试发送一些**额外的 cookie**,他们将收到**错误**响应。
-可怜的 cookie 通知条,费尽心思为了获得您的同意,却被API 拒绝了。🍪
+可怜的 cookie 通知条,费尽心思为了获得你的同意,却被API 拒绝了。🍪
例如,如果客户端尝试发送一个值为 `good-list-please` 的 `santa_tracker` cookie,客户端将收到一个**错误**响应,告知他们 `santa_tracker` cookie 是不允许的:
@@ -73,4 +73,4 @@
## 总结 { #summary }
-您可以使用 **Pydantic 模型**在 **FastAPI** 中声明 **cookie**。😎
+你可以使用 **Pydantic 模型**在 **FastAPI** 中声明 **cookie**。😎
diff --git a/docs/zh/docs/tutorial/cookie-params.md b/docs/zh/docs/tutorial/cookie-params.md
index ab05cd7d2..97bf00c65 100644
--- a/docs/zh/docs/tutorial/cookie-params.md
+++ b/docs/zh/docs/tutorial/cookie-params.md
@@ -12,7 +12,7 @@
声明 `Cookie` 参数的方式与声明 `Query` 和 `Path` 参数相同。
-第一个值是默认值,还可以传递所有验证参数或注释参数:
+你可以定义默认值,以及所有额外的验证或注解参数:
{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[9] *}
@@ -24,13 +24,13 @@
///
-/// info | 信息
+/// note | 注意
必须使用 `Cookie` 声明 cookie 参数,否则该参数会被解释为查询参数。
///
-/// info | 信息
+/// note | 注意
请注意,由于**浏览器会以特殊方式并在幕后处理 cookies**,它们**不会**轻易允许**JavaScript**访问它们。
diff --git a/docs/zh/docs/tutorial/debugging.md b/docs/zh/docs/tutorial/debugging.md
index 19e6f8a61..4f4503eef 100644
--- a/docs/zh/docs/tutorial/debugging.md
+++ b/docs/zh/docs/tutorial/debugging.md
@@ -42,12 +42,14 @@ $ python myapp.py
那么文件中由 Python 自动创建的内部变量 `__name__`,会将字符串 `"__main__"` 作为值。
-所以,下面这部分代码才会运行:
+所以,这一段:
```Python
uvicorn.run(app, host="0.0.0.0", port=8000)
```
+会运行。
+
---
如果你是导入这个模块(文件)就不会这样。
@@ -62,13 +64,15 @@ from myapp import app
在这种情况下,`myapp.py` 内部的自动变量不会有值为 `"__main__"` 的变量 `__name__`。
-所以,下面这一行不会被执行:
+所以,这一行:
```Python
uvicorn.run(app, host="0.0.0.0", port=8000)
```
-/// info | 信息
+不会被执行。
+
+/// note | 注意
更多信息请检查 [Python 官方文档](https://docs.python.org/3/library/__main__.html).
diff --git a/docs/zh/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/zh/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index a3b2e6a41..afd3dc982 100644
--- a/docs/zh/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/zh/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@
///
-/// info | 信息
+/// note | 注意
本例中,使用的是自定义响应头 `X-Key` 和 `X-Token`。
diff --git a/docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md
index a365bccf0..5beda5709 100644
--- a/docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info | 信息
+/// note | 注意
只会向客户端发送**一次响应**。它可能是某个错误响应,或者是来自 *路径操作* 的响应。
diff --git a/docs/zh/docs/tutorial/dependencies/index.md b/docs/zh/docs/tutorial/dependencies/index.md
index 939470f40..08a04ad88 100644
--- a/docs/zh/docs/tutorial/dependencies/index.md
+++ b/docs/zh/docs/tutorial/dependencies/index.md
@@ -51,7 +51,7 @@
然后它只需返回一个包含这些值的 `dict`。
-/// info | 信息
+/// note | 注意
FastAPI 在 0.95.0 版本中新增了对 `Annotated` 的支持(并开始推荐使用)。
@@ -106,7 +106,7 @@ common_parameters --> read_users
这样,你只需编写一次共享代码,**FastAPI** 会在你的*路径操作*中为你调用它。
-/// check | 检查
+/// tip | 提示
注意,无需创建专门的类并传给 **FastAPI** 去“注册”之类的操作。
@@ -164,7 +164,7 @@ commons: Annotated[dict, Depends(common_parameters)]
-## 简单用法 { #simple-usage }
+## 簡单用法 { #simple-usage }
观察一下就会发现,只要*路径*和*操作*匹配,就会使用声明的*路径操作函数*。随后,**FastAPI** 会用正确的参数调用该函数,并从请求中提取数据。
diff --git a/docs/zh/docs/tutorial/dependencies/sub-dependencies.md b/docs/zh/docs/tutorial/dependencies/sub-dependencies.md
index 1c30b4380..a57271c8e 100644
--- a/docs/zh/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/zh/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@ FastAPI 支持创建含**子依赖项**的依赖项。
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | 信息
+/// note | 注意
注意,这里在*路径操作函数*中只声明了一个依赖项,即 `query_or_cookie_extractor` 。
diff --git a/docs/zh/docs/tutorial/first-steps.md b/docs/zh/docs/tutorial/first-steps.md
index 78db1fefc..3eee0d44f 100644
--- a/docs/zh/docs/tutorial/first-steps.md
+++ b/docs/zh/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ entrypoint = "backend.main:app"
from backend.main import app
```
-### `fastapi dev` 带路径 { #fastapi-dev-with-path }
+### 带路径或使用 `--entrypoint` CLI 选项的 `fastapi dev` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
你也可以把文件路径传给 `fastapi dev` 命令,它会尝试推断要使用的 FastAPI 应用对象:
@@ -188,29 +188,19 @@ from backend.main import app
$ fastapi dev main.py
```
-但这样每次调用 `fastapi` 命令时都需要记得传入正确的路径。
-
-另外,其他工具可能无法找到它,例如 [VS Code 扩展](../editor-support.md) 或 [FastAPI Cloud](https://fastapicloud.com),因此推荐在 `pyproject.toml` 中使用 `entrypoint`。
-
-### 部署你的应用(可选) { #deploy-your-app-optional }
-
-你可以选择将 FastAPI 应用部署到 [FastAPI Cloud](https://fastapicloud.com),如果还没有,先去加入候补名单。🚀
-
-如果你已经拥有 **FastAPI Cloud** 账户(我们从候补名单邀请了你 😉),你可以用一条命令部署应用。
-
-部署前,先确保已登录:
-
-
+或者,你也可以给 `fastapi dev` 命令传入 `--entrypoint` 选项:
```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
+$ fastapi dev --entrypoint main:app
```
-
+但这样每次调用 `fastapi` 命令时都需要记得传入正确的路径/entrypoint。
+
+另外,其他工具可能无法找到它,例如 [VS Code 扩展](../editor-support.md) 或 [FastAPI Cloud](https://fastapicloud.com),因此推荐在 `pyproject.toml` 中使用 `entrypoint`。
+
+### 部署你的应用(可选) { #deploy-your-app-optional }
-然后部署你的应用:
+你可以选择用一条命令将 FastAPI 应用部署到 [FastAPI Cloud](https://fastapicloud.com)。🚀
@@ -226,6 +216,8 @@ Deploying to FastAPI Cloud...
+CLI 会自动检测你的 FastAPI 应用并将其部署到云端。如果你尚未登录,浏览器会打开以完成认证流程。
+
就这些!现在你可以通过该 URL 访问你的应用了。✨
## 分步概括 { #recap-step-by-step }
@@ -270,7 +262,7 @@ https://example.com/items/foo
/items/foo
```
-/// info
+/// note | 注意
「路径」也通常被称为「端点」或「路由」。
@@ -322,7 +314,7 @@ https://example.com/items/foo
* 请求路径为 `/`
* 使用 get 操作
-/// info | `@decorator` 信息
+/// note | `@decorator` 信息
`@something` 语法在 Python 中被称为「装饰器」。
@@ -349,7 +341,7 @@ https://example.com/items/foo
* `@app.patch()`
* `@app.trace()`
-/// tip
+/// tip | 提示
你可以随意使用任何一个操作(HTTP方法)。
@@ -383,7 +375,7 @@ https://example.com/items/foo
{* ../../docs_src/first_steps/tutorial003_py310.py hl[7] *}
-/// note
+/// note | 注意
如果你不知道两者的区别,请查阅 [并发: *赶时间吗?*](../async.md#in-a-hurry)。
diff --git a/docs/zh/docs/tutorial/metadata.md b/docs/zh/docs/tutorial/metadata.md
index b761f0888..ba480637b 100644
--- a/docs/zh/docs/tutorial/metadata.md
+++ b/docs/zh/docs/tutorial/metadata.md
@@ -74,7 +74,7 @@
{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *}
-/// info | 信息
+/// note | 注意
阅读更多关于标签的信息[路径操作配置](path-operation-configuration.md#tags)。
diff --git a/docs/zh/docs/tutorial/path-operation-configuration.md b/docs/zh/docs/tutorial/path-operation-configuration.md
index b9046a13b..b813e38f8 100644
--- a/docs/zh/docs/tutorial/path-operation-configuration.md
+++ b/docs/zh/docs/tutorial/path-operation-configuration.md
@@ -56,7 +56,7 @@ OpenAPI 概图会自动添加标签,供 API 文档接口使用:
## 从 docstring 获取描述 { #description-from-docstring }
-描述内容比较长且占用多行时,可以在函数的 docstring 中声明*路径操作*的描述,**FastAPI** 会从中读取。
+描述内容比较长且占用多行时,可以在函数的 文档字符串 中声明*路径操作*的描述,**FastAPI** 会从中读取。
文档字符串支持 [Markdown](https://en.wikipedia.org/wiki/Markdown),能正确解析和显示 Markdown 的内容,但要注意文档字符串的缩进。
@@ -72,13 +72,13 @@ OpenAPI 概图会自动添加标签,供 API 文档接口使用:
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | 信息
+/// note | 注意
注意,`response_description` 只用于描述响应,`description` 一般则用于描述*路径操作*。
///
-/// check | 检查
+/// tip | 提示
OpenAPI 规定每个*路径操作*都要有响应描述。
diff --git a/docs/zh/docs/tutorial/path-params-numeric-validations.md b/docs/zh/docs/tutorial/path-params-numeric-validations.md
index 26b91c1d7..cb4985119 100644
--- a/docs/zh/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/zh/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | 信息
+/// note | 注意
FastAPI 在 0.95.0 版本添加了对 `Annotated` 的支持(并开始推荐使用它)。
@@ -131,7 +131,7 @@ Python 不会对这个 `*` 做任何事,但它会知道之后的所有参数
* `lt`:小于(`l`ess `t`han)
* `le`:小于等于(`l`ess than or `e`qual)
-/// info | 信息
+/// note | 注意
`Query`、`Path` 以及你后面会看到的其他类,都是一个通用 `Param` 类的子类。
@@ -139,7 +139,7 @@ Python 不会对这个 `*` 做任何事,但它会知道之后的所有参数
///
-/// note | 注意
+/// note | 技术细节
当你从 `fastapi` 导入 `Query`、`Path` 和其他对象时,它们实际上是函数。
diff --git a/docs/zh/docs/tutorial/path-params.md b/docs/zh/docs/tutorial/path-params.md
index df9210673..0db71859c 100644
--- a/docs/zh/docs/tutorial/path-params.md
+++ b/docs/zh/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@
本例把 `item_id` 的类型声明为 `int`。
-/// check | 检查
+/// tip | 提示
类型声明将为函数提供错误检查、代码补全等编辑器支持。
@@ -34,7 +34,7 @@
{"item_id":3}
```
-/// check | 检查
+/// tip | 提示
注意,函数接收并返回的值是 `3`( `int`),不是 `"3"`(`str`)。
@@ -66,7 +66,7 @@
值的类型不是 `int` 而是浮点数(`float`)时也会显示同样的错误,比如: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | 检查
+/// tip | 提示
**FastAPI** 使用同样的 Python 类型声明实现了数据校验。
@@ -82,7 +82,7 @@
-/// check | 检查
+/// tip | 提示
还是使用 Python 类型声明,**FastAPI** 提供了(集成 Swagger UI 的)自动交互式文档。
@@ -102,7 +102,7 @@
## Pydantic { #pydantic }
-FastAPI 充分地利用了 [Pydantic](https://docs.pydantic.dev/) 的优势,用它在后台校验数据。众所周知,Pydantic 擅长的就是数据校验。
+所有数据校验都由 [Pydantic](https://docs.pydantic.dev/) 在幕后完成,因此你能从中获得所有好处。而且你可以放心。
同样,`str`、`float`、`bool` 以及很多复合数据类型都可以使用类型声明。
diff --git a/docs/zh/docs/tutorial/query-params-str-validations.md b/docs/zh/docs/tutorial/query-params-str-validations.md
index 67a5b4000..05cefc6e2 100644
--- a/docs/zh/docs/tutorial/query-params-str-validations.md
+++ b/docs/zh/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ FastAPI 会因为默认值 `= None` 而知道 `q` 的值不是必填的。
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | 信息
+/// note | 注意
FastAPI 在 0.95.0 版本中添加了对 `Annotated` 的支持(并开始推荐使用)。
@@ -381,7 +381,7 @@ Pydantic 还有 [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | 信息
+/// note | 注意
这在 Pydantic 2 或更高版本中可用。😎
diff --git a/docs/zh/docs/tutorial/query-params.md b/docs/zh/docs/tutorial/query-params.md
index 9d6c05fbb..c9cb2d26e 100644
--- a/docs/zh/docs/tutorial/query-params.md
+++ b/docs/zh/docs/tutorial/query-params.md
@@ -65,7 +65,7 @@ http://127.0.0.1:8000/items/?skip=20
本例中,查询参数 `q` 是可选的,默认值为 `None`。
-/// check | 检查
+/// tip | 提示
注意,**FastAPI** 可以识别出 `item_id` 是路径参数,`q` 不是路径参数,而是查询参数。
diff --git a/docs/zh/docs/tutorial/request-files.md b/docs/zh/docs/tutorial/request-files.md
index 6569e1715..102d42215 100644
--- a/docs/zh/docs/tutorial/request-files.md
+++ b/docs/zh/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
你可以使用 `File` 定义由客户端上传的文件。
-/// info | 信息
+/// note | 注意
要接收上传的文件,请先安装 [`python-multipart`](https://github.com/Kludex/python-multipart)。
@@ -28,7 +28,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | 信息
+/// note | 注意
`File` 是直接继承自 `Form` 的类。
diff --git a/docs/zh/docs/tutorial/request-form-models.md b/docs/zh/docs/tutorial/request-form-models.md
index ec52710a8..bbe805ef8 100644
--- a/docs/zh/docs/tutorial/request-form-models.md
+++ b/docs/zh/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
你可以在 FastAPI 中使用 **Pydantic 模型**声明**表单字段**。
-/// info | 信息
+/// note | 注意
要使用表单,首先安装 [`python-multipart`](https://github.com/Kludex/python-multipart)。
diff --git a/docs/zh/docs/tutorial/request-forms-and-files.md b/docs/zh/docs/tutorial/request-forms-and-files.md
index 8e092af0a..d97239136 100644
--- a/docs/zh/docs/tutorial/request-forms-and-files.md
+++ b/docs/zh/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
FastAPI 支持同时使用 `File` 和 `Form` 定义文件和表单字段。
-/// info | 信息
+/// note | 注意
接收上传的文件和/或表单数据,首先安装 [`python-multipart`](https://github.com/Kludex/python-multipart)。
diff --git a/docs/zh/docs/tutorial/request-forms.md b/docs/zh/docs/tutorial/request-forms.md
index ab82a181a..3d305779f 100644
--- a/docs/zh/docs/tutorial/request-forms.md
+++ b/docs/zh/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
当你需要接收表单字段而不是 JSON 时,可以使用 `Form`。
-/// info
+/// note
要使用表单,首先安装 [`python-multipart`](https://github.com/Kludex/python-multipart)。
@@ -32,7 +32,7 @@ $ pip install python-multipart
使用 `Form` 可以像使用 `Body`(以及 `Query`、`Path`、`Cookie`)一样声明相同的配置,包括校验、示例、别名(例如将 `username` 写成 `user-name`)等。
-/// info
+/// note
`Form` 是直接继承自 `Body` 的类。
diff --git a/docs/zh/docs/tutorial/response-model.md b/docs/zh/docs/tutorial/response-model.md
index 9b4e0382e..5d8d0c185 100644
--- a/docs/zh/docs/tutorial/response-model.md
+++ b/docs/zh/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPI 会使用这个 `response_model` 来完成数据文档、校验等,并
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | 信息
+/// note | 注意
要使用 `EmailStr`,首先安装 [`email-validator`](https://github.com/JoshData/python-email-validator)。
@@ -116,7 +116,7 @@ $ pip install "pydantic[email]"
{* ../../docs_src/response_model/tutorial003_py310.py hl[24] *}
-……我们仍将 `response_model` 声明为不包含密码的 `UserOut` 模型:
+...我们仍将 `response_model` 声明为不包含密码的 `UserOut` 模型:
{* ../../docs_src/response_model/tutorial003_py310.py hl[22] *}
@@ -128,7 +128,7 @@ $ pip install "pydantic[email]"
这就是为什么在这个例子里我们必须在 `response_model` 参数中声明它。
-……但继续往下读,看看如何更好地处理这种情况。
+...但继续往下读,看看如何更好地处理这种情况。
## 返回类型与数据过滤 { #return-type-and-data-filtering }
@@ -206,7 +206,7 @@ FastAPI 在内部配合 Pydantic 做了多项处理,确保不会把类继承
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
-……它失败是因为该类型注解不是 Pydantic 类型,也不只是单个 `Response` 类或其子类,而是 `Response` 与 `dict` 的联合类型(任意其一)。
+...它失败是因为该类型注解不是 Pydantic 类型,也不只是单个 `Response` 类或其子类,而是 `Response` 与 `dict` 的联合类型(任意其一)。
### 禁用响应模型 { #disable-response-model }
@@ -251,7 +251,7 @@ FastAPI 在内部配合 Pydantic 做了多项处理,确保不会把类继承
}
```
-/// info | 信息
+/// note | 注意
你还可以使用:
diff --git a/docs/zh/docs/tutorial/response-status-code.md b/docs/zh/docs/tutorial/response-status-code.md
index e57c0e593..411ece71c 100644
--- a/docs/zh/docs/tutorial/response-status-code.md
+++ b/docs/zh/docs/tutorial/response-status-code.md
@@ -18,7 +18,7 @@
`status_code` 参数接收表示 HTTP 状态码的数字。
-/// info | 信息
+/// note | 注意
`status_code` 还能接收 `IntEnum` 类型,比如 Python 的 [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)。
diff --git a/docs/zh/docs/tutorial/schema-extra-example.md b/docs/zh/docs/tutorial/schema-extra-example.md
index 482abd21d..2ea590c86 100644
--- a/docs/zh/docs/tutorial/schema-extra-example.md
+++ b/docs/zh/docs/tutorial/schema-extra-example.md
@@ -24,7 +24,7 @@
///
-/// info | 信息
+/// note | 注意
OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)增加了对 `examples` 的支持,它是 JSON Schema 标准的一部分。
@@ -155,7 +155,7 @@ OpenAPI 还在规范的其他部分添加了 `example` 和 `examples` 字段:
- `File()`
- `Form()`
-/// info | 信息
+/// note | 注意
这个旧的、OpenAPI 特定的 `examples` 参数,自 FastAPI `0.103.0` 起改名为 `openapi_examples`。
@@ -171,7 +171,7 @@ OpenAPI 还在规范的其他部分添加了 `example` 和 `examples` 字段:
JSON Schema 中这个新的 `examples` 字段只是一个由示例组成的 `list`,而不是像上面提到的 OpenAPI 其他位置那样带有额外元数据的 `dict`。
-/// info | 信息
+/// note | 注意
即使在 OpenAPI 3.1.0 发布、并与 JSON Schema 有了这种更简单的集成之后,有一段时间里,提供自动文档的 Swagger UI 并不支持 OpenAPI 3.1.0(它自 5.0.0 版本起已支持 🎉)。
diff --git a/docs/zh/docs/tutorial/security/first-steps.md b/docs/zh/docs/tutorial/security/first-steps.md
index 6cc91211a..e274d513a 100644
--- a/docs/zh/docs/tutorial/security/first-steps.md
+++ b/docs/zh/docs/tutorial/security/first-steps.md
@@ -24,13 +24,13 @@
## 运行 { #run-it }
-/// info | 信息
+/// note | 注意
当你使用命令 `pip install "fastapi[standard]"` 安装 **FastAPI** 时,[`python-multipart`](https://github.com/Kludex/python-multipart) 包会自动安装。
但是,如果你使用 `pip install fastapi`,默认不会包含 `python-multipart` 包。
-如需手动安装,请先创建并激活[虚拟环境](../../virtual-environments.md),然后执行:
+如需手动安装,请先创建[虚拟环境](../../virtual-environments.md)、激活它,然后执行:
```console
$ pip install python-multipart
@@ -60,7 +60,7 @@ $ fastapi dev
-/// check | Authorize 按钮!
+/// tip | Authorize 按钮!
页面右上角已经有一个崭新的“Authorize”按钮。
@@ -118,7 +118,7 @@ OAuth2 的设计目标是让后端或 API 与负责用户认证的服务器解
本示例将使用 **OAuth2** 的 **Password** 流程并配合 **Bearer** 令牌,通过 `OAuth2PasswordBearer` 类来实现。
-/// info | 信息
+/// note | 注意
“Bearer” 令牌并非唯一选项。
@@ -148,7 +148,7 @@ OAuth2 的设计目标是让后端或 API 与负责用户认证的服务器解
我们很快也会创建对应的实际路径操作。
-/// info | 信息
+/// note | 注意
如果你是非常严格的 “Pythonista”,可能不喜欢使用参数名 `tokenUrl` 而不是 `token_url`。
@@ -176,7 +176,7 @@ oauth2_scheme(some, parameters)
**FastAPI** 会据此在 OpenAPI 架构(以及自动生成的 API 文档)中定义一个“安全方案”。
-/// info | 技术细节
+/// note | 技术细节
**FastAPI** 之所以知道可以使用(在依赖中声明的)`OAuth2PasswordBearer` 在 OpenAPI 中定义安全方案,是因为它继承自 `fastapi.security.oauth2.OAuth2`,而后者又继承自 `fastapi.security.base.SecurityBase`。
diff --git a/docs/zh/docs/tutorial/security/get-current-user.md b/docs/zh/docs/tutorial/security/get-current-user.md
index 814ff2c82..e8a1de9d5 100644
--- a/docs/zh/docs/tutorial/security/get-current-user.md
+++ b/docs/zh/docs/tutorial/security/get-current-user.md
@@ -53,7 +53,7 @@
///
-/// check | 检查
+/// tip | 提示
依赖系统的这种设计方式可以支持不同的依赖项返回同一个 `User` 模型。
diff --git a/docs/zh/docs/tutorial/security/oauth2-jwt.md b/docs/zh/docs/tutorial/security/oauth2-jwt.md
index 8a56137d3..e0cbdf685 100644
--- a/docs/zh/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/zh/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | 信息
+/// note | 注意
如果你计划使用类似 RSA 或 ECDSA 的数字签名算法,你应该安装加密库依赖项 `pyjwt[crypto]`。
@@ -213,7 +213,7 @@ JWT 除了用于识别用户并允许其直接在你的 API 上执行操作之
用户名: `johndoe`
密码: `secret`
-/// check | 检查
+/// tip | 提示
注意,代码中的任何地方都没有明文密码 “`secret`”,我们只有它的哈希版本。
diff --git a/docs/zh/docs/tutorial/security/simple-oauth2.md b/docs/zh/docs/tutorial/security/simple-oauth2.md
index d8d5b561e..6ebf77e36 100644
--- a/docs/zh/docs/tutorial/security/simple-oauth2.md
+++ b/docs/zh/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ OAuth2 还支持客户端发送**`scope`**表单字段。
* 脸书和 Instagram 使用 `instagram_basic`
* 谷歌使用 `https://www.googleapis.com/auth/drive`
-/// info | 信息
+/// note | 注意
OAuth2 中,**作用域**只是声明指定权限的字符串。
@@ -72,7 +72,7 @@ OAuth2 中,**作用域**只是声明指定权限的字符串。
* 可选的 `client_id`(本例未使用)
* 可选的 `client_secret`(本例未使用)
-/// info | 信息
+/// note | 注意
`OAuth2PasswordRequestForm` 并不像 `OAuth2PasswordBearer` 那样是 **FastAPI** 的特殊类。
@@ -144,7 +144,7 @@ UserInDB(
)
```
-/// info | 信息
+/// note | 注意
`user_dict` 的说明,详见[**更多模型**一章](../extra-models.md#about-user-in-dict)。
@@ -196,7 +196,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | 信息
+/// note | 注意
此处返回值为 `Bearer` 的响应头 `WWW-Authenticate` 也是规范的一部分。
diff --git a/docs/zh/docs/tutorial/server-sent-events.md b/docs/zh/docs/tutorial/server-sent-events.md
index c78562b91..8542756f2 100644
--- a/docs/zh/docs/tutorial/server-sent-events.md
+++ b/docs/zh/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@
这类似于[流式传输 JSON Lines](stream-json-lines.md),但使用 `text/event-stream` 格式,浏览器原生通过 [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) 支持。
-/// info | 信息
+/// note | 注意
新增于 FastAPI 0.135.0。
diff --git a/docs/zh/docs/tutorial/stream-json-lines.md b/docs/zh/docs/tutorial/stream-json-lines.md
index 8a27dce76..e98022501 100644
--- a/docs/zh/docs/tutorial/stream-json-lines.md
+++ b/docs/zh/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
当你想以“流”的方式发送一系列数据时,可以使用 JSON Lines。
-/// info | 信息
+/// note | 注意
新增于 FastAPI 0.134.0。
@@ -48,7 +48,7 @@ sequenceDiagram
它与 JSON 数组(相当于 Python 的 list)非常相似,但不是用 `[]` 包裹、并在各项之间使用 `,` 分隔,而是每行一个 JSON 对象,彼此以换行符分隔。
-/// info | 信息
+/// note | 注意
关键在于你的应用可以逐行生成数据,而客户端在消费前面的行。
diff --git a/docs/zh/docs/tutorial/testing.md b/docs/zh/docs/tutorial/testing.md
index 6607a1239..50e1d8f2d 100644
--- a/docs/zh/docs/tutorial/testing.md
+++ b/docs/zh/docs/tutorial/testing.md
@@ -8,7 +8,7 @@
## 使用 `TestClient` { #using-testclient }
-/// info | 信息
+/// note | 注意
要使用 `TestClient`,先要安装 [`httpx`](https://www.python-httpx.org)。
@@ -142,7 +142,7 @@ $ pip install httpx
关于如何传数据给后端的更多信息(使用 `httpx` 或 `TestClient`),请查阅 [HTTPX 文档](https://www.python-httpx.org)。
-/// info | 信息
+/// note | 注意
注意 `TestClient` 接收可以被转化为JSON的数据,而不是Pydantic模型。
diff --git a/docs_src/path_operation_advanced_configuration/tutorial002_py310.py b/docs_src/path_operation_advanced_configuration/tutorial002_py310.py
index 3aaae9b37..5c2257ed6 100644
--- a/docs_src/path_operation_advanced_configuration/tutorial002_py310.py
+++ b/docs_src/path_operation_advanced_configuration/tutorial002_py310.py
@@ -1,24 +1,14 @@
from fastapi import FastAPI
from fastapi.routing import APIRoute
-app = FastAPI()
-
-@app.get("/items/")
-async def read_items():
- return [{"item_id": "Foo"}]
+def custom_generate_unique_id(route: APIRoute) -> str:
+ return route.name
-def use_route_names_as_operation_ids(app: FastAPI) -> None:
- """
- Simplify operation IDs so that generated API clients have simpler function
- names.
+app = FastAPI(generate_unique_id_function=custom_generate_unique_id)
- Should be called only after all routes have been added.
- """
- for route in app.routes:
- if isinstance(route, APIRoute):
- route.operation_id = route.name # in this case, 'read_items'
-
-use_route_names_as_operation_ids(app)
+@app.get("/items/")
+async def read_items():
+ return [{"item_id": "Foo"}]
diff --git a/fastapi/__init__.py b/fastapi/__init__.py
index 38e747232..fdd584b40 100644
--- a/fastapi/__init__.py
+++ b/fastapi/__init__.py
@@ -1,6 +1,6 @@
"""FastAPI framework, high performance, easy to learn, fast to code, ready for production"""
-__version__ = "0.136.3"
+__version__ = "0.137.1"
from starlette import status as status
diff --git a/fastapi/applications.py b/fastapi/applications.py
index faac6853f..c7c551e4e 100644
--- a/fastapi/applications.py
+++ b/fastapi/applications.py
@@ -921,6 +921,7 @@ class FastAPI(Starlette):
),
] = "3.1.0"
self.openapi_schema: dict[str, Any] | None = None
+ self._openapi_routes_version: int | None = None
if self.openapi_url:
assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'"
assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'"
@@ -1079,7 +1080,8 @@ class FastAPI(Starlette):
Read more in the
[FastAPI docs for OpenAPI](https://fastapi.tiangolo.com/how-to/extending-openapi/).
"""
- if not self.openapi_schema:
+ routes_version = self.router._get_routes_version()
+ if not self.openapi_schema or self._openapi_routes_version != routes_version:
self.openapi_schema = get_openapi(
title=self.title,
version=self.version,
@@ -1096,6 +1098,7 @@ class FastAPI(Starlette):
separate_input_output_schemas=self.separate_input_output_schemas,
external_docs=self.openapi_external_docs,
)
+ self._openapi_routes_version = routes_version
return self.openapi_schema
def setup(self) -> None:
diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py
index 1c7a17c4c..ab4543d34 100644
--- a/fastapi/openapi/utils.py
+++ b/fastapi/openapi/utils.py
@@ -213,7 +213,7 @@ def get_openapi_operation_request_body(
def generate_operation_id(
- *, route: routing.APIRoute, method: str
+ *, route: routing._APIRouteLike, method: str
) -> str: # pragma: nocover
warnings.warn(
message="fastapi.openapi.utils.generate_operation_id() was deprecated, "
@@ -227,14 +227,14 @@ def generate_operation_id(
return generate_operation_id_for_path(name=route.name, path=path, method=method)
-def generate_operation_summary(*, route: routing.APIRoute, method: str) -> str:
+def generate_operation_summary(*, route: routing._APIRouteLike, method: str) -> str:
if route.summary:
return route.summary
return route.name.replace("_", " ").title()
def get_openapi_operation_metadata(
- *, route: routing.APIRoute, method: str, operation_ids: set[str]
+ *, route: routing._APIRouteLike, method: str, operation_ids: set[str]
) -> dict[str, Any]:
operation: dict[str, Any] = {}
if route.tags:
@@ -259,7 +259,7 @@ def get_openapi_operation_metadata(
def get_openapi_path(
*,
- route: routing.APIRoute,
+ route: routing._APIRouteLike,
operation_ids: set[str],
model_name_map: ModelNameMap,
field_mapping: dict[
@@ -329,7 +329,7 @@ def get_openapi_path(
cb_security_schemes,
cb_definitions,
) = get_openapi_path(
- route=callback,
+ route=cast(routing._APIRouteLike, callback),
operation_ids=operation_ids,
model_name_map=model_name_map,
field_mapping=field_mapping,
@@ -478,6 +478,18 @@ def get_openapi_path(
return path, security_schemes, definitions
+def _get_api_route_for_openapi(
+ route: BaseRoute, route_context: routing._EffectiveRouteContext | None
+) -> routing._APIRouteLike | None:
+ if route_context is not None and isinstance(
+ route_context.original_route, routing.APIRoute
+ ):
+ return cast(routing._APIRouteLike, route_context)
+ if isinstance(route, routing.APIRoute):
+ return cast(routing._APIRouteLike, route)
+ return None
+
+
def get_fields_from_routes(
routes: Sequence[BaseRoute],
) -> list[ModelField]:
@@ -485,24 +497,25 @@ def get_fields_from_routes(
responses_from_routes: list[ModelField] = []
request_fields_from_routes: list[ModelField] = []
callback_flat_models: list[ModelField] = []
- for route in routes:
- if not isinstance(route, routing.APIRoute):
+ for route, route_context in routing._iter_routes_with_context(routes):
+ api_route = _get_api_route_for_openapi(route, route_context)
+ if api_route is None:
continue
- if route.include_in_schema:
- if route.body_field:
- assert isinstance(route.body_field, ModelField), (
+ if api_route.include_in_schema:
+ if api_route.body_field:
+ assert isinstance(api_route.body_field, ModelField), (
"A request body must be a Pydantic Field"
)
- body_fields_from_routes.append(route.body_field)
- if route.response_field:
- responses_from_routes.append(route.response_field)
- if route.response_fields:
- responses_from_routes.extend(route.response_fields.values())
- if route.stream_item_field:
- responses_from_routes.append(route.stream_item_field)
- if route.callbacks:
- callback_flat_models.extend(get_fields_from_routes(route.callbacks))
- params = get_flat_params(route.dependant)
+ body_fields_from_routes.append(api_route.body_field)
+ if api_route.response_field:
+ responses_from_routes.append(api_route.response_field)
+ if api_route.response_fields:
+ responses_from_routes.extend(api_route.response_fields.values())
+ if api_route.stream_item_field:
+ responses_from_routes.append(api_route.stream_item_field)
+ if api_route.callbacks:
+ callback_flat_models.extend(get_fields_from_routes(api_route.callbacks))
+ params = get_flat_params(api_route.dependant)
request_fields_from_routes.extend(params)
flat_models = callback_flat_models + list(
@@ -546,7 +559,7 @@ def get_openapi(
paths: dict[str, dict[str, Any]] = {}
webhook_paths: dict[str, dict[str, Any]] = {}
operation_ids: set[str] = set()
- all_fields = get_fields_from_routes(list(routes or []) + list(webhooks or []))
+ all_fields = get_fields_from_routes(list(routes) + list(webhooks or []))
flat_models = get_flat_models_from_fields(all_fields, known_models=set())
model_name_map = get_model_name_map(flat_models)
field_mapping, definitions = get_definitions(
@@ -554,10 +567,11 @@ def get_openapi(
model_name_map=model_name_map,
separate_input_output_schemas=separate_input_output_schemas,
)
- for route in routes or []:
- if isinstance(route, routing.APIRoute):
+ for route, route_context in routing._iter_routes_with_context(routes):
+ api_route = _get_api_route_for_openapi(route, route_context)
+ if api_route is not None:
result = get_openapi_path(
- route=route,
+ route=api_route,
operation_ids=operation_ids,
model_name_map=model_name_map,
field_mapping=field_mapping,
@@ -566,17 +580,18 @@ def get_openapi(
if result:
path, security_schemes, path_definitions = result
if path:
- paths.setdefault(route.path_format, {}).update(path)
+ paths.setdefault(api_route.path_format, {}).update(path)
if security_schemes:
components.setdefault("securitySchemes", {}).update(
security_schemes
)
if path_definitions:
definitions.update(path_definitions)
- for webhook in webhooks or []:
- if isinstance(webhook, routing.APIRoute):
+ for webhook, webhook_context in routing._iter_routes_with_context(webhooks or []):
+ api_webhook = _get_api_route_for_openapi(webhook, webhook_context)
+ if api_webhook is not None:
result = get_openapi_path(
- route=webhook,
+ route=api_webhook,
operation_ids=operation_ids,
model_name_map=model_name_map,
field_mapping=field_mapping,
@@ -585,7 +600,7 @@ def get_openapi(
if result:
path, security_schemes, path_definitions = result
if path:
- webhook_paths.setdefault(webhook.path_format, {}).update(path)
+ webhook_paths.setdefault(api_webhook.path_format, {}).update(path)
if security_schemes:
components.setdefault("securitySchemes", {}).update(
security_schemes
diff --git a/fastapi/routing.py b/fastapi/routing.py
index c3e3e9899..da8bef418 100644
--- a/fastapi/routing.py
+++ b/fastapi/routing.py
@@ -1,4 +1,5 @@
import contextlib
+import copy
import email.message
import functools
import inspect
@@ -21,10 +22,13 @@ from contextlib import (
AsyncExitStack,
asynccontextmanager,
)
+from contextvars import ContextVar
+from dataclasses import dataclass, field
from enum import Enum, IntEnum
from typing import (
Annotated,
Any,
+ Protocol,
TypeVar,
cast,
)
@@ -74,12 +78,17 @@ from fastapi.utils import (
)
from starlette import routing
from starlette._exception_handler import wrap_app_handling_exceptions
-from starlette._utils import is_async_callable
+from starlette._utils import get_route_path, is_async_callable
from starlette.concurrency import iterate_in_threadpool, run_in_threadpool
-from starlette.datastructures import FormData
+from starlette.datastructures import FormData, URLPath
from starlette.exceptions import HTTPException
from starlette.requests import Request
-from starlette.responses import JSONResponse, Response, StreamingResponse
+from starlette.responses import (
+ JSONResponse,
+ PlainTextResponse,
+ Response,
+ StreamingResponse,
+)
from starlette.routing import (
BaseRoute,
Match,
@@ -825,7 +834,286 @@ class APIWebSocketRoute(routing.WebSocketRoute):
return match, child_scope
+_FASTAPI_SCOPE_KEY = "fastapi"
+_FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY = "effective_route_context"
+_FASTAPI_INCLUDED_ROUTER_KEY = "included_router"
+_effective_route_context_var: ContextVar[Any | None] = ContextVar(
+ "fastapi_effective_route_context", default=None
+)
+_SCOPE_MISSING = object()
+
+
+def _get_fastapi_scope(scope: Scope) -> dict[str, Any]:
+ fastapi_scope = scope.setdefault(_FASTAPI_SCOPE_KEY, {})
+ assert isinstance(fastapi_scope, dict)
+ return fastapi_scope
+
+
+def _get_scope_effective_route_context(scope: Scope) -> Any | None:
+ return scope.get(_FASTAPI_SCOPE_KEY, {}).get(_FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY)
+
+
+def _get_scope_included_router(scope: Scope) -> Any | None:
+ return scope.get(_FASTAPI_SCOPE_KEY, {}).get(_FASTAPI_INCLUDED_ROUTER_KEY)
+
+
+def _restore_fastapi_scope_key(scope: Scope, key: str, previous: Any) -> None:
+ fastapi_scope = scope.get(_FASTAPI_SCOPE_KEY)
+ if not isinstance(fastapi_scope, dict):
+ return
+ if previous is _SCOPE_MISSING:
+ fastapi_scope.pop(key, None)
+ else:
+ fastapi_scope[key] = previous
+
+
+class _APIRouteLike(Protocol):
+ path: str
+ endpoint: Callable[..., Any]
+ stream_item_type: Any | None
+ response_model: Any
+ summary: str | None
+ response_description: str
+ deprecated: bool | None
+ operation_id: str | None
+ response_model_include: IncEx | None
+ response_model_exclude: IncEx | None
+ response_model_by_alias: bool
+ response_model_exclude_unset: bool
+ response_model_exclude_defaults: bool
+ response_model_exclude_none: bool
+ include_in_schema: bool
+ response_class: type[Response] | DefaultPlaceholder
+ dependency_overrides_provider: Any | None
+ callbacks: list[BaseRoute] | None
+ openapi_extra: dict[str, Any] | None
+ generate_unique_id_function: Callable[[Any], str] | DefaultPlaceholder
+ strict_content_type: bool | DefaultPlaceholder
+ tags: list[str | Enum]
+ responses: dict[int | str, dict[str, Any]]
+ name: str
+ path_regex: Any
+ path_format: str
+ param_convertors: dict[str, Any]
+ methods: set[str]
+ unique_id: str
+ status_code: int | None
+ response_field: ModelField | None
+ stream_item_field: ModelField | None
+ dependencies: list[params.Depends]
+ description: str
+ response_fields: dict[int | str, ModelField]
+ dependant: Dependant
+ _flat_dependant: Dependant
+ _embed_body_fields: bool
+ body_field: ModelField | None
+ is_sse_stream: bool
+ is_json_stream: bool
+
+
+def _populate_api_route_state(
+ route: _APIRouteLike,
+ path: str,
+ endpoint: Callable[..., Any],
+ *,
+ response_model: Any = Default(None),
+ status_code: int | None = None,
+ tags: list[str | Enum] | None = None,
+ dependencies: Sequence[params.Depends] | None = None,
+ summary: str | None = None,
+ description: str | None = None,
+ response_description: str = "Successful Response",
+ responses: dict[int | str, dict[str, Any]] | None = None,
+ deprecated: bool | None = None,
+ name: str | None = None,
+ methods: set[str] | list[str] | None = None,
+ operation_id: str | None = None,
+ response_model_include: IncEx | None = None,
+ response_model_exclude: IncEx | None = None,
+ response_model_by_alias: bool = True,
+ response_model_exclude_unset: bool = False,
+ response_model_exclude_defaults: bool = False,
+ response_model_exclude_none: bool = False,
+ include_in_schema: bool = True,
+ response_class: type[Response] | DefaultPlaceholder = Default(JSONResponse),
+ dependency_overrides_provider: Any | None = None,
+ callbacks: list[BaseRoute] | None = None,
+ openapi_extra: dict[str, Any] | None = None,
+ generate_unique_id_function: Callable[[Any], str] | DefaultPlaceholder = Default(
+ generate_unique_id
+ ),
+ strict_content_type: bool | DefaultPlaceholder = Default(True),
+) -> None:
+ route.path = path
+ route.endpoint = endpoint
+ route.stream_item_type = None
+ if isinstance(response_model, DefaultPlaceholder):
+ return_annotation = get_typed_return_annotation(endpoint)
+ if lenient_issubclass(return_annotation, Response):
+ response_model = None
+ else:
+ stream_item = get_stream_item_type(return_annotation)
+ if stream_item is not None:
+ # Extract item type for JSONL or SSE streaming when
+ # response_class is DefaultPlaceholder (JSONL) or
+ # EventSourceResponse (SSE).
+ # ServerSentEvent is excluded: it's a transport
+ # wrapper, not a data model, so it shouldn't feed
+ # into validation or OpenAPI schema generation.
+ if (
+ isinstance(response_class, DefaultPlaceholder)
+ or lenient_issubclass(response_class, EventSourceResponse)
+ ) and not lenient_issubclass(stream_item, ServerSentEvent):
+ route.stream_item_type = stream_item
+ response_model = None
+ else:
+ response_model = return_annotation
+ route.response_model = response_model
+ route.summary = summary
+ route.response_description = response_description
+ route.deprecated = deprecated
+ route.operation_id = operation_id
+ route.response_model_include = response_model_include
+ route.response_model_exclude = response_model_exclude
+ route.response_model_by_alias = response_model_by_alias
+ route.response_model_exclude_unset = response_model_exclude_unset
+ route.response_model_exclude_defaults = response_model_exclude_defaults
+ route.response_model_exclude_none = response_model_exclude_none
+ route.include_in_schema = include_in_schema
+ route.response_class = response_class
+ route.dependency_overrides_provider = dependency_overrides_provider
+ route.callbacks = callbacks
+ route.openapi_extra = openapi_extra
+ route.generate_unique_id_function = generate_unique_id_function
+ route.strict_content_type = strict_content_type
+ route.tags = tags or []
+ route.responses = responses or {}
+ route.name = get_name(endpoint) if name is None else name
+ route.path_regex, route.path_format, route.param_convertors = compile_path(path)
+ if methods is None:
+ methods = ["GET"]
+ route.methods = {method.upper() for method in methods}
+ if isinstance(generate_unique_id_function, DefaultPlaceholder):
+ current_generate_unique_id: Callable[[Any], str] = (
+ generate_unique_id_function.value
+ )
+ else:
+ current_generate_unique_id = generate_unique_id_function
+ route.unique_id = route.operation_id or current_generate_unique_id(route)
+ # normalize enums e.g. http.HTTPStatus
+ if isinstance(status_code, IntEnum):
+ status_code = int(status_code)
+ route.status_code = status_code
+ if route.response_model:
+ assert is_body_allowed_for_status_code(status_code), (
+ f"Status code {status_code} must not have a response body"
+ )
+ response_name = "Response_" + route.unique_id
+ route.response_field = create_model_field(
+ name=response_name,
+ type_=route.response_model,
+ mode="serialization",
+ )
+ else:
+ route.response_field = None
+ if route.stream_item_type:
+ stream_item_name = "StreamItem_" + route.unique_id
+ route.stream_item_field = create_model_field(
+ name=stream_item_name,
+ type_=route.stream_item_type,
+ mode="serialization",
+ )
+ else:
+ route.stream_item_field = None
+ route.dependencies = list(dependencies or [])
+ route.description = description or inspect.cleandoc(route.endpoint.__doc__ or "")
+ # if a "form feed" character (page break) is found in the description text,
+ # truncate description text to the content preceding the first "form feed"
+ route.description = route.description.split("\f")[0].strip()
+ response_fields = {}
+ for additional_status_code, response in route.responses.items():
+ assert isinstance(response, dict), "An additional response must be a dict"
+ model = response.get("model")
+ if model:
+ assert is_body_allowed_for_status_code(additional_status_code), (
+ f"Status code {additional_status_code} must not have a response body"
+ )
+ response_name = f"Response_{additional_status_code}_{route.unique_id}"
+ response_field = create_model_field(
+ name=response_name, type_=model, mode="serialization"
+ )
+ response_fields[additional_status_code] = response_field
+ if response_fields:
+ route.response_fields = response_fields
+ else:
+ route.response_fields = {}
+
+ assert callable(endpoint), "An endpoint must be a callable"
+ route.dependant = get_dependant(
+ path=route.path_format, call=route.endpoint, scope="function"
+ )
+ for depends in route.dependencies[::-1]:
+ route.dependant.dependencies.insert(
+ 0,
+ get_parameterless_sub_dependant(depends=depends, path=route.path_format),
+ )
+ route._flat_dependant = get_flat_dependant(route.dependant)
+ route._embed_body_fields = _should_embed_body_fields(
+ route._flat_dependant.body_params
+ )
+ route.body_field = get_body_field(
+ flat_dependant=route._flat_dependant,
+ name=route.unique_id,
+ embed_body_fields=route._embed_body_fields,
+ )
+ # Detect generator endpoints that should stream as JSONL or SSE
+ is_generator = (
+ route.dependant.is_async_gen_callable or route.dependant.is_gen_callable
+ )
+ route.is_sse_stream = is_generator and lenient_issubclass(
+ response_class, EventSourceResponse
+ )
+ route.is_json_stream = is_generator and isinstance(
+ response_class, DefaultPlaceholder
+ )
+
+
class APIRoute(routing.Route):
+ stream_item_type: Any | None
+ response_model: Any
+ summary: str | None
+ response_description: str
+ deprecated: bool | None
+ operation_id: str | None
+ response_model_include: IncEx | None
+ response_model_exclude: IncEx | None
+ response_model_by_alias: bool
+ response_model_exclude_unset: bool
+ response_model_exclude_defaults: bool
+ response_model_exclude_none: bool
+ include_in_schema: bool
+ response_class: type[Response] | DefaultPlaceholder
+ dependency_overrides_provider: Any | None
+ callbacks: list[BaseRoute] | None
+ openapi_extra: dict[str, Any] | None
+ generate_unique_id_function: Callable[[Any], str] | DefaultPlaceholder
+ strict_content_type: bool | DefaultPlaceholder
+ tags: list[str | Enum]
+ responses: dict[int | str, dict[str, Any]]
+ unique_id: str
+ status_code: int | None
+ response_field: ModelField | None
+ stream_item_field: ModelField | None
+ dependencies: list[params.Depends]
+ description: str
+ response_fields: dict[int | str, ModelField]
+ dependant: Dependant
+ _flat_dependant: Dependant
+ _embed_body_fields: bool
+ body_field: ModelField | None
+ is_sse_stream: bool
+ is_json_stream: bool
+
def __init__(
self,
path: str,
@@ -858,166 +1146,541 @@ class APIRoute(routing.Route):
| DefaultPlaceholder = Default(generate_unique_id),
strict_content_type: bool | DefaultPlaceholder = Default(True),
) -> None:
- self.path = path
- self.endpoint = endpoint
- self.stream_item_type: Any | None = None
- if isinstance(response_model, DefaultPlaceholder):
- return_annotation = get_typed_return_annotation(endpoint)
- if lenient_issubclass(return_annotation, Response):
- response_model = None
- else:
- stream_item = get_stream_item_type(return_annotation)
- if stream_item is not None:
- # Extract item type for JSONL or SSE streaming when
- # response_class is DefaultPlaceholder (JSONL) or
- # EventSourceResponse (SSE).
- # ServerSentEvent is excluded: it's a transport
- # wrapper, not a data model, so it shouldn't feed
- # into validation or OpenAPI schema generation.
- if (
- isinstance(response_class, DefaultPlaceholder)
- or lenient_issubclass(response_class, EventSourceResponse)
- ) and not lenient_issubclass(stream_item, ServerSentEvent):
- self.stream_item_type = stream_item
- response_model = None
- else:
- response_model = return_annotation
- self.response_model = response_model
- self.summary = summary
- self.response_description = response_description
- self.deprecated = deprecated
- self.operation_id = operation_id
- self.response_model_include = response_model_include
- self.response_model_exclude = response_model_exclude
- self.response_model_by_alias = response_model_by_alias
- self.response_model_exclude_unset = response_model_exclude_unset
- self.response_model_exclude_defaults = response_model_exclude_defaults
- self.response_model_exclude_none = response_model_exclude_none
- self.include_in_schema = include_in_schema
- self.response_class = response_class
- self.dependency_overrides_provider = dependency_overrides_provider
- self.callbacks = callbacks
- self.openapi_extra = openapi_extra
- self.generate_unique_id_function = generate_unique_id_function
- self.strict_content_type = strict_content_type
- self.tags = tags or []
- self.responses = responses or {}
- self.name = get_name(endpoint) if name is None else name
- self.path_regex, self.path_format, self.param_convertors = compile_path(path)
- if methods is None:
- methods = ["GET"]
- self.methods: set[str] = {method.upper() for method in methods}
- if isinstance(generate_unique_id_function, DefaultPlaceholder):
- current_generate_unique_id: Callable[[APIRoute], str] = (
- generate_unique_id_function.value
- )
- else:
- current_generate_unique_id = generate_unique_id_function
- self.unique_id = self.operation_id or current_generate_unique_id(self)
- # normalize enums e.g. http.HTTPStatus
- if isinstance(status_code, IntEnum):
- status_code = int(status_code)
- self.status_code = status_code
- if self.response_model:
- assert is_body_allowed_for_status_code(status_code), (
- f"Status code {status_code} must not have a response body"
- )
- response_name = "Response_" + self.unique_id
- self.response_field = create_model_field(
- name=response_name,
- type_=self.response_model,
- mode="serialization",
- )
- else:
- self.response_field = None # type: ignore[assignment]
- if self.stream_item_type:
- stream_item_name = "StreamItem_" + self.unique_id
- self.stream_item_field: ModelField | None = create_model_field(
- name=stream_item_name,
- type_=self.stream_item_type,
- mode="serialization",
- )
- else:
- self.stream_item_field = None
- self.dependencies = list(dependencies or [])
- self.description = description or inspect.cleandoc(self.endpoint.__doc__ or "")
- # if a "form feed" character (page break) is found in the description text,
- # truncate description text to the content preceding the first "form feed"
- self.description = self.description.split("\f")[0].strip()
- response_fields = {}
- for additional_status_code, response in self.responses.items():
- assert isinstance(response, dict), "An additional response must be a dict"
- model = response.get("model")
- if model:
- assert is_body_allowed_for_status_code(additional_status_code), (
- f"Status code {additional_status_code} must not have a response body"
- )
- response_name = f"Response_{additional_status_code}_{self.unique_id}"
- response_field = create_model_field(
- name=response_name, type_=model, mode="serialization"
- )
- response_fields[additional_status_code] = response_field
- if response_fields:
- self.response_fields: dict[int | str, ModelField] = response_fields
- else:
- self.response_fields = {}
-
- assert callable(endpoint), "An endpoint must be a callable"
- self.dependant = get_dependant(
- path=self.path_format, call=self.endpoint, scope="function"
- )
- for depends in self.dependencies[::-1]:
- self.dependant.dependencies.insert(
- 0,
- get_parameterless_sub_dependant(depends=depends, path=self.path_format),
- )
- self._flat_dependant = get_flat_dependant(self.dependant)
- self._embed_body_fields = _should_embed_body_fields(
- self._flat_dependant.body_params
- )
- self.body_field = get_body_field(
- flat_dependant=self._flat_dependant,
- name=self.unique_id,
- embed_body_fields=self._embed_body_fields,
- )
- # Detect generator endpoints that should stream as JSONL or SSE
- is_generator = (
- self.dependant.is_async_gen_callable or self.dependant.is_gen_callable
- )
- self.is_sse_stream = is_generator and lenient_issubclass(
- response_class, EventSourceResponse
- )
- self.is_json_stream = is_generator and isinstance(
- response_class, DefaultPlaceholder
+ _populate_api_route_state(
+ cast(_APIRouteLike, self),
+ path,
+ endpoint,
+ response_model=response_model,
+ status_code=status_code,
+ tags=tags,
+ dependencies=dependencies,
+ summary=summary,
+ description=description,
+ response_description=response_description,
+ responses=responses,
+ deprecated=deprecated,
+ name=name,
+ methods=methods,
+ operation_id=operation_id,
+ response_model_include=response_model_include,
+ response_model_exclude=response_model_exclude,
+ response_model_by_alias=response_model_by_alias,
+ response_model_exclude_unset=response_model_exclude_unset,
+ response_model_exclude_defaults=response_model_exclude_defaults,
+ response_model_exclude_none=response_model_exclude_none,
+ include_in_schema=include_in_schema,
+ response_class=response_class,
+ dependency_overrides_provider=dependency_overrides_provider,
+ callbacks=callbacks,
+ openapi_extra=openapi_extra,
+ generate_unique_id_function=generate_unique_id_function,
+ strict_content_type=strict_content_type,
)
self.app = request_response(self.get_route_handler())
def get_route_handler(self) -> Callable[[Request], Coroutine[Any, Any, Response]]:
+ route = cast(_APIRouteLike, self)
+ # TODO: Replace or deprecate this no-scope hook so included-route
+ # effective context can be passed explicitly instead of via ContextVar.
+ effective_context = _effective_route_context_var.get()
+ if effective_context is not None and effective_context.original_route is self:
+ route = cast(_APIRouteLike, effective_context)
return get_request_handler(
- dependant=self.dependant,
- body_field=self.body_field,
- status_code=self.status_code,
- response_class=self.response_class,
- response_field=self.response_field,
- response_model_include=self.response_model_include,
- response_model_exclude=self.response_model_exclude,
- response_model_by_alias=self.response_model_by_alias,
- response_model_exclude_unset=self.response_model_exclude_unset,
- response_model_exclude_defaults=self.response_model_exclude_defaults,
- response_model_exclude_none=self.response_model_exclude_none,
- dependency_overrides_provider=self.dependency_overrides_provider,
- embed_body_fields=self._embed_body_fields,
- strict_content_type=self.strict_content_type,
- stream_item_field=self.stream_item_field,
- is_json_stream=self.is_json_stream,
+ dependant=route.dependant,
+ body_field=route.body_field,
+ status_code=route.status_code,
+ response_class=route.response_class,
+ response_field=route.response_field,
+ response_model_include=route.response_model_include,
+ response_model_exclude=route.response_model_exclude,
+ response_model_by_alias=route.response_model_by_alias,
+ response_model_exclude_unset=route.response_model_exclude_unset,
+ response_model_exclude_defaults=route.response_model_exclude_defaults,
+ response_model_exclude_none=route.response_model_exclude_none,
+ dependency_overrides_provider=route.dependency_overrides_provider,
+ embed_body_fields=route._embed_body_fields,
+ strict_content_type=route.strict_content_type,
+ stream_item_field=route.stream_item_field,
+ is_json_stream=route.is_json_stream,
)
def matches(self, scope: Scope) -> tuple[Match, Scope]:
- match, child_scope = super().matches(scope)
+ effective_context = _get_scope_effective_route_context(scope)
+ if effective_context is not None and effective_context.original_route is self:
+ match, child_scope = effective_context.matches(scope)
+ else:
+ match, child_scope = super().matches(scope)
if match != Match.NONE:
child_scope["route"] = self
return match, child_scope
+ async def handle(self, scope: Scope, receive: Receive, send: Send) -> None:
+ effective_context = _get_scope_effective_route_context(scope)
+ if effective_context is not None and effective_context.original_route is self:
+ methods = effective_context.methods
+ if methods and scope["method"] not in methods:
+ headers = {"Allow": ", ".join(methods)}
+ if "app" in scope:
+ raise HTTPException(status_code=405, headers=headers)
+ response = PlainTextResponse(
+ "Method Not Allowed", status_code=405, headers=headers
+ )
+ await response(scope, receive, send)
+ return
+ token = _effective_route_context_var.set(effective_context)
+ try:
+ app = request_response(self.get_route_handler())
+ finally:
+ _effective_route_context_var.reset(token)
+ await app(scope, receive, send)
+ return
+ await super().handle(scope, receive, send)
+
+
+@dataclass
+class _RouterIncludeContext:
+ included_router: "APIRouter"
+ prefix: str = ""
+ tags: list[str | Enum] = field(default_factory=list)
+ dependencies: list[params.Depends] = field(default_factory=list)
+ default_response_class: type[Response] | DefaultPlaceholder = field(
+ default_factory=lambda: Default(JSONResponse)
+ )
+ responses: dict[int | str, dict[str, Any]] = field(default_factory=dict)
+ callbacks: list[BaseRoute] = field(default_factory=list)
+ deprecated: bool | None = None
+ include_in_schema: bool = True
+ generate_unique_id_function: Callable[[APIRoute], str] | DefaultPlaceholder = field(
+ default_factory=lambda: Default(generate_unique_id)
+ )
+ strict_content_type: bool | DefaultPlaceholder = field(
+ default_factory=lambda: Default(True)
+ )
+ dependency_overrides_provider: Any | None = None
+
+ @classmethod
+ def for_include(
+ cls,
+ *,
+ parent_router: "APIRouter",
+ included_router: "APIRouter",
+ prefix: str = "",
+ tags: list[str | Enum] | None = None,
+ dependencies: Sequence[params.Depends] | None = None,
+ default_response_class: type[Response] | DefaultPlaceholder = Default(
+ JSONResponse
+ ),
+ responses: dict[int | str, dict[str, Any]] | None = None,
+ callbacks: list[BaseRoute] | None = None,
+ deprecated: bool | None = None,
+ include_in_schema: bool = True,
+ generate_unique_id_function: Callable[[APIRoute], str]
+ | DefaultPlaceholder = Default(generate_unique_id),
+ ) -> "_RouterIncludeContext":
+ return cls(
+ included_router=included_router,
+ prefix=parent_router.prefix + prefix,
+ tags=[*parent_router.tags, *(tags or [])],
+ dependencies=[*parent_router.dependencies, *(dependencies or [])],
+ default_response_class=get_value_or_default(
+ default_response_class, parent_router.default_response_class
+ ),
+ responses={**parent_router.responses, **(responses or {})},
+ callbacks=[*parent_router.callbacks, *(callbacks or [])],
+ deprecated=deprecated or parent_router.deprecated,
+ include_in_schema=parent_router.include_in_schema and include_in_schema,
+ generate_unique_id_function=get_value_or_default(
+ generate_unique_id_function, parent_router.generate_unique_id_function
+ ),
+ strict_content_type=parent_router.strict_content_type,
+ dependency_overrides_provider=parent_router.dependency_overrides_provider,
+ )
+
+ def combine(
+ self, child_context: "_RouterIncludeContext"
+ ) -> "_RouterIncludeContext":
+ return _RouterIncludeContext(
+ included_router=child_context.included_router,
+ prefix=self.prefix + child_context.prefix,
+ tags=[*self.tags, *child_context.tags],
+ dependencies=[*self.dependencies, *child_context.dependencies],
+ default_response_class=get_value_or_default(
+ child_context.default_response_class, self.default_response_class
+ ),
+ responses={**self.responses, **child_context.responses},
+ callbacks=[*self.callbacks, *child_context.callbacks],
+ deprecated=self.deprecated or child_context.deprecated,
+ include_in_schema=self.include_in_schema
+ and child_context.include_in_schema,
+ generate_unique_id_function=get_value_or_default(
+ child_context.generate_unique_id_function,
+ self.generate_unique_id_function,
+ ),
+ strict_content_type=get_value_or_default(
+ child_context.strict_content_type, self.strict_content_type
+ ),
+ dependency_overrides_provider=self.dependency_overrides_provider,
+ )
+
+ def path_for(
+ self, route: APIRoute | routing.Route | routing.WebSocketRoute | routing.Mount
+ ) -> str:
+ return self.prefix + route.path
+
+
+@dataclass
+class _EffectiveRouteContext:
+ original_route: BaseRoute
+ starlette_route: BaseRoute | None = None
+ path: str = ""
+ endpoint: Callable[..., Any] | None = None
+ stream_item_type: Any | None = None
+ response_model: Any = None
+ summary: str | None = None
+ response_description: str = "Successful Response"
+ deprecated: bool | None = None
+ operation_id: str | None = None
+ response_model_include: IncEx | None = None
+ response_model_exclude: IncEx | None = None
+ response_model_by_alias: bool = True
+ response_model_exclude_unset: bool = False
+ response_model_exclude_defaults: bool = False
+ response_model_exclude_none: bool = False
+ include_in_schema: bool = True
+ response_class: type[Response] | DefaultPlaceholder = field(
+ default_factory=lambda: Default(JSONResponse)
+ )
+ dependency_overrides_provider: Any | None = None
+ callbacks: list[BaseRoute] | None = None
+ openapi_extra: dict[str, Any] | None = None
+ generate_unique_id_function: Callable[[Any], str] | DefaultPlaceholder = field(
+ default_factory=lambda: Default(generate_unique_id)
+ )
+ strict_content_type: bool | DefaultPlaceholder = field(
+ default_factory=lambda: Default(True)
+ )
+ tags: list[str | Enum] = field(default_factory=list)
+ responses: dict[int | str, dict[str, Any]] = field(default_factory=dict)
+ name: str = ""
+ path_regex: Any = None
+ path_format: str = ""
+ param_convertors: dict[str, Any] = field(default_factory=dict)
+ methods: set[str] = field(default_factory=set)
+ unique_id: str = ""
+ status_code: int | None = None
+ response_field: ModelField | None = None
+ stream_item_field: ModelField | None = None
+ dependencies: list[params.Depends] = field(default_factory=list)
+ description: str = ""
+ response_fields: dict[int | str, ModelField] = field(default_factory=dict)
+ dependant: Dependant | None = None
+ _flat_dependant: Dependant | None = None
+ _embed_body_fields: bool = False
+ body_field: ModelField | None = None
+ is_sse_stream: bool = False
+ is_json_stream: bool = False
+
+ @classmethod
+ def from_api_route(
+ cls,
+ *,
+ original_route: APIRoute,
+ include_context: _RouterIncludeContext,
+ ) -> "_EffectiveRouteContext":
+ route = cast(_APIRouteLike, original_route)
+ context = cls(original_route=original_route)
+ _populate_api_route_state(
+ cast(_APIRouteLike, context),
+ include_context.path_for(original_route),
+ route.endpoint,
+ response_model=route.response_model,
+ status_code=route.status_code,
+ tags=[*include_context.tags, *route.tags],
+ dependencies=[*include_context.dependencies, *route.dependencies],
+ summary=route.summary,
+ description=route.description,
+ response_description=route.response_description,
+ responses={**include_context.responses, **route.responses},
+ deprecated=route.deprecated or include_context.deprecated,
+ methods=route.methods,
+ operation_id=route.operation_id,
+ response_model_include=route.response_model_include,
+ response_model_exclude=route.response_model_exclude,
+ response_model_by_alias=route.response_model_by_alias,
+ response_model_exclude_unset=route.response_model_exclude_unset,
+ response_model_exclude_defaults=route.response_model_exclude_defaults,
+ response_model_exclude_none=route.response_model_exclude_none,
+ include_in_schema=route.include_in_schema
+ and include_context.include_in_schema,
+ response_class=get_value_or_default(
+ route.response_class,
+ include_context.included_router.default_response_class,
+ include_context.default_response_class,
+ ),
+ name=route.name,
+ dependency_overrides_provider=include_context.dependency_overrides_provider,
+ callbacks=[*include_context.callbacks, *(route.callbacks or [])],
+ openapi_extra=route.openapi_extra,
+ generate_unique_id_function=get_value_or_default(
+ route.generate_unique_id_function,
+ include_context.included_router.generate_unique_id_function,
+ include_context.generate_unique_id_function,
+ ),
+ strict_content_type=get_value_or_default(
+ route.strict_content_type,
+ include_context.included_router.strict_content_type,
+ include_context.strict_content_type,
+ ),
+ )
+ return context
+
+ def matches(self, scope: Scope) -> tuple[Match, Scope]:
+ if not isinstance(self.original_route, APIRoute):
+ assert self.starlette_route is not None
+ return self.starlette_route.matches(scope)
+ if scope["type"] != "http":
+ return Match.NONE, {}
+ route_path = get_route_path(scope)
+ match = self.path_regex.match(route_path)
+ if not match:
+ return Match.NONE, {}
+ matched_params = match.groupdict()
+ for key, value in matched_params.items():
+ matched_params[key] = self.param_convertors[key].convert(value)
+ path_params = dict(scope.get("path_params", {}))
+ path_params.update(matched_params)
+ child_scope = {"endpoint": self.endpoint, "path_params": path_params}
+ methods = self.methods
+ if methods and scope["method"] not in methods:
+ return Match.PARTIAL, child_scope
+ return Match.FULL, child_scope
+
+ def url_path_for(self, name: str, /, **path_params: Any) -> Any:
+ if not isinstance(self.original_route, APIRoute):
+ assert self.starlette_route is not None
+ return self.starlette_route.url_path_for(name, **path_params)
+ seen_params = set(path_params.keys())
+ param_convertors = self.param_convertors
+ expected_params = set(param_convertors.keys())
+ if name != self.name or seen_params != expected_params:
+ raise routing.NoMatchFound(name, path_params)
+ path, remaining_params = routing.replace_params(
+ self.path_format, param_convertors, path_params
+ )
+ assert not remaining_params
+ return URLPath(path=path, protocol="http")
+
+
+@dataclass
+class _IncludedRouter(BaseRoute):
+ original_router: "APIRouter"
+ include_context: _RouterIncludeContext
+ _effective_candidates: list["_EffectiveRouteContext | _IncludedRouter"] = field(
+ default_factory=list
+ )
+ _effective_candidates_version: int | None = None
+
+ def effective_candidates(self) -> list["_EffectiveRouteContext | _IncludedRouter"]:
+ routes_version = self.original_router._get_routes_version()
+ if routes_version == self._effective_candidates_version:
+ return self._effective_candidates
+ self._effective_candidates = []
+ candidates = self.original_router.routes
+ for route in candidates:
+ if isinstance(route, _IncludedRouter):
+ child_context = self.include_context.combine(route.include_context)
+ child_branch = _IncludedRouter(
+ original_router=route.original_router,
+ include_context=child_context,
+ )
+ self._effective_candidates.append(child_branch)
+ continue
+ route_context = self._build_effective_context(route)
+ if route_context is not None:
+ self._effective_candidates.append(route_context)
+ self._effective_candidates_version = routes_version
+ return self._effective_candidates
+
+ def _build_effective_context(
+ self, route: BaseRoute
+ ) -> _EffectiveRouteContext | None:
+ if isinstance(route, APIRoute):
+ return _EffectiveRouteContext.from_api_route(
+ original_route=route,
+ include_context=self.include_context,
+ )
+ if isinstance(route, routing.Route):
+ starlette_route: BaseRoute = routing.Route(
+ self.include_context.path_for(route),
+ endpoint=route.endpoint,
+ methods=list(route.methods or []),
+ name=route.name,
+ include_in_schema=route.include_in_schema,
+ )
+ return _EffectiveRouteContext(
+ original_route=route,
+ starlette_route=starlette_route,
+ )
+ if isinstance(route, APIWebSocketRoute):
+ starlette_route = APIWebSocketRoute(
+ self.include_context.path_for(route),
+ endpoint=route.endpoint,
+ name=route.name,
+ dependencies=[*self.include_context.dependencies, *route.dependencies],
+ dependency_overrides_provider=(
+ self.include_context.dependency_overrides_provider
+ ),
+ )
+ return _EffectiveRouteContext(
+ original_route=route,
+ starlette_route=starlette_route,
+ )
+ if isinstance(route, routing.WebSocketRoute):
+ starlette_route = routing.WebSocketRoute(
+ self.include_context.path_for(route), route.endpoint, name=route.name
+ )
+ return _EffectiveRouteContext(
+ original_route=route,
+ starlette_route=starlette_route,
+ )
+ if isinstance(route, routing.Mount):
+ starlette_route = copy.copy(route)
+ starlette_route.path = self.include_context.path_for(route).rstrip("/")
+ (
+ starlette_route.path_regex,
+ starlette_route.path_format,
+ starlette_route.param_convertors,
+ ) = compile_path(starlette_route.path + "/{path:path}")
+ return _EffectiveRouteContext(
+ original_route=route,
+ starlette_route=starlette_route,
+ )
+ if isinstance(route, routing.Host):
+ if self.include_context.prefix:
+ prefixed_app: ASGIApp = routing.Router(
+ routes=[routing.Mount(self.include_context.prefix, app=route.app)]
+ )
+ else:
+ prefixed_app = route.app
+ starlette_route = routing.Host(
+ route.host, app=prefixed_app, name=route.name
+ )
+ return _EffectiveRouteContext(
+ original_route=route,
+ starlette_route=starlette_route,
+ )
+ return None
+
+ def _match(
+ self, scope: Scope
+ ) -> tuple[Match, Scope, BaseRoute | None, _EffectiveRouteContext | None]:
+ partial: tuple[Scope, BaseRoute, _EffectiveRouteContext | None] | None = None
+ for candidate in self.effective_candidates():
+ if isinstance(candidate, _IncludedRouter):
+ match, child_scope = candidate.matches(scope)
+ route: BaseRoute = candidate
+ route_context = None
+ elif isinstance(candidate.original_route, APIRoute):
+ route_context = candidate
+ fastapi_scope = _get_fastapi_scope(scope)
+ previous_context = fastapi_scope.get(
+ _FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY, _SCOPE_MISSING
+ )
+ fastapi_scope[_FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY] = route_context
+ try:
+ match, child_scope = candidate.original_route.matches(scope)
+ finally:
+ _restore_fastapi_scope_key(
+ scope, _FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY, previous_context
+ )
+ route = candidate.original_route
+ else:
+ route_context = candidate
+ match, child_scope = candidate.matches(scope)
+ route = candidate.starlette_route or candidate.original_route
+ if match == Match.FULL:
+ return match, child_scope, route, route_context
+ if match == Match.PARTIAL and partial is None:
+ partial = (child_scope, route, route_context)
+ if partial is not None:
+ child_scope, route, route_context = partial
+ return Match.PARTIAL, child_scope, route, route_context
+ return Match.NONE, {}, None, None
+
+ def matches(self, scope: Scope) -> tuple[Match, Scope]:
+ fastapi_scope = _get_fastapi_scope(scope)
+ previous_router = fastapi_scope.get(
+ _FASTAPI_INCLUDED_ROUTER_KEY, _SCOPE_MISSING
+ )
+ fastapi_scope[_FASTAPI_INCLUDED_ROUTER_KEY] = self
+ try:
+ match, _ = self.original_router.matches(scope)
+ return match, {}
+ finally:
+ _restore_fastapi_scope_key(
+ scope, _FASTAPI_INCLUDED_ROUTER_KEY, previous_router
+ )
+
+ async def handle(self, scope: Scope, receive: Receive, send: Send) -> None:
+ _get_fastapi_scope(scope)[_FASTAPI_INCLUDED_ROUTER_KEY] = self
+ await self.original_router.handle(scope, receive, send)
+
+ async def _handle_selected(
+ self, scope: Scope, receive: Receive, send: Send
+ ) -> None:
+ match, child_scope, route, effective_context = self._match(scope)
+ if match == Match.NONE or route is None:
+ await self.original_router.default(scope, receive, send)
+ return
+ scope.update(child_scope)
+ if isinstance(route, _IncludedRouter):
+ await route.handle(scope, receive, send)
+ return
+ if effective_context is not None:
+ _get_fastapi_scope(scope)[_FASTAPI_EFFECTIVE_ROUTE_CONTEXT_KEY] = (
+ effective_context
+ )
+ original_route = effective_context.original_route
+ if isinstance(original_route, APIRoute):
+ scope["route"] = original_route
+ await original_route.handle(scope, receive, send)
+ return
+ await route.handle(scope, receive, send)
+
+ def effective_route_contexts(self) -> Iterator[_EffectiveRouteContext]:
+ for candidate in self.effective_candidates():
+ if isinstance(candidate, _IncludedRouter):
+ yield from candidate.effective_route_contexts()
+ else:
+ yield candidate
+
+ def url_path_for(self, name: str, /, **path_params: Any) -> Any:
+ for route_context in self.effective_route_contexts():
+ try:
+ return route_context.url_path_for(name, **path_params)
+ except routing.NoMatchFound:
+ pass
+ raise routing.NoMatchFound(name, path_params)
+
+
+def _iter_included_route_candidates(routes: Sequence[BaseRoute]) -> Iterator[BaseRoute]:
+ for route, route_context in _iter_routes_with_context(routes):
+ if route_context is not None and route_context.starlette_route is not None:
+ yield route_context.starlette_route
+ else:
+ yield route
+
+
+def _iter_routes_with_context(
+ routes: Sequence[BaseRoute],
+) -> Iterator[tuple[BaseRoute, _EffectiveRouteContext | None]]:
+ for route in routes:
+ if isinstance(route, _IncludedRouter):
+ for route_context in route.effective_route_contexts():
+ yield route_context.original_route, route_context
+ else:
+ yield route, None
+
class APIRouter(routing.Router):
"""
@@ -1330,6 +1993,87 @@ class APIRouter(routing.Router):
self.default_response_class = default_response_class
self.generate_unique_id_function = generate_unique_id_function
self.strict_content_type = strict_content_type
+ self._routes_version = 0
+
+ def _mark_routes_changed(self) -> None:
+ self._routes_version += 1
+
+ def _get_routes_version(self, seen: set[int] | None = None) -> int:
+ if seen is None:
+ seen = set()
+ router_id = id(self)
+ if router_id in seen:
+ return self._routes_version
+ seen.add(router_id)
+ version = self._routes_version
+ for route in self.routes:
+ if isinstance(route, _IncludedRouter):
+ version += route.original_router._get_routes_version(seen)
+ return version
+
+ def _contains_router(
+ self, router: "APIRouter", seen: set[int] | None = None
+ ) -> bool:
+ if seen is None:
+ seen = set()
+ router_id = id(self)
+ if router_id in seen:
+ return False
+ seen.add(router_id)
+ for route in self.routes:
+ if not isinstance(route, _IncludedRouter):
+ continue
+ if route.original_router is router:
+ return True
+ if route.original_router._contains_router(router, seen):
+ return True
+ return False
+
+ def add_route(
+ self,
+ path: str,
+ endpoint: Callable[[Request], Awaitable[Response] | Response],
+ methods: Collection[str] | None = None,
+ name: str | None = None,
+ include_in_schema: bool = True,
+ ) -> None:
+ super().add_route(
+ path,
+ endpoint,
+ methods=methods,
+ name=name,
+ include_in_schema=include_in_schema,
+ )
+ self._mark_routes_changed()
+
+ def add_websocket_route(
+ self,
+ path: str,
+ endpoint: Callable[[WebSocket], Awaitable[None]],
+ name: str | None = None,
+ ) -> None:
+ super().add_websocket_route(path, endpoint, name=name)
+ self._mark_routes_changed()
+
+ async def handle(self, scope: Scope, receive: Receive, send: Send) -> None:
+ included_router = _get_scope_included_router(scope)
+ if (
+ isinstance(included_router, _IncludedRouter)
+ and included_router.original_router is self
+ ):
+ await included_router._handle_selected(scope, receive, send)
+ return
+ await self.app(scope, receive, send)
+
+ def matches(self, scope: Scope) -> tuple[Match, Scope]:
+ included_router = _get_scope_included_router(scope)
+ if (
+ isinstance(included_router, _IncludedRouter)
+ and included_router.original_router is self
+ ):
+ match, child_scope, _, _ = included_router._match(scope)
+ return match, child_scope
+ return Match.NONE, {}
def route(
self,
@@ -1432,6 +2176,7 @@ class APIRouter(routing.Router):
),
)
self.routes.append(route)
+ self._mark_routes_changed()
def api_route(
self,
@@ -1515,6 +2260,7 @@ class APIRouter(routing.Router):
dependency_overrides_provider=self.dependency_overrides_provider,
)
self.routes.append(route)
+ self._mark_routes_changed()
def websocket(
self,
@@ -1731,111 +2477,47 @@ class APIRouter(routing.Router):
"Cannot include the same APIRouter instance into itself. "
"Did you mean to include a different router?"
)
+ assert not router._contains_router(self), (
+ "Cannot include an APIRouter instance that already includes this router. "
+ "Did you mean to include a different router?"
+ )
if prefix:
assert prefix.startswith("/"), "A path prefix must start with '/'"
assert not prefix.endswith("/"), (
"A path prefix must not end with '/', as the routes will start with '/'"
)
else:
- for r in router.routes:
- path = getattr(r, "path") # noqa: B009
- name = getattr(r, "name", "unknown")
+ for route, route_context in _iter_routes_with_context(router.routes):
+ if route_context is None:
+ path = getattr(route, "path", None)
+ name = getattr(route, "name", "unknown")
+ elif route_context.starlette_route is not None:
+ path = getattr(route_context.starlette_route, "path", None)
+ name = getattr(route_context.starlette_route, "name", "unknown")
+ else:
+ path = route_context.path
+ name = route_context.name
if path is not None and not path:
raise FastAPIError(
f"Prefix and path cannot be both empty (path operation: {name})"
)
- if responses is None:
- responses = {}
- for route in router.routes:
- if isinstance(route, APIRoute):
- combined_responses = {**responses, **route.responses}
- use_response_class = get_value_or_default(
- route.response_class,
- router.default_response_class,
- default_response_class,
- self.default_response_class,
- )
- current_tags = []
- if tags:
- current_tags.extend(tags)
- if route.tags:
- current_tags.extend(route.tags)
- current_dependencies: list[params.Depends] = []
- if dependencies:
- current_dependencies.extend(dependencies)
- if route.dependencies:
- current_dependencies.extend(route.dependencies)
- current_callbacks = []
- if callbacks:
- current_callbacks.extend(callbacks)
- if route.callbacks:
- current_callbacks.extend(route.callbacks)
- current_generate_unique_id = get_value_or_default(
- route.generate_unique_id_function,
- router.generate_unique_id_function,
- generate_unique_id_function,
- self.generate_unique_id_function,
- )
- self.add_api_route(
- prefix + route.path,
- route.endpoint,
- response_model=route.response_model,
- status_code=route.status_code,
- tags=current_tags,
- dependencies=current_dependencies,
- summary=route.summary,
- description=route.description,
- response_description=route.response_description,
- responses=combined_responses,
- deprecated=route.deprecated or deprecated or self.deprecated,
- methods=route.methods,
- operation_id=route.operation_id,
- response_model_include=route.response_model_include,
- response_model_exclude=route.response_model_exclude,
- response_model_by_alias=route.response_model_by_alias,
- response_model_exclude_unset=route.response_model_exclude_unset,
- response_model_exclude_defaults=route.response_model_exclude_defaults,
- response_model_exclude_none=route.response_model_exclude_none,
- include_in_schema=route.include_in_schema
- and self.include_in_schema
- and include_in_schema,
- response_class=use_response_class,
- name=route.name,
- route_class_override=type(route),
- callbacks=current_callbacks,
- openapi_extra=route.openapi_extra,
- generate_unique_id_function=current_generate_unique_id,
- strict_content_type=get_value_or_default(
- route.strict_content_type,
- router.strict_content_type,
- self.strict_content_type,
- ),
- )
- elif isinstance(route, routing.Route):
- methods = list(route.methods or [])
- self.add_route(
- prefix + route.path,
- route.endpoint,
- methods=methods,
- include_in_schema=route.include_in_schema,
- name=route.name,
- )
- elif isinstance(route, APIWebSocketRoute):
- current_dependencies = []
- if dependencies:
- current_dependencies.extend(dependencies)
- if route.dependencies:
- current_dependencies.extend(route.dependencies)
- self.add_api_websocket_route(
- prefix + route.path,
- route.endpoint,
- dependencies=current_dependencies,
- name=route.name,
- )
- elif isinstance(route, routing.WebSocketRoute):
- self.add_websocket_route(
- prefix + route.path, route.endpoint, name=route.name
- )
+ include_context = _RouterIncludeContext.for_include(
+ parent_router=self,
+ included_router=router,
+ prefix=prefix,
+ tags=tags,
+ dependencies=dependencies,
+ default_response_class=default_response_class,
+ responses=responses,
+ callbacks=callbacks,
+ deprecated=deprecated,
+ include_in_schema=include_in_schema,
+ generate_unique_id_function=generate_unique_id_function,
+ )
+ self.routes.append(
+ _IncludedRouter(original_router=router, include_context=include_context)
+ )
+ self._mark_routes_changed()
for handler in router.on_startup:
self.add_event_handler("startup", handler)
for handler in router.on_shutdown:
diff --git a/pyproject.toml b/pyproject.toml
index daa523ce2..8b633a928 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -349,5 +349,41 @@ havin = "havin"
Ines = "Ines"
ser = "ser"
+[tool.ty.src]
+exclude = [
+ # These docs examples are intentionally partial, dynamic, environment-driven,
+ # deprecated, or currently require broader tutorial rewrites to satisfy ty.
+ "docs_src/additional_status_codes/",
+ "docs_src/app_testing/tutorial003_py310.py",
+ "docs_src/body_multiple_params/",
+ "docs_src/body_updates/tutorial002_py310.py",
+ "docs_src/custom_docs_ui/",
+ "docs_src/custom_response/tutorial001_py310.py",
+ "docs_src/custom_response/tutorial001b_py310.py",
+ "docs_src/custom_response/tutorial009c_py310.py",
+ "docs_src/dependencies/tutorial007_py310.py",
+ "docs_src/dependencies/tutorial008_an_py310.py",
+ "docs_src/dependencies/tutorial008_py310.py",
+ "docs_src/dependencies/tutorial010_py310.py",
+ "docs_src/events/",
+ "docs_src/extending_openapi/tutorial001_py310.py",
+ "docs_src/path_params_numeric_validations/",
+ "docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py",
+ "docs_src/python_types/tutorial003_py310.py",
+ "docs_src/python_types/tutorial011_py310.py",
+ "docs_src/query_params_str_validations/",
+ "docs_src/response_model/tutorial006_py310.py",
+ "docs_src/security/tutorial003_an_py310.py",
+ "docs_src/security/tutorial003_py310.py",
+ "docs_src/security/tutorial004_an_py310.py",
+ "docs_src/security/tutorial004_py310.py",
+ "docs_src/security/tutorial005_an_py310.py",
+ "docs_src/security/tutorial005_py310.py",
+ "docs_src/settings/",
+ "docs_src/sql_databases/",
+ "docs_src/using_request_directly/tutorial001_py310.py",
+ "docs_src/wsgi/tutorial001_py310.py",
+]
+
[tool.ty.terminal]
error-on-warning = true
diff --git a/scripts/contributors.py b/scripts/contributors.py
index af1434d79..5e9d72d64 100644
--- a/scripts/contributors.py
+++ b/scripts/contributors.py
@@ -237,7 +237,7 @@ def update_content(*, content_path: Path, new_content: Any) -> bool:
def main() -> None:
logging.basicConfig(level=logging.INFO)
- settings = Settings()
+ settings = Settings() # ty: ignore[missing-argument]
logging.info(f"Using config: {settings.model_dump_json()}")
g = Github(settings.github_token.get_secret_value())
repo = g.get_repo(settings.github_repository)
diff --git a/scripts/coverage.sh b/scripts/coverage.sh
deleted file mode 100755
index e07b51ec5..000000000
--- a/scripts/coverage.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -x
-
-coverage combine
-coverage report
-coverage html
diff --git a/scripts/deploy_docs_status.py b/scripts/deploy_docs_status.py
index e620b15ba..8e5a2e38b 100644
--- a/scripts/deploy_docs_status.py
+++ b/scripts/deploy_docs_status.py
@@ -24,7 +24,7 @@ class LinkData(BaseModel):
def main() -> None:
logging.basicConfig(level=logging.INFO)
- settings = Settings()
+ settings = Settings() # ty: ignore[missing-argument]
logging.info(f"Using config: {settings.model_dump_json()}")
g = Github(auth=Auth.Token(settings.github_token.get_secret_value()))
diff --git a/scripts/doc_parsing_utils.py b/scripts/doc_parsing_utils.py
index 88ff2c50b..f2f047c3d 100644
--- a/scripts/doc_parsing_utils.py
+++ b/scripts/doc_parsing_utils.py
@@ -625,14 +625,14 @@ def replace_multiline_code_block(
_line_b_code, line_b_comment = _split_hash_comment(line_b)
res_line = line_b
if line_b_comment:
- res_line = res_line.replace(line_b_comment, line_a_comment, 1)
+ res_line = res_line.replace(line_b_comment, line_a_comment or "", 1)
code_block.append(res_line)
elif block_language in {"console", "json", "slash-style-comments"}:
_line_a_code, line_a_comment = _split_slashes_comment(line_a)
_line_b_code, line_b_comment = _split_slashes_comment(line_b)
res_line = line_b
if line_b_comment:
- res_line = res_line.replace(line_b_comment, line_a_comment, 1)
+ res_line = res_line.replace(line_b_comment, line_a_comment or "", 1)
code_block.append(res_line)
else:
code_block.append(line_b)
diff --git a/scripts/docs.py b/scripts/docs.py
index a478d59a0..07c951cc7 100644
--- a/scripts/docs.py
+++ b/scripts/docs.py
@@ -155,7 +155,7 @@ def build_lang(
"""
build_zensical_lang_to_stage(lang)
copy_zensical_stage_to_site(lang)
- typer.secho(f"Successfully built docs for: {lang}", color=typer.colors.GREEN)
+ typer.secho(f"Successfully built docs for: {lang}", fg=typer.colors.GREEN)
def split_markdown_header(markdown: str) -> tuple[str, str]:
@@ -408,7 +408,7 @@ def build_all() -> None:
for lang in langs:
if lang != "en":
copy_zensical_stage_to_site(lang)
- typer.secho("Successfully built all docs", color=typer.colors.GREEN)
+ typer.secho("Successfully built all docs", fg=typer.colors.GREEN)
@app.command()
diff --git a/scripts/format.sh b/scripts/format.sh
deleted file mode 100755
index bf70f42e5..000000000
--- a/scripts/format.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env bash
-set -x
-
-ruff check fastapi tests docs_src scripts --fix
-ruff format fastapi tests docs_src scripts
diff --git a/scripts/label_approved.py b/scripts/label_approved.py
index 81de92efb..397a79663 100644
--- a/scripts/label_approved.py
+++ b/scripts/label_approved.py
@@ -22,7 +22,7 @@ class Settings(BaseSettings):
config: dict[str, LabelSettings] | Literal[""] = default_config
-settings = Settings()
+settings = Settings() # ty: ignore[missing-argument]
if settings.debug:
logging.basicConfig(level=logging.DEBUG)
else:
diff --git a/scripts/lint.sh b/scripts/lint.sh
deleted file mode 100755
index a4d3422d3..000000000
--- a/scripts/lint.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -x
-
-mypy fastapi
-ty check fastapi
-ruff check fastapi tests docs_src scripts
-ruff format fastapi tests --check
diff --git a/scripts/notify_translations.py b/scripts/notify_translations.py
index 3484b69c7..22fa633f4 100644
--- a/scripts/notify_translations.py
+++ b/scripts/notify_translations.py
@@ -304,7 +304,7 @@ def update_comment(*, settings: Settings, comment_id: str, body: str) -> Comment
def main() -> None:
- settings = Settings()
+ settings = Settings() # ty: ignore[missing-argument]
if settings.debug:
logging.basicConfig(level=logging.DEBUG)
else:
@@ -324,6 +324,7 @@ def main() -> None:
) or settings.number
if number is None:
raise RuntimeError("No PR number available")
+ number = cast(int, number)
# Avoid race conditions with multiple labels
sleep_time = random.random() * 10 # random number between 0 and 10 seconds
diff --git a/scripts/people.py b/scripts/people.py
index 5718d65da..72b591367 100644
--- a/scripts/people.py
+++ b/scripts/people.py
@@ -394,7 +394,7 @@ def update_content(*, content_path: Path, new_content: Any) -> bool:
def main() -> None:
logging.basicConfig(level=logging.INFO)
- settings = Settings()
+ settings = Settings() # ty: ignore[missing-argument]
logging.info(f"Using config: {settings.model_dump_json()}")
rate_limiter.speed_multiplier = settings.speed_multiplier
g = Github(settings.github_token.get_secret_value())
diff --git a/scripts/sponsors.py b/scripts/sponsors.py
index fdcabc737..38d8cbfa4 100644
--- a/scripts/sponsors.py
+++ b/scripts/sponsors.py
@@ -158,7 +158,7 @@ def update_content(*, content_path: Path, new_content: Any) -> bool:
def main() -> None:
logging.basicConfig(level=logging.INFO)
- settings = Settings()
+ settings = Settings() # ty: ignore[missing-argument]
logging.info(f"Using config: {settings.model_dump_json()}")
g = Github(settings.pr_token.get_secret_value())
repo = g.get_repo(settings.github_repository)
diff --git a/scripts/test-cov-html.sh b/scripts/test-cov-html.sh
deleted file mode 100755
index 3397a5760..000000000
--- a/scripts/test-cov-html.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-set -x
-
-bash scripts/test-cov.sh --cov-report=term-missing --cov-report=html ${@}
diff --git a/scripts/topic_repos.py b/scripts/topic_repos.py
index b7afc0864..94379d384 100644
--- a/scripts/topic_repos.py
+++ b/scripts/topic_repos.py
@@ -24,7 +24,7 @@ class Repo(BaseModel):
def main() -> None:
logging.basicConfig(level=logging.INFO)
- settings = Settings()
+ settings = Settings() # ty: ignore[missing-argument]
logging.info(f"Using config: {settings.model_dump_json()}")
g = Github(settings.github_token.get_secret_value(), per_page=100)
diff --git a/tests/test_compat.py b/tests/test_compat.py
index 772bd305e..76151fac9 100644
--- a/tests/test_compat.py
+++ b/tests/test_compat.py
@@ -1,3 +1,5 @@
+from typing import Any, cast
+
from fastapi import FastAPI, UploadFile
from fastapi._compat import (
Undefined,
@@ -56,9 +58,15 @@ def test_propagates_pydantic2_model_config():
@app.post("/")
def foo(req: Model) -> dict[str, str | None]:
+ value = req.value
+ if isinstance(value, Missing):
+ value = None
+ embedded_value = req.embedded_model.value
+ if isinstance(embedded_value, Missing):
+ embedded_value = None
return {
- "value": req.value or None,
- "embedded_value": req.embedded_model.value or None,
+ "value": value,
+ "embedded_value": embedded_value,
}
client = TestClient(app)
@@ -100,7 +108,7 @@ def test_serialize_sequence_value_with_optional_list():
"""Test that serialize_sequence_value handles optional lists correctly."""
from fastapi._compat import v2
- field_info = FieldInfo(annotation=list[str] | None)
+ field_info = FieldInfo(annotation=cast(Any, list[str] | None))
field = v2.ModelField(name="items", field_info=field_info)
result = v2.serialize_sequence_value(field=field, value=["a", "b", "c"])
assert result == ["a", "b", "c"]
@@ -111,7 +119,7 @@ def test_serialize_sequence_value_with_optional_list_pipe_union():
"""Test that serialize_sequence_value handles optional lists correctly (with new syntax)."""
from fastapi._compat import v2
- field_info = FieldInfo(annotation=list[str] | None)
+ field_info = FieldInfo(annotation=cast(Any, list[str] | None))
field = v2.ModelField(name="items", field_info=field_info)
result = v2.serialize_sequence_value(field=field, value=["a", "b", "c"])
assert result == ["a", "b", "c"]
@@ -125,7 +133,7 @@ def test_serialize_sequence_value_with_none_first_in_union():
from fastapi._compat import v2
# Use Union[None, list[str]] to ensure None comes first in the union args
- field_info = FieldInfo(annotation=Union[None, list[str]]) # noqa: UP007
+ field_info = FieldInfo(annotation=cast(Any, Union[None, list[str]])) # noqa: UP007
field = v2.ModelField(name="items", field_info=field_info)
result = v2.serialize_sequence_value(field=field, value=["x", "y"])
assert result == ["x", "y"]
diff --git a/tests/test_custom_middleware_exception.py b/tests/test_custom_middleware_exception.py
index cf548f4ae..989ab58bc 100644
--- a/tests/test_custom_middleware_exception.py
+++ b/tests/test_custom_middleware_exception.py
@@ -3,6 +3,7 @@ from pathlib import Path
from fastapi import APIRouter, FastAPI, File, UploadFile
from fastapi.exceptions import HTTPException
from fastapi.testclient import TestClient
+from starlette.types import ASGIApp
app = FastAPI()
@@ -16,7 +17,7 @@ class ContentSizeLimitMiddleware:
max_content_size (optional): the maximum content size allowed in bytes, None for no limit
"""
- def __init__(self, app: APIRouter, max_content_size: int | None = None):
+ def __init__(self, app: ASGIApp, max_content_size: int | None = None):
self.app = app
self.max_content_size = max_content_size
@@ -31,6 +32,7 @@ class ContentSizeLimitMiddleware:
body_len = len(message.get("body", b""))
received += body_len
+ assert self.max_content_size is not None
if received > self.max_content_size:
raise HTTPException(
422,
diff --git a/tests/test_custom_route_class.py b/tests/test_custom_route_class.py
index 786c1efc3..de5e1da90 100644
--- a/tests/test_custom_route_class.py
+++ b/tests/test_custom_route_class.py
@@ -3,7 +3,6 @@ from fastapi import APIRouter, FastAPI
from fastapi.routing import APIRoute
from fastapi.testclient import TestClient
from inline_snapshot import snapshot
-from starlette.routing import Route
app = FastAPI()
@@ -63,13 +62,9 @@ def test_get_path(path, expected_status, expected_response):
def test_route_classes():
- routes = {}
- for r in app.router.routes:
- assert isinstance(r, Route)
- routes[r.path] = r
- assert getattr(routes["/a/"], "x_type") == "A" # noqa: B009
- assert getattr(routes["/a/b/"], "x_type") == "B" # noqa: B009
- assert getattr(routes["/a/b/c/"], "x_type") == "C" # noqa: B009
+ assert isinstance(router_a.routes[0], APIRouteA)
+ assert isinstance(router_b.routes[0], APIRouteB)
+ assert isinstance(router_c.routes[0], APIRouteC)
def test_openapi_schema():
diff --git a/tests/test_datastructures.py b/tests/test_datastructures.py
index 29a70cae0..1b5335ea9 100644
--- a/tests/test_datastructures.py
+++ b/tests/test_datastructures.py
@@ -1,9 +1,10 @@
import io
from pathlib import Path
+from typing import cast
import pytest
from fastapi import FastAPI, UploadFile
-from fastapi.datastructures import Default
+from fastapi.datastructures import Default, DefaultPlaceholder
from fastapi.testclient import TestClient
@@ -13,8 +14,8 @@ def test_upload_file_invalid_pydantic_v2():
def test_default_placeholder_equals():
- placeholder_1 = Default("a")
- placeholder_2 = Default("a")
+ placeholder_1 = cast(DefaultPlaceholder, Default("a"))
+ placeholder_2 = cast(DefaultPlaceholder, Default("a"))
assert placeholder_1 == placeholder_2
assert placeholder_1.value == placeholder_2.value
diff --git a/tests/test_default_response_class.py b/tests/test_default_response_class.py
index 88498e560..bc60e0b14 100644
--- a/tests/test_default_response_class.py
+++ b/tests/test_default_response_class.py
@@ -11,7 +11,7 @@ class ORJSONResponse(JSONResponse):
media_type = "application/x-orjson"
def render(self, content: Any) -> bytes:
- import orjson
+ import orjson # ty: ignore[unresolved-import]
return orjson.dumps(content)
diff --git a/tests/test_deprecated_responses.py b/tests/test_deprecated_responses.py
index 8cbd9c11f..8a5663744 100644
--- a/tests/test_deprecated_responses.py
+++ b/tests/test_deprecated_responses.py
@@ -3,7 +3,7 @@ import warnings
import pytest
from fastapi import FastAPI
from fastapi.exceptions import FastAPIDeprecationWarning
-from fastapi.responses import ORJSONResponse, UJSONResponse
+from fastapi.responses import ORJSONResponse, UJSONResponse # ty: ignore[deprecated]
from fastapi.testclient import TestClient
from pydantic import BaseModel
@@ -21,7 +21,7 @@ class Item(BaseModel):
def _make_orjson_app() -> FastAPI:
with warnings.catch_warnings():
warnings.simplefilter("ignore", FastAPIDeprecationWarning)
- app = FastAPI(default_response_class=ORJSONResponse)
+ app = FastAPI(default_response_class=ORJSONResponse) # ty: ignore[deprecated]
@app.get("/items")
def get_items() -> Item:
@@ -44,7 +44,7 @@ def test_orjson_response_returns_correct_data():
@needs_orjson
def test_orjson_response_emits_deprecation_warning():
with pytest.warns(FastAPIDeprecationWarning, match="ORJSONResponse is deprecated"):
- ORJSONResponse(content={"hello": "world"})
+ ORJSONResponse(content={"hello": "world"}) # ty: ignore[deprecated]
# UJSON
@@ -53,7 +53,7 @@ def test_orjson_response_emits_deprecation_warning():
def _make_ujson_app() -> FastAPI:
with warnings.catch_warnings():
warnings.simplefilter("ignore", FastAPIDeprecationWarning)
- app = FastAPI(default_response_class=UJSONResponse)
+ app = FastAPI(default_response_class=UJSONResponse) # ty: ignore[deprecated]
@app.get("/items")
def get_items() -> Item:
@@ -76,4 +76,4 @@ def test_ujson_response_returns_correct_data():
@needs_ujson
def test_ujson_response_emits_deprecation_warning():
with pytest.warns(FastAPIDeprecationWarning, match="UJSONResponse is deprecated"):
- UJSONResponse(content={"hello": "world"})
+ UJSONResponse(content={"hello": "world"}) # ty: ignore[deprecated]
diff --git a/tests/test_inherited_custom_class.py b/tests/test_inherited_custom_class.py
index 8cf8952f9..54c6566a0 100644
--- a/tests/test_inherited_custom_class.py
+++ b/tests/test_inherited_custom_class.py
@@ -13,7 +13,7 @@ class MyUuid:
def __str__(self):
return self.uuid
- @property # type: ignore
+ @property
def __class__(self):
return uuid.UUID
diff --git a/tests/test_jsonable_encoder.py b/tests/test_jsonable_encoder.py
index c23a9e5d7..8f8bd3fcb 100644
--- a/tests/test_jsonable_encoder.py
+++ b/tests/test_jsonable_encoder.py
@@ -87,10 +87,10 @@ def test_encode_dict():
def test_encode_dict_include_exclude_list():
pet = {"name": "Firulais", "owner": {"name": "Foo"}}
assert jsonable_encoder(pet) == {"name": "Firulais", "owner": {"name": "Foo"}}
- assert jsonable_encoder(pet, include=["name"]) == {"name": "Firulais"}
- assert jsonable_encoder(pet, exclude=["owner"]) == {"name": "Firulais"}
- assert jsonable_encoder(pet, include=[]) == {}
- assert jsonable_encoder(pet, exclude=[]) == {
+ assert jsonable_encoder(pet, include=["name"]) == {"name": "Firulais"} # ty: ignore[invalid-argument-type]
+ assert jsonable_encoder(pet, exclude=["owner"]) == {"name": "Firulais"} # ty: ignore[invalid-argument-type]
+ assert jsonable_encoder(pet, include=[]) == {} # ty: ignore[invalid-argument-type]
+ assert jsonable_encoder(pet, exclude=[]) == { # ty: ignore[invalid-argument-type]
"name": "Firulais",
"owner": {"name": "Foo"},
}
@@ -176,7 +176,7 @@ def test_encode_model_with_config():
def test_encode_model_with_alias_raises():
with pytest.raises(ValidationError):
- ModelWithAlias(foo="Bar")
+ ModelWithAlias(foo="Bar") # ty: ignore[missing-argument, unknown-argument]
def test_encode_model_with_alias():
diff --git a/tests/test_local_docs.py b/tests/test_local_docs.py
index 5f102edf1..351161182 100644
--- a/tests/test_local_docs.py
+++ b/tests/test_local_docs.py
@@ -9,7 +9,7 @@ def test_strings_in_generated_swagger():
swagger_css_url = sig.parameters.get("swagger_css_url").default # type: ignore
swagger_favicon_url = sig.parameters.get("swagger_favicon_url").default # type: ignore
html = get_swagger_ui_html(openapi_url="/docs", title="title")
- body_content = html.body.decode()
+ body_content = bytes(html.body).decode()
assert swagger_js_url in body_content
assert swagger_css_url in body_content
assert swagger_favicon_url in body_content
@@ -26,7 +26,7 @@ def test_strings_in_custom_swagger():
swagger_css_url=swagger_css_url,
swagger_favicon_url=swagger_favicon_url,
)
- body_content = html.body.decode()
+ body_content = bytes(html.body).decode()
assert swagger_js_url in body_content
assert swagger_css_url in body_content
assert swagger_favicon_url in body_content
@@ -37,7 +37,7 @@ def test_strings_in_generated_redoc():
redoc_js_url = sig.parameters.get("redoc_js_url").default # type: ignore
redoc_favicon_url = sig.parameters.get("redoc_favicon_url").default # type: ignore
html = get_redoc_html(openapi_url="/docs", title="title")
- body_content = html.body.decode()
+ body_content = bytes(html.body).decode()
assert redoc_js_url in body_content
assert redoc_favicon_url in body_content
@@ -51,17 +51,17 @@ def test_strings_in_custom_redoc():
redoc_js_url=redoc_js_url,
redoc_favicon_url=redoc_favicon_url,
)
- body_content = html.body.decode()
+ body_content = bytes(html.body).decode()
assert redoc_js_url in body_content
assert redoc_favicon_url in body_content
def test_google_fonts_in_generated_redoc():
- body_with_google_fonts = get_redoc_html(
- openapi_url="/docs", title="title"
- ).body.decode()
+ body_with_google_fonts = bytes(
+ get_redoc_html(openapi_url="/docs", title="title").body
+ ).decode()
assert "fonts.googleapis.com" in body_with_google_fonts
- body_without_google_fonts = get_redoc_html(
- openapi_url="/docs", title="title", with_google_fonts=False
- ).body.decode()
+ body_without_google_fonts = bytes(
+ get_redoc_html(openapi_url="/docs", title="title", with_google_fonts=False).body
+ ).decode()
assert "fonts.googleapis.com" not in body_without_google_fonts
diff --git a/tests/test_openapi_schema_type.py b/tests/test_openapi_schema_type.py
index e8166d2fb..610375b77 100644
--- a/tests/test_openapi_schema_type.py
+++ b/tests/test_openapi_schema_type.py
@@ -21,4 +21,4 @@ def test_allowed_schema_type(
def test_invalid_type_value() -> None:
"""Test that Schema raises ValueError for invalid type values."""
with pytest.raises(ValueError, match="2 validation errors for Schema"):
- Schema(type=True) # type: ignore[arg-type]
+ Schema(type=True) # type: ignore[arg-type] # ty: ignore[invalid-argument-type]
diff --git a/tests/test_orjson_response_class.py b/tests/test_orjson_response_class.py
index 3e34041dc..499b3e585 100644
--- a/tests/test_orjson_response_class.py
+++ b/tests/test_orjson_response_class.py
@@ -6,13 +6,13 @@ pytest.importorskip("orjson")
from fastapi import FastAPI
from fastapi.exceptions import FastAPIDeprecationWarning
-from fastapi.responses import ORJSONResponse
+from fastapi.responses import ORJSONResponse # ty: ignore[deprecated]
from fastapi.testclient import TestClient
from sqlalchemy.sql.elements import quoted_name
with warnings.catch_warnings():
warnings.simplefilter("ignore", FastAPIDeprecationWarning)
- app = FastAPI(default_response_class=ORJSONResponse)
+ app = FastAPI(default_response_class=ORJSONResponse) # ty: ignore[deprecated]
@app.get("/orjson_non_str_keys")
diff --git a/tests/test_response_model_as_return_annotation.py b/tests/test_response_model_as_return_annotation.py
index 7be7902ad..36d50afa9 100644
--- a/tests/test_response_model_as_return_annotation.py
+++ b/tests/test_response_model_as_return_annotation.py
@@ -78,22 +78,22 @@ def no_response_model_annotation_return_same_model() -> User:
@app.get("/no_response_model-annotation-return_exact_dict")
def no_response_model_annotation_return_exact_dict() -> User:
- return {"name": "John", "surname": "Doe"}
+ return {"name": "John", "surname": "Doe"} # ty: ignore[invalid-return-type]
@app.get("/no_response_model-annotation-return_invalid_dict")
def no_response_model_annotation_return_invalid_dict() -> User:
- return {"name": "John"}
+ return {"name": "John"} # ty: ignore[invalid-return-type]
@app.get("/no_response_model-annotation-return_invalid_model")
def no_response_model_annotation_return_invalid_model() -> User:
- return Item(name="Foo", price=42.0)
+ return Item(name="Foo", price=42.0) # ty: ignore[invalid-return-type]
@app.get("/no_response_model-annotation-return_dict_with_extra_data")
def no_response_model_annotation_return_dict_with_extra_data() -> User:
- return {"name": "John", "surname": "Doe", "password_hash": "secret"}
+ return {"name": "John", "surname": "Doe", "password_hash": "secret"} # ty: ignore[invalid-return-type]
@app.get("/no_response_model-annotation-return_submodel_with_extra_data")
@@ -108,24 +108,24 @@ def response_model_none_annotation_return_same_model() -> User:
@app.get("/response_model_none-annotation-return_exact_dict", response_model=None)
def response_model_none_annotation_return_exact_dict() -> User:
- return {"name": "John", "surname": "Doe"}
+ return {"name": "John", "surname": "Doe"} # ty: ignore[invalid-return-type]
@app.get("/response_model_none-annotation-return_invalid_dict", response_model=None)
def response_model_none_annotation_return_invalid_dict() -> User:
- return {"name": "John"}
+ return {"name": "John"} # ty: ignore[invalid-return-type]
@app.get("/response_model_none-annotation-return_invalid_model", response_model=None)
def response_model_none_annotation_return_invalid_model() -> User:
- return Item(name="Foo", price=42.0)
+ return Item(name="Foo", price=42.0) # ty: ignore[invalid-return-type]
@app.get(
"/response_model_none-annotation-return_dict_with_extra_data", response_model=None
)
def response_model_none_annotation_return_dict_with_extra_data() -> User:
- return {"name": "John", "surname": "Doe", "password_hash": "secret"}
+ return {"name": "John", "surname": "Doe", "password_hash": "secret"} # ty: ignore[invalid-return-type]
@app.get(
@@ -140,21 +140,21 @@ def response_model_none_annotation_return_submodel_with_extra_data() -> User:
"/response_model_model1-annotation_model2-return_same_model", response_model=User
)
def response_model_model1_annotation_model2_return_same_model() -> Item:
- return User(name="John", surname="Doe")
+ return User(name="John", surname="Doe") # ty: ignore[invalid-return-type]
@app.get(
"/response_model_model1-annotation_model2-return_exact_dict", response_model=User
)
def response_model_model1_annotation_model2_return_exact_dict() -> Item:
- return {"name": "John", "surname": "Doe"}
+ return {"name": "John", "surname": "Doe"} # ty: ignore[invalid-return-type]
@app.get(
"/response_model_model1-annotation_model2-return_invalid_dict", response_model=User
)
def response_model_model1_annotation_model2_return_invalid_dict() -> Item:
- return {"name": "John"}
+ return {"name": "John"} # ty: ignore[invalid-return-type]
@app.get(
@@ -169,7 +169,7 @@ def response_model_model1_annotation_model2_return_invalid_model() -> Item:
response_model=User,
)
def response_model_model1_annotation_model2_return_dict_with_extra_data() -> Item:
- return {"name": "John", "surname": "Doe", "password_hash": "secret"}
+ return {"name": "John", "surname": "Doe", "password_hash": "secret"} # ty: ignore[invalid-return-type]
@app.get(
@@ -177,7 +177,7 @@ def response_model_model1_annotation_model2_return_dict_with_extra_data() -> Ite
response_model=User,
)
def response_model_model1_annotation_model2_return_submodel_with_extra_data() -> Item:
- return DBUser(name="John", surname="Doe", password_hash="secret")
+ return DBUser(name="John", surname="Doe", password_hash="secret") # ty: ignore[invalid-return-type]
@app.get(
diff --git a/tests/test_router_events.py b/tests/test_router_events.py
index 7869a7afc..e4f5a58f0 100644
--- a/tests/test_router_events.py
+++ b/tests/test_router_events.py
@@ -31,31 +31,31 @@ def test_router_events(state: State) -> None:
def main() -> dict[str, str]:
return {"message": "Hello World"}
- @app.on_event("startup")
+ @app.on_event("startup") # ty: ignore[deprecated]
def app_startup() -> None:
state.app_startup = True
- @app.on_event("shutdown")
+ @app.on_event("shutdown") # ty: ignore[deprecated]
def app_shutdown() -> None:
state.app_shutdown = True
router = APIRouter()
- @router.on_event("startup")
+ @router.on_event("startup") # ty: ignore[deprecated]
def router_startup() -> None:
state.router_startup = True
- @router.on_event("shutdown")
+ @router.on_event("shutdown") # ty: ignore[deprecated]
def router_shutdown() -> None:
state.router_shutdown = True
sub_router = APIRouter()
- @sub_router.on_event("startup")
+ @sub_router.on_event("startup") # ty: ignore[deprecated]
def sub_router_startup() -> None:
state.sub_router_startup = True
- @sub_router.on_event("shutdown")
+ @sub_router.on_event("shutdown") # ty: ignore[deprecated]
def sub_router_shutdown() -> None:
state.sub_router_shutdown = True
@@ -253,7 +253,7 @@ def test_router_async_shutdown_handler(state: State) -> None:
def main() -> dict[str, str]:
return {"message": "Hello World"}
- @app.on_event("shutdown")
+ @app.on_event("shutdown") # ty: ignore[deprecated]
async def app_shutdown() -> None:
state.app_shutdown = True
@@ -274,7 +274,7 @@ def test_router_sync_generator_lifespan(state: State) -> None:
yield
state.app_shutdown = True
- app = FastAPI(lifespan=lifespan) # type: ignore[arg-type]
+ app = FastAPI(lifespan=lifespan) # type: ignore[invalid-argument-type] # ty: ignore[invalid-argument-type]
@app.get("/")
def main() -> dict[str, str]:
@@ -300,7 +300,7 @@ def test_router_async_generator_lifespan(state: State) -> None:
yield
state.app_shutdown = True
- app = FastAPI(lifespan=lifespan) # type: ignore[arg-type]
+ app = FastAPI(lifespan=lifespan) # type: ignore[invalid-argument-type] # ty: ignore[invalid-argument-type]
@app.get("/")
def main() -> dict[str, str]:
diff --git a/tests/test_router_include_context.py b/tests/test_router_include_context.py
new file mode 100644
index 000000000..c2679aa11
--- /dev/null
+++ b/tests/test_router_include_context.py
@@ -0,0 +1,910 @@
+from typing import Annotated, cast
+
+import pytest
+from fastapi import APIRouter, Body, Depends, FastAPI, Request
+from fastapi.exceptions import FastAPIError
+from fastapi.responses import HTMLResponse, JSONResponse, PlainTextResponse
+from fastapi.routing import (
+ APIRoute,
+ _IncludedRouter,
+ _iter_included_route_candidates,
+ _restore_fastapi_scope_key,
+)
+from fastapi.testclient import TestClient
+from starlette.routing import BaseRoute, Host, Match, Mount, NoMatchFound, Route, Router
+
+
+def dependency_a():
+ return "a"
+
+
+def dependency_b():
+ return "b"
+
+
+def dependency_c():
+ return "c"
+
+
+def unique_id_b(route: APIRoute) -> str:
+ return f"b_{route.name}"
+
+
+def test_router_include_context_matches_flattened_include_metadata():
+ callback_router = APIRouter()
+
+ @callback_router.post("/callback")
+ def callback(): # pragma: no cover
+ return {"ok": True}
+
+ callback_route = callback_router.routes[0]
+
+ parent_router = APIRouter()
+ included_router = APIRouter(
+ prefix="/items",
+ tags=["router"],
+ dependencies=[Depends(dependency_a)],
+ responses={401: {"description": "Unauthorized"}},
+ callbacks=[callback_route],
+ default_response_class=HTMLResponse,
+ strict_content_type=False,
+ )
+
+ @included_router.get(
+ "/{item_id}",
+ tags=["route"],
+ dependencies=[Depends(dependency_b)],
+ responses={404: {"description": "Missing"}},
+ callbacks=[callback_route],
+ generate_unique_id_function=unique_id_b,
+ )
+ def read_item(item_id: str, request: Request):
+ context = request.scope["fastapi"]["effective_route_context"]
+ return JSONResponse(
+ {
+ "path": context.path,
+ "tags": context.tags,
+ "dependency_count": len(context.dependencies),
+ "response_codes": sorted(context.responses),
+ "callback_count": len(context.callbacks or []),
+ "deprecated": context.deprecated,
+ "include_in_schema": context.include_in_schema,
+ "response_class": context.response_class.__name__,
+ "generate_unique_id": context.generate_unique_id_function(context),
+ "strict_content_type": context.strict_content_type,
+ "has_dependency_overrides_provider": (
+ context.dependency_overrides_provider
+ is app.router.dependency_overrides_provider
+ ),
+ }
+ )
+
+ parent_router.include_router(
+ included_router,
+ prefix="/api",
+ tags=["include"],
+ dependencies=[Depends(dependency_c)],
+ responses={400: {"description": "Bad request"}},
+ callbacks=[callback_route],
+ deprecated=True,
+ include_in_schema=False,
+ )
+
+ app = FastAPI()
+ app.include_router(parent_router)
+ response = TestClient(app).get("/api/items/foo")
+
+ assert response.status_code == 200
+ assert response.json() == {
+ "path": "/api/items/{item_id}",
+ "tags": ["include", "router", "route"],
+ "dependency_count": 3,
+ "response_codes": [400, 401, 404],
+ "callback_count": 3,
+ "deprecated": True,
+ "include_in_schema": False,
+ "response_class": "HTMLResponse",
+ "generate_unique_id": "b_read_item",
+ "strict_content_type": False,
+ "has_dependency_overrides_provider": True,
+ }
+
+
+def test_live_route_addition_uses_include_metadata_for_runtime_and_openapi():
+ calls: list[str] = []
+
+ def included_dependency():
+ calls.append("dependency")
+
+ router = APIRouter()
+ app = FastAPI()
+ app.include_router(
+ router,
+ prefix="/api",
+ tags=["included"],
+ dependencies=[Depends(included_dependency)],
+ responses={418: {"description": "Teapot"}},
+ )
+
+ @router.get("/later")
+ def read_later():
+ return {"later": True}
+
+ client = TestClient(app)
+ response = client.get("/api/later")
+
+ assert response.status_code == 200
+ assert response.json() == {"later": True}
+ assert calls == ["dependency"]
+ operation = client.get("/openapi.json").json()["paths"]["/api/later"]["get"]
+ assert operation["tags"] == ["included"]
+ assert operation["responses"]["418"] == {"description": "Teapot"}
+
+
+def test_openapi_cache_updates_after_live_route_addition():
+ router = APIRouter()
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+ client = TestClient(app)
+
+ first_schema = client.get("/openapi.json").json()
+ assert "/api/later" not in first_schema["paths"]
+
+ @router.get("/later")
+ def read_later(): # pragma: no cover
+ return {"later": True}
+
+ second_schema = client.get("/openapi.json").json()
+ assert "/api/later" in second_schema["paths"]
+
+
+def test_nested_router_added_after_parent_inclusion_is_live():
+ parent_router = APIRouter()
+ child_router = APIRouter()
+ app = FastAPI()
+ app.include_router(parent_router, prefix="/api")
+ parent_router.include_router(child_router, prefix="/child", tags=["child"])
+
+ @child_router.get("/items")
+ def read_items():
+ return ["item"]
+
+ client = TestClient(app)
+ response = client.get("/api/child/items")
+
+ assert response.status_code == 200
+ assert response.json() == ["item"]
+ operation = client.get("/openapi.json").json()["paths"]["/api/child/items"]["get"]
+ assert operation["tags"] == ["child"]
+
+
+def test_repeated_deep_inclusions_handle_all_concrete_paths():
+ shared_router = APIRouter()
+
+ @shared_router.get("/items")
+ def read_items():
+ return []
+
+ parent_router = APIRouter()
+ parent_router.include_router(shared_router, prefix="/a")
+ parent_router.include_router(shared_router, prefix="/b")
+
+ app = FastAPI()
+ app.include_router(parent_router, prefix="/v1")
+ app.include_router(parent_router, prefix="/v2")
+
+ client = TestClient(app)
+ paths = ["/v1/a/items", "/v1/b/items", "/v2/a/items", "/v2/b/items"]
+ for path in paths:
+ response = client.get(path)
+ assert response.status_code == 200
+ assert response.json() == []
+ assert set(client.get("/openapi.json").json()["paths"]) == set(paths)
+
+
+def test_url_path_for_uses_effective_context_for_live_included_route():
+ router = APIRouter()
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+
+ @router.get("/items/{item_id}", name="read_item")
+ def read_item(item_id: str): # pragma: no cover
+ return {"item_id": item_id}
+
+ assert app.url_path_for("read_item", item_id="abc") == "/api/items/abc"
+
+
+def test_url_path_for_uses_distinct_repeated_inclusion_contexts():
+ router = APIRouter()
+
+ @router.get("/items/{item_id}", name="read_item")
+ def read_item(item_id: str): # pragma: no cover
+ return {"item_id": item_id}
+
+ parent_router = APIRouter()
+ parent_router.include_router(router, prefix="/v1")
+ parent_router.include_router(router, prefix="/v2")
+
+ assert parent_router.url_path_for("read_item", item_id="abc") == "/v1/items/abc"
+ assert (
+ parent_router.routes[1].url_path_for("read_item", item_id="abc")
+ == "/v2/items/abc"
+ )
+
+
+def test_indirect_router_inclusion_cycles_are_rejected():
+ parent_router = APIRouter()
+ child_router = APIRouter()
+
+ parent_router.include_router(child_router, prefix="/child")
+
+ with pytest.raises(AssertionError, match="already includes this router"):
+ child_router.include_router(parent_router, prefix="/parent")
+
+ parent_router = APIRouter()
+ child_router = APIRouter()
+ grandchild_router = APIRouter()
+
+ parent_router.include_router(child_router, prefix="/child")
+ child_router.include_router(grandchild_router, prefix="/grandchild")
+
+ with pytest.raises(AssertionError, match="already includes this router"):
+ grandchild_router.include_router(parent_router, prefix="/parent")
+
+
+def test_original_api_route_subclass_instance_is_called_after_inclusion():
+ class TrackingRoute(APIRoute):
+ calls = 0
+
+ async def handle(self, scope, receive, send):
+ self.calls += 1
+ await super().handle(scope, receive, send)
+
+ router = APIRouter(route_class=TrackingRoute)
+
+ @router.get("/items")
+ def read_items():
+ return []
+
+ original_route = router.routes[0]
+ assert isinstance(original_route, TrackingRoute)
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+
+ response = TestClient(app).get("/api/items")
+
+ assert response.status_code == 200
+ assert original_route.calls == 1
+
+
+def test_original_api_route_get_route_handler_is_called_after_inclusion():
+ class TrackingRoute(APIRoute):
+ calls = 0
+
+ def get_route_handler(self):
+ handler = super().get_route_handler()
+
+ async def custom_handler(request):
+ self.calls += 1
+ return await handler(request)
+
+ return custom_handler
+
+ router = APIRouter(route_class=TrackingRoute)
+
+ @router.get("/items")
+ def read_items():
+ return []
+
+ original_route = router.routes[0]
+ assert isinstance(original_route, TrackingRoute)
+ original_route.calls = 0
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+
+ response = TestClient(app).get("/api/items")
+
+ assert response.status_code == 200
+ assert original_route.calls == 1
+
+
+def test_original_api_route_matches_is_called_after_inclusion():
+ class HeaderRoute(APIRoute):
+ calls = 0
+
+ def matches(self, scope):
+ self.calls += 1
+ headers = dict(scope.get("headers", []))
+ if headers.get(b"x-match") != b"yes":
+ return Match.NONE, {}
+ return super().matches(scope)
+
+ router = APIRouter(route_class=HeaderRoute)
+
+ @router.get("/items")
+ def read_items():
+ return []
+
+ original_route = router.routes[0]
+ assert isinstance(original_route, HeaderRoute)
+ original_route.calls = 0
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+ client = TestClient(app)
+
+ assert client.get("/api/items").status_code == 404
+ assert client.get("/api/items", headers={"x-match": "yes"}).status_code == 200
+ assert original_route.calls >= 2
+
+
+def test_effective_route_context_is_available_in_scope_during_request():
+ router = APIRouter()
+
+ @router.get("/items")
+ def read_items(request: Request):
+ fastapi_scope = request.scope.get("fastapi")
+ assert isinstance(fastapi_scope, dict)
+ return {
+ "has_context": "effective_route_context" in fastapi_scope,
+ "path": fastapi_scope["effective_route_context"].path,
+ }
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+
+ response = TestClient(app).get("/api/items")
+
+ assert response.status_code == 200
+ assert response.json() == {"has_context": True, "path": "/api/items"}
+
+
+def test_original_api_router_matches_is_called_after_inclusion():
+ class HeaderRouter(APIRouter):
+ calls = 0
+
+ def matches(self, scope):
+ self.calls += 1
+ headers = dict(scope.get("headers", []))
+ if headers.get(b"x-router-match") != b"yes":
+ return Match.NONE, {}
+ return super().matches(scope)
+
+ router = HeaderRouter()
+
+ @router.get("/items")
+ def read_items():
+ return []
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+ client = TestClient(app)
+
+ assert client.get("/api/items").status_code == 404
+ assert (
+ client.get("/api/items", headers={"x-router-match": "yes"}).status_code == 200
+ )
+ assert router.calls >= 2
+
+
+def test_original_nested_api_router_subclasses_are_called_after_inclusion():
+ class TrackingRouter(APIRouter):
+ calls = 0
+
+ async def handle(self, scope, receive, send):
+ self.calls += 1
+ await super().handle(scope, receive, send)
+
+ parent_router = TrackingRouter()
+ child_router = TrackingRouter()
+
+ @child_router.get("/items")
+ def read_items():
+ return []
+
+ parent_router.include_router(child_router, prefix="/child")
+ app = FastAPI()
+ app.include_router(parent_router, prefix="/api")
+
+ response = TestClient(app).get("/api/child/items")
+
+ assert response.status_code == 200
+ assert parent_router.calls == 1
+ assert child_router.calls == 1
+
+
+def test_router_and_include_prefix_path_params_reach_endpoint_and_openapi():
+ router = APIRouter(prefix="/tenants/{tenant_id}")
+
+ @router.get("/items/{item_id}")
+ def read_item(version: int, tenant_id: int, item_id: int):
+ return {"version": version, "tenant_id": tenant_id, "item_id": item_id}
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api/{version}")
+
+ client = TestClient(app)
+ response = client.get("/api/1/tenants/2/items/3")
+
+ assert response.status_code == 200
+ assert response.json() == {"version": 1, "tenant_id": 2, "item_id": 3}
+
+ operation = client.get("/openapi.json").json()["paths"][
+ "/api/{version}/tenants/{tenant_id}/items/{item_id}"
+ ]["get"]
+ assert {parameter["name"] for parameter in operation["parameters"]} == {
+ "version",
+ "tenant_id",
+ "item_id",
+ }
+
+
+def test_effective_body_fields_from_app_router_include_and_route_match_openapi():
+ def app_body_dependency(app_body: Annotated[str, Body()]):
+ return app_body
+
+ def router_body_dependency(router_body: Annotated[int, Body()]):
+ return router_body
+
+ def include_body_dependency(include_body: Annotated[bool, Body()]):
+ return include_body
+
+ app = FastAPI(dependencies=[Depends(app_body_dependency)])
+ router = APIRouter(dependencies=[Depends(router_body_dependency)])
+
+ @router.post("/items")
+ def create_item(route_body: Annotated[float, Body()]):
+ return {"route_body": route_body}
+
+ app.include_router(
+ router,
+ prefix="/api",
+ dependencies=[Depends(include_body_dependency)],
+ )
+
+ client = TestClient(app)
+ response = client.post(
+ "/api/items",
+ json={
+ "app_body": "app",
+ "router_body": 1,
+ "include_body": True,
+ "route_body": 2.5,
+ },
+ )
+
+ assert response.status_code == 200
+ assert response.json() == {"route_body": 2.5}
+
+ schema = client.get("/openapi.json").json()
+ request_body_schema = schema["paths"]["/api/items"]["post"]["requestBody"][
+ "content"
+ ]["application/json"]["schema"]
+ body_ref = request_body_schema["$ref"].removeprefix("#/components/schemas/")
+ body_schema = schema["components"]["schemas"][body_ref]
+ assert set(body_schema["required"]) == {
+ "app_body",
+ "router_body",
+ "include_body",
+ "route_body",
+ }
+ assert set(body_schema["properties"]) == {
+ "app_body",
+ "router_body",
+ "include_body",
+ "route_body",
+ }
+
+
+def test_later_full_match_wins_over_earlier_included_partial_match():
+ get_router = APIRouter()
+ post_router = APIRouter()
+
+ @get_router.get("/items")
+ def read_items(): # pragma: no cover
+ return {"method": "get"}
+
+ @post_router.post("/items")
+ def create_item():
+ return {"method": "post"}
+
+ app = FastAPI()
+ app.include_router(get_router, prefix="/api")
+ app.include_router(post_router, prefix="/api")
+
+ response = TestClient(app).post("/api/items")
+
+ assert response.status_code == 200
+ assert response.json() == {"method": "post"}
+
+
+def test_included_partial_match_returns_405_when_no_later_full_match_exists():
+ router = APIRouter()
+
+ @router.get("/items")
+ def read_items(): # pragma: no cover
+ return []
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+
+ response = TestClient(app).post("/api/items")
+
+ assert response.status_code == 405
+ assert response.headers["allow"] == "GET"
+
+
+def test_included_slash_redirect_does_not_block_later_exact_match():
+ redirect_router = APIRouter()
+ exact_router = APIRouter()
+
+ @redirect_router.get("/items/")
+ def read_items_with_slash(): # pragma: no cover
+ return {"path": "slash"}
+
+ @exact_router.get("/items")
+ def read_items_without_slash():
+ return {"path": "exact"}
+
+ app = FastAPI()
+ app.include_router(redirect_router, prefix="/api")
+ app.include_router(exact_router, prefix="/api")
+
+ response = TestClient(app).get("/api/items", follow_redirects=False)
+
+ assert response.status_code == 200
+ assert response.json() == {"path": "exact"}
+
+
+def test_failed_included_match_does_not_leak_effective_context_to_later_route():
+ class RejectingRoute(APIRoute):
+ def matches(self, scope):
+ return Match.NONE, {}
+
+ rejecting_router = APIRouter(route_class=RejectingRoute)
+ fallback_router = APIRouter()
+
+ @rejecting_router.get("/items")
+ def rejected_item(): # pragma: no cover
+ return {"source": "rejected"}
+
+ @fallback_router.get("/items")
+ def fallback_item(request: Request):
+ fastapi_scope = request.scope.get("fastapi", {})
+ context = fastapi_scope.get("effective_route_context")
+ return {
+ "source": "fallback",
+ "context_path": getattr(context, "path", None),
+ }
+
+ app = FastAPI()
+ app.include_router(rejecting_router, prefix="/api")
+ app.include_router(fallback_router, prefix="/api")
+
+ response = TestClient(app).get("/api/items")
+
+ assert response.status_code == 200
+ assert response.json() == {"source": "fallback", "context_path": "/api/items"}
+
+
+def test_included_starlette_mount_keeps_prefix_runtime_and_url_path_for():
+ def mounted_endpoint(request):
+ return PlainTextResponse("mounted")
+
+ router = APIRouter(
+ routes=[
+ Mount(
+ "/mounted",
+ routes=[Route("/items/{item_id}", mounted_endpoint, name="read_item")],
+ name="mounted",
+ )
+ ]
+ )
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+
+ client = TestClient(app)
+ response = client.get("/api/mounted/items/abc")
+
+ assert response.status_code == 200
+ assert response.text == "mounted"
+ assert (
+ app.url_path_for("mounted:read_item", item_id="abc") == "/api/mounted/items/abc"
+ )
+
+
+def test_included_starlette_host_keeps_prefix_runtime_and_url_path_for():
+ def hosted_endpoint(request):
+ return PlainTextResponse("hosted")
+
+ hosted_app = Router(
+ routes=[Route("/items/{item_id}", hosted_endpoint, name="read_item")]
+ )
+ router = APIRouter(
+ routes=[Host("{subdomain}.example.com", hosted_app, name="hosted")]
+ )
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+
+ client = TestClient(app, base_url="http://api.example.com")
+ response = client.get("/api/items/abc")
+
+ assert response.status_code == 200
+ assert response.text == "hosted"
+ url = app.url_path_for("hosted:read_item", subdomain="api", item_id="abc")
+ assert str(url) == "/api/items/abc"
+ assert url.host == "api.example.com"
+
+
+def test_restore_fastapi_scope_key_ignores_non_dict_fastapi_scope():
+ scope = {"fastapi": "not-a-dict"}
+
+ _restore_fastapi_scope_key(scope, "effective_route_context", object())
+
+ assert scope == {"fastapi": "not-a-dict"}
+
+
+@pytest.mark.anyio
+async def test_included_api_route_without_app_scope_returns_405_response():
+ router = APIRouter()
+
+ @router.get("/items")
+ def read_items(): # pragma: no cover
+ return {"items": []}
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+ included_router = cast(_IncludedRouter, app.router.routes[-1])
+ effective_context = next(included_router.effective_route_contexts())
+ route = effective_context.original_route
+ messages = []
+
+ async def receive(): # pragma: no cover
+ return {"type": "http.request", "body": b"", "more_body": False}
+
+ async def send(message):
+ messages.append(message)
+
+ scope = {
+ "type": "http",
+ "method": "POST",
+ "path": "/api/items",
+ "raw_path": b"/api/items",
+ "root_path": "",
+ "scheme": "http",
+ "query_string": b"",
+ "headers": [],
+ "fastapi": {"effective_route_context": effective_context},
+ }
+
+ await route.handle(scope, receive, send)
+
+ assert messages[0]["type"] == "http.response.start"
+ assert messages[0]["status"] == 405
+ assert dict(messages[0]["headers"])[b"allow"] == b"GET"
+
+
+def test_effective_api_route_context_does_not_match_websocket_scope():
+ router = APIRouter()
+
+ @router.get("/items")
+ def read_items(): # pragma: no cover
+ return {"items": []}
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+ included_router = cast(_IncludedRouter, app.router.routes[-1])
+ effective_context = next(included_router.effective_route_contexts())
+
+ match, child_scope = effective_context.matches(
+ {
+ "type": "websocket",
+ "path": "/api/items",
+ "root_path": "",
+ }
+ )
+
+ assert match == Match.NONE
+ assert child_scope == {}
+
+
+def test_effective_api_route_context_url_path_for_no_match():
+ router = APIRouter()
+
+ @router.get("/items/{item_id}")
+ def read_item(item_id: str): # pragma: no cover
+ return {"item_id": item_id}
+
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+ included_router = cast(_IncludedRouter, app.router.routes[-1])
+ effective_context = next(included_router.effective_route_contexts())
+
+ with pytest.raises(NoMatchFound):
+ effective_context.url_path_for("missing", item_id="abc")
+
+ with pytest.raises(NoMatchFound):
+ included_router.url_path_for("missing", item_id="abc")
+
+
+def test_included_starlette_host_without_prefix_keeps_original_app():
+ def hosted_endpoint(request):
+ return PlainTextResponse("hosted")
+
+ hosted_app = Router(
+ routes=[Route("/items/{item_id}", hosted_endpoint, name="read_item")]
+ )
+ router = APIRouter(
+ routes=[Host("{subdomain}.example.com", hosted_app, name="hosted")]
+ )
+ app = FastAPI()
+ app.include_router(router)
+
+ client = TestClient(app, base_url="http://api.example.com")
+ response = client.get("/items/abc")
+
+ assert response.status_code == 200
+ assert response.text == "hosted"
+
+
+class UnknownRoute(BaseRoute):
+ def matches(self, scope): # pragma: no cover
+ return Match.NONE, {}
+
+ async def handle(self, scope, receive, send): # pragma: no cover
+ raise AssertionError("UnknownRoute should not be handled")
+
+ def url_path_for(self, name, /, **path_params): # pragma: no cover
+ raise NoMatchFound(name, path_params)
+
+
+@pytest.mark.anyio
+async def test_included_unknown_route_is_ignored_and_can_return_default_404():
+ router = APIRouter(routes=[UnknownRoute()])
+ app = FastAPI()
+ app.include_router(router, prefix="/api")
+ included_router = cast(_IncludedRouter, app.router.routes[-1])
+
+ assert included_router.effective_candidates() == []
+
+ messages = []
+
+ async def receive(): # pragma: no cover
+ return {"type": "http.request", "body": b"", "more_body": False}
+
+ async def send(message):
+ messages.append(message)
+
+ scope = {
+ "type": "http",
+ "method": "GET",
+ "path": "/api/missing",
+ "raw_path": b"/api/missing",
+ "root_path": "",
+ "scheme": "http",
+ "query_string": b"",
+ "headers": [],
+ "fastapi": {},
+ }
+
+ await included_router._handle_selected(scope, receive, send)
+
+ assert messages[0]["type"] == "http.response.start"
+ assert messages[0]["status"] == 404
+
+
+def test_no_prefix_include_validation_sees_effective_starlette_route_candidates():
+ def endpoint(request): # pragma: no cover
+ return PlainTextResponse("ok")
+
+ child_router = APIRouter(routes=[Route("/items", endpoint, name="read_items")])
+ parent_router = APIRouter()
+ parent_router.include_router(child_router, prefix="/child")
+
+ candidates = list(_iter_included_route_candidates(parent_router.routes))
+
+ assert cast(Route, candidates[0]).path == "/child/items"
+
+
+def test_no_prefix_include_validation_sees_effective_api_route_path():
+ leaf_router = APIRouter()
+
+ @leaf_router.get("")
+ def read_items():
+ return []
+
+ parent_router = APIRouter()
+ parent_router.include_router(leaf_router, prefix="/items")
+
+ # for coverage
+ candidates = list(_iter_included_route_candidates(parent_router.routes))
+ assert cast(APIRoute, candidates[0]).path == ""
+
+ app = FastAPI()
+ app.include_router(parent_router)
+ client = TestClient(app)
+
+ response = client.get("/items")
+
+ assert response.status_code == 200, response.text
+ assert response.json() == []
+
+
+def test_no_prefix_include_validation_sees_effective_starlette_route_path():
+ def endpoint(request):
+ return PlainTextResponse("ok")
+
+ child_router = APIRouter(routes=[Route("/items", endpoint, name="read_items")])
+ parent_router = APIRouter()
+ parent_router.include_router(child_router, prefix="/child")
+
+ app = FastAPI()
+ app.include_router(parent_router)
+ client = TestClient(app)
+
+ response = client.get("/child/items")
+
+ assert response.status_code == 200, response.text
+ assert response.text == "ok"
+
+
+def test_no_prefix_include_validation_rejects_empty_effective_api_route_path():
+ router = APIRouter()
+
+ @router.get("")
+ def read_items(): # pragma: no cover
+ return []
+
+ app = FastAPI()
+ with pytest.raises(FastAPIError):
+ app.include_router(router)
+
+
+def test_apirouter_matches_fallback_without_include_context():
+ router = APIRouter()
+
+ def read_items(request): # pragma: no cover
+ return PlainTextResponse("items")
+
+ router.add_route("/items", read_items)
+
+ assert router.matches({"type": "http", "path": "/items", "root_path": ""}) == (
+ Match.NONE,
+ {},
+ )
+
+
+@pytest.mark.anyio
+async def test_apirouter_handle_fallback_without_include_context():
+ router = APIRouter()
+
+ def read_items(request):
+ return PlainTextResponse("items")
+
+ router.add_route("/items", read_items)
+ messages = []
+
+ async def receive(): # pragma: no cover
+ return {"type": "http.request", "body": b"", "more_body": False}
+
+ async def send(message):
+ messages.append(message)
+
+ scope = {
+ "type": "http",
+ "method": "GET",
+ "path": "/items",
+ "raw_path": b"/items",
+ "root_path": "",
+ "scheme": "http",
+ "query_string": b"",
+ "headers": [],
+ }
+
+ await router.handle(scope, receive, send)
+
+ assert messages[0]["type"] == "http.response.start"
+ assert messages[0]["status"] == 200
+ assert messages[1]["body"] == b"items"
diff --git a/tests/test_schema_compat_pydantic_v2.py b/tests/test_schema_compat_pydantic_v2.py
index 7612c6ab5..bf47e62b2 100644
--- a/tests/test_schema_compat_pydantic_v2.py
+++ b/tests/test_schema_compat_pydantic_v2.py
@@ -26,7 +26,7 @@ def get_client():
@app.get("/users")
async def get_user() -> User:
- return {"username": "alice", "role": "admin"}
+ return {"username": "alice", "role": "admin"} # ty: ignore[invalid-return-type]
client = TestClient(app)
return client
diff --git a/tests/test_serialize_response_model.py b/tests/test_serialize_response_model.py
index bb05f7bc4..6ee55ead8 100644
--- a/tests/test_serialize_response_model.py
+++ b/tests/test_serialize_response_model.py
@@ -18,7 +18,7 @@ def get_valid():
@app.get("/items/coerce", response_model=Item)
def get_coerce():
- return Item(aliased_name="coerce", price="1.0")
+ return Item(aliased_name="coerce", price="1.0") # ty: ignore[invalid-argument-type]
@app.get("/items/validlist", response_model=list[Item])
@@ -52,7 +52,7 @@ def get_valid_exclude_unset():
response_model_exclude_unset=True,
)
def get_coerce_exclude_unset():
- return Item(aliased_name="coerce", price="1.0")
+ return Item(aliased_name="coerce", price="1.0") # ty: ignore[invalid-argument-type]
@app.get(
diff --git a/tests/test_skip_defaults.py b/tests/test_skip_defaults.py
index 238da7392..170cf21e3 100644
--- a/tests/test_skip_defaults.py
+++ b/tests/test_skip_defaults.py
@@ -29,7 +29,7 @@ class ModelDefaults(BaseModel):
@app.get("/", response_model=Model, response_model_exclude_unset=True)
def get_root() -> ModelSubclass:
- return ModelSubclass(sub={}, y=1, z=0)
+ return ModelSubclass(sub={}, y=1, z=0) # ty: ignore[invalid-argument-type]
@app.get(
diff --git a/tests/test_sse.py b/tests/test_sse.py
index 3efd43e4f..2065c685b 100644
--- a/tests/test_sse.py
+++ b/tests/test_sse.py
@@ -385,7 +385,7 @@ def test_server_sent_event_single_line_fields_reject_newlines(
field_name: str, value: str
):
with pytest.raises(ValueError, match=f"SSE '{field_name}' must be a single line"):
- ServerSentEvent(data="test", **{field_name: value})
+ ServerSentEvent(data="test", **{field_name: value}) # ty: ignore[invalid-argument-type]
def test_server_sent_event_negative_retry_rejected():
@@ -395,7 +395,7 @@ def test_server_sent_event_negative_retry_rejected():
def test_server_sent_event_float_retry_rejected():
with pytest.raises(ValueError):
- ServerSentEvent(data="test", retry=1.5) # type: ignore[arg-type]
+ ServerSentEvent(data="test", retry=1.5) # type: ignore[arg-type] # ty: ignore[invalid-argument-type]
def test_raw_data_sent_without_json_encoding(client: TestClient):
diff --git a/tests/test_starlette_urlconvertors.py b/tests/test_starlette_urlconvertors.py
index 5ef1b819c..cebe3dbe8 100644
--- a/tests/test_starlette_urlconvertors.py
+++ b/tests/test_starlette_urlconvertors.py
@@ -32,7 +32,7 @@ def test_route_converters_int():
response = client.get("/int/5")
assert response.status_code == 200, response.text
assert response.json() == {"int": 5}
- assert app.url_path_for("int_convertor", param=5) == "/int/5" # type: ignore
+ assert app.url_path_for("int_convertor", param=5) == "/int/5"
def test_route_converters_float():
@@ -40,7 +40,7 @@ def test_route_converters_float():
response = client.get("/float/25.5")
assert response.status_code == 200, response.text
assert response.json() == {"float": 25.5}
- assert app.url_path_for("float_convertor", param=25.5) == "/float/25.5" # type: ignore
+ assert app.url_path_for("float_convertor", param=25.5) == "/float/25.5"
def test_route_converters_path():
diff --git a/tests/test_stream_cancellation.py b/tests/test_stream_cancellation.py
index 20069c5f6..18e6d67d5 100644
--- a/tests/test_stream_cancellation.py
+++ b/tests/test_stream_cancellation.py
@@ -10,6 +10,7 @@ import anyio
import pytest
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
+from starlette.types import Message, Scope
pytestmark = [
pytest.mark.anyio,
@@ -45,16 +46,16 @@ async def _run_asgi_and_cancel(app: FastAPI, path: str, timeout: float) -> bool:
"""
chunks: list[bytes] = []
- async def receive(): # type: ignore[no-untyped-def]
+ async def receive() -> Message:
# Simulate a client that never disconnects, rely on cancellation
await anyio.sleep(float("inf"))
return {"type": "http.disconnect"} # pragma: no cover
- async def send(message: dict) -> None: # type: ignore[type-arg]
+ async def send(message: Message) -> None:
if message["type"] == "http.response.body":
chunks.append(message.get("body", b""))
- scope = {
+ scope: Scope = {
"type": "http",
"asgi": {"version": "3.0", "spec_version": "2.0"},
"http_version": "1.1",
@@ -67,7 +68,7 @@ async def _run_asgi_and_cancel(app: FastAPI, path: str, timeout: float) -> bool:
}
with anyio.move_on_after(timeout) as cancel_scope:
- await app(scope, receive, send) # type: ignore[arg-type]
+ await app(scope, receive, send)
# If we got here within the timeout the generator was cancellable.
# cancel_scope.cancelled_caught is True when move_on_after fired.
diff --git a/tests/test_swagger_ui_escape.py b/tests/test_swagger_ui_escape.py
index 072d21952..6b9851abd 100644
--- a/tests/test_swagger_ui_escape.py
+++ b/tests/test_swagger_ui_escape.py
@@ -8,7 +8,7 @@ def test_init_oauth_html_chars_are_escaped():
title="Test",
init_oauth={"appName": xss_payload},
)
- body = html.body.decode()
+ body = bytes(html.body).decode()
assert "