diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0cb5b86e3..e5c359eeb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -45,7 +45,7 @@ repos: - id: local-ty name: ty check - entry: uv run ty check fastapi + entry: uv run ty check require_serial: true language: unsupported pass_filenames: false diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 704c5599f..5e157f6ee 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,26 @@ hide: ## Latest Changes +### Translations + +* 🌐 Update translations for pt (update-outdated). PR [#15753](https://github.com/fastapi/fastapi/pull/15753) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for es (update-outdated). PR [#15752](https://github.com/fastapi/fastapi/pull/15752) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for ja (update-outdated). PR [#15751](https://github.com/fastapi/fastapi/pull/15751) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for ru (update-outdated). PR [#15758](https://github.com/fastapi/fastapi/pull/15758) by [@tiangolo](https://github.com/tiangolo). + +### Internal + +* 🔥 Remove unused scripts. PR [#15771](https://github.com/fastapi/fastapi/pull/15771) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Add ty configs to check docs sources. PR [#15770](https://github.com/fastapi/fastapi/pull/15770) by [@tiangolo](https://github.com/tiangolo). +* 🔧 Add ty configs to check docs sources. PR [#15769](https://github.com/fastapi/fastapi/pull/15769) by [@tiangolo](https://github.com/tiangolo). + +## 0.137.1 (2026-06-15) + +### Fixes + +* 🚨 Fix typing checks for APIRoute. PR [#15765](https://github.com/fastapi/fastapi/pull/15765) by [@tiangolo](https://github.com/tiangolo). +* 🐛 Fix bug, allow empty path in path operation in prefixless router. PR [#15763](https://github.com/fastapi/fastapi/pull/15763) by [@tiangolo](https://github.com/tiangolo). + ## 0.137.0 (2026-06-14) ### Breaking Changes diff --git a/docs/es/docs/advanced/additional-responses.md b/docs/es/docs/advanced/additional-responses.md index 83053d3a9..6695caf1b 100644 --- a/docs/es/docs/advanced/additional-responses.md +++ b/docs/es/docs/advanced/additional-responses.md @@ -34,7 +34,7 @@ Ten en cuenta que debes devolver el `JSONResponse` directamente. /// -/// info | Información +/// note | Nota La clave `model` no es parte de OpenAPI. @@ -183,7 +183,7 @@ Nota que debes devolver la imagen usando un `FileResponse` directamente. /// -/// info | Información +/// note | Nota A menos que especifiques un media type diferente explícitamente en tu parámetro `responses`, FastAPI asumirá que el response tiene el mismo media type que la clase de response principal (por defecto `application/json`). diff --git a/docs/es/docs/advanced/advanced-dependencies.md b/docs/es/docs/advanced/advanced-dependencies.md index cee93692d..f3053ffe3 100644 --- a/docs/es/docs/advanced/advanced-dependencies.md +++ b/docs/es/docs/advanced/advanced-dependencies.md @@ -98,7 +98,7 @@ Por ejemplo, si tenías una sesión de base de datos en una dependencia con `yie Este comportamiento se revirtió en la 0.118.0, para hacer que el código de salida después de `yield` se ejecute después de que la response sea enviada. -/// info | Información +/// note | Nota Como verás abajo, esto es muy similar al comportamiento anterior a la versión 0.106.0, pero con varias mejoras y arreglos de bugs para casos límite. diff --git a/docs/es/docs/advanced/custom-response.md b/docs/es/docs/advanced/custom-response.md index e1db10147..838118cca 100644 --- a/docs/es/docs/advanced/custom-response.md +++ b/docs/es/docs/advanced/custom-response.md @@ -24,7 +24,7 @@ Si declaras un [Response Model](../tutorial/response-model.md) FastAPI lo usará Si no declaras un response model, FastAPI usará el `jsonable_encoder` explicado en [Codificador Compatible con JSON](../tutorial/encoder.md) y lo pondrá en un `JSONResponse`. -Si declaras un `response_class` con un media type JSON (`application/json`), como es el caso con `JSONResponse`, los datos que devuelvas se convertirán automáticamente (y serán filtrados) con cualquier `response_model` de Pydantic que hayas declarado en el *path operation decorator*. Pero los datos no se serializarán a bytes JSON con Pydantic, en su lugar se convertirán con el `jsonable_encoder` y luego se pasarán a la clase `JSONResponse`, que los serializará a bytes usando la librería JSON estándar de Python. +Si declaras un `response_class` con un media type JSON (`application/json`), como es el caso con `JSONResponse`, los datos que devuelvas se convertirán automáticamente (y serán filtrados) con cualquier `response_model` de Pydantic que hayas declarado en el *path operation decorator*. Pero los datos no se serializarán a bytes JSON con Pydantic, en su lugar se convertirán con el `jsonable_encoder` y luego se pasarán a la clase `JSONResponse`, que los serializará a bytes usando el paquete JSON estándar de Python. ### Rendimiento JSON { #json-performance } @@ -41,7 +41,7 @@ Para devolver un response con HTML directamente desde **FastAPI**, usa `HTMLResp {* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *} -/// info | Información +/// note | Nota El parámetro `response_class` también se utilizará para definir el "media type" del response. @@ -65,7 +65,7 @@ Una `Response` devuelta directamente por tu *path operation function* no se docu /// -/// info | Información +/// note | Nota Por supuesto, el `Content-Type` header real, el código de estado, etc., provendrán del objeto `Response` que devolviste. @@ -181,7 +181,7 @@ Toma un generador `async` o un generador/iterador normal (una función con `yiel Una tarea `async` solo puede cancelarse cuando llega a un `await`. Si no hay `await`, el generador (función con `yield`) no se puede cancelar correctamente y puede seguir ejecutándose incluso después de solicitar la cancelación. -Como este pequeño ejemplo no necesita ninguna sentencia `await`, añadimos un `await anyio.sleep(0)` para darle al loop de eventos la oportunidad de manejar la cancelación. +Como este pequeño ejemplo no necesita ninguna statement `await`, añadimos un `await anyio.sleep(0)` para darle al loop de eventos la oportunidad de manejar la cancelación. Esto sería aún más importante con streams grandes o infinitos. diff --git a/docs/es/docs/advanced/dataclasses.md b/docs/es/docs/advanced/dataclasses.md index 3ce5c754f..e49cada43 100644 --- a/docs/es/docs/advanced/dataclasses.md +++ b/docs/es/docs/advanced/dataclasses.md @@ -18,7 +18,7 @@ Y por supuesto, soporta lo mismo: Esto funciona de la misma manera que con los modelos de Pydantic. Y en realidad se logra de la misma manera internamente, utilizando Pydantic. -/// info | Información +/// note | Nota Ten en cuenta que los dataclasses no pueden hacer todo lo que los modelos de Pydantic pueden hacer. diff --git a/docs/es/docs/advanced/events.md b/docs/es/docs/advanced/events.md index 264ee27ed..e69d6b054 100644 --- a/docs/es/docs/advanced/events.md +++ b/docs/es/docs/advanced/events.md @@ -120,7 +120,7 @@ Para añadir una función que debería ejecutarse cuando la aplicación se esté Aquí, la función manejadora del evento `shutdown` escribirá una línea de texto `"Application shutdown"` a un archivo `log.txt`. -/// info | Información +/// note | Nota En la función `open()`, el `mode="a"` significa "añadir", por lo tanto, la línea será añadida después de lo que sea que esté en ese archivo, sin sobrescribir el contenido anterior. @@ -152,7 +152,7 @@ Solo un detalle técnico para los nerds curiosos. 🤓 Por debajo, en la especificación técnica ASGI, esto es parte del [Protocolo de Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), y define eventos llamados `startup` y `shutdown`. -/// info | Información +/// note | Nota Puedes leer más sobre los manejadores `lifespan` de Starlette en [la documentación de `Lifespan` de Starlette](https://www.starlette.dev/lifespan/). diff --git a/docs/es/docs/advanced/generate-clients.md b/docs/es/docs/advanced/generate-clients.md index 534c5e98a..51834d89c 100644 --- a/docs/es/docs/advanced/generate-clients.md +++ b/docs/es/docs/advanced/generate-clients.md @@ -22,16 +22,15 @@ FastAPI genera automáticamente especificaciones **OpenAPI 3.1**, así que cualq ## Generadores de SDKs de sponsors de FastAPI { #sdk-generators-from-fastapi-sponsors } -Esta sección destaca soluciones **respaldadas por empresas** y **venture-backed** de compañías que sponsorean FastAPI. Estos productos ofrecen **funcionalidades adicionales** e **integraciones** además de SDKs generados de alta calidad. +Esta sección destaca soluciones **respaldadas por empresas** y **venture-backed** de compañías que sponsor FastAPI. Estos productos ofrecen **funcionalidades adicionales** e **integraciones** además de SDKs generados de alta calidad. -Al ✨ [**sponsorear FastAPI**](../help-fastapi.md#sponsor-the-author) ✨, estas compañías ayudan a asegurar que el framework y su **ecosistema** se mantengan saludables y **sustentables**. +Al ✨ [**ser sponsor de FastAPI**](../help-fastapi.md#sponsor-the-author) ✨, estas compañías ayudan a asegurar que el framework y su **ecosistema** se mantengan saludables y **sustentables**. Su sponsorship también demuestra un fuerte compromiso con la **comunidad** de FastAPI (tú), mostrando que no solo les importa ofrecer un **gran servicio**, sino también apoyar un **framework robusto y próspero**, FastAPI. 🙇 Por ejemplo, podrías querer probar: * [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) -* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi) Algunas de estas soluciones también pueden ser open source u ofrecer niveles gratuitos, así que puedes probarlas sin un compromiso financiero. Hay otros generadores de SDK comerciales disponibles y se pueden encontrar en línea. 🤓 diff --git a/docs/es/docs/advanced/openapi-callbacks.md b/docs/es/docs/advanced/openapi-callbacks.md index 5e3a1572c..49896b64b 100644 --- a/docs/es/docs/advanced/openapi-callbacks.md +++ b/docs/es/docs/advanced/openapi-callbacks.md @@ -4,7 +4,7 @@ Podrías crear una API con una *path operation* que podría desencadenar un requ El proceso que ocurre cuando tu aplicación API llama a la *API externa* se llama un "callback". Porque el software que escribió el desarrollador externo envía un request a tu API y luego tu API hace un *callback*, enviando un request a una *API externa* (que probablemente fue creada por el mismo desarrollador). -En este caso, podrías querer documentar cómo esa API externa *debería* verse. Qué *path operation* debería tener, qué cuerpo debería esperar, qué response debería devolver, etc. +En este caso, podrías querer documentar cómo esa API externa *debería* verse. Qué *path operation* debería tener, qué body debería esperar, qué response debería devolver, etc. ## Una aplicación con callbacks { #an-app-with-callbacks } @@ -167,13 +167,13 @@ Observa cómo la URL del callback utilizada contiene la URL recibida como parám En este punto tienes las *path operation(s)* del callback necesarias (las que el *desarrollador externo* debería implementar en la *API externa*) en el router de callback que creaste arriba. -Ahora usa el parámetro `callbacks` en el *decorador de path operation de tu API* para pasar el atributo `.routes` (que en realidad es solo un `list` de rutas/*path operations*) de ese router de callback: +Ahora usa el parámetro `callbacks` en el *decorador de path operation de tu API* para pasar el atributo `.routes` de ese router de callback: {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} /// tip | Consejo -Observa que no estás pasando el router en sí (`invoices_callback_router`) a `callback=`, sino el atributo `.routes`, como en `invoices_callback_router.routes`. +Observa que no estás pasando el router en sí (`invoices_callback_router`) a `callbacks=`, sino su `.routes`, como en `invoices_callback_router.routes`. **FastAPI** usará esas rutas para generar la documentación OpenAPI del callback. /// diff --git a/docs/es/docs/advanced/openapi-webhooks.md b/docs/es/docs/advanced/openapi-webhooks.md index 163293f83..9e51735b1 100644 --- a/docs/es/docs/advanced/openapi-webhooks.md +++ b/docs/es/docs/advanced/openapi-webhooks.md @@ -22,7 +22,7 @@ Con **FastAPI**, usando OpenAPI, puedes definir los nombres de estos webhooks, l Esto puede hacer mucho más fácil para tus usuarios **implementar sus APIs** para recibir tus requests de **webhook**, incluso podrían ser capaces de autogenerar algo de su propio código de API. -/// info | Información +/// note | Nota Los webhooks están disponibles en OpenAPI 3.1.0 y superiores, soportados por FastAPI `0.99.0` y superiores. @@ -36,7 +36,7 @@ Cuando creas una aplicación de **FastAPI**, hay un atributo `webhooks` que pued Los webhooks que defines terminarán en el esquema de **OpenAPI** y en la interfaz automática de **documentación**. -/// info | Información +/// note | Nota El objeto `app.webhooks` es en realidad solo un `APIRouter`, el mismo tipo que usarías al estructurar tu aplicación con múltiples archivos. diff --git a/docs/es/docs/advanced/path-operation-advanced-configuration.md b/docs/es/docs/advanced/path-operation-advanced-configuration.md index a21975bc7..99fb14017 100644 --- a/docs/es/docs/advanced/path-operation-advanced-configuration.md +++ b/docs/es/docs/advanced/path-operation-advanced-configuration.md @@ -16,17 +16,11 @@ Tendrías que asegurarte de que sea único para cada operación. ### Usar el nombre de la *path operation function* como el operationId { #using-the-path-operation-function-name-as-the-operationid } -Si quieres usar los nombres de las funciones de tus APIs como `operationId`s, puedes iterar sobre todas ellas y sobrescribir el `operation_id` de cada *path operation* usando su `APIRoute.name`. +Si quieres usar los nombres de las funciones de tus APIs como `operationId`s, puedes pasar una `generate_unique_id_function` personalizada a `FastAPI`. -Deberías hacerlo después de agregar todas tus *path operations*. +La función recibe cada `APIRoute` y devuelve el `operationId` a usar para esa *path operation*. -{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *} - -/// tip | Consejo - -Si llamas manualmente a `app.openapi()`, deberías actualizar los `operationId`s antes de eso. - -/// +{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *} /// warning | Advertencia diff --git a/docs/es/docs/advanced/response-directly.md b/docs/es/docs/advanced/response-directly.md index b2d5d18b8..fa05a3ed6 100644 --- a/docs/es/docs/advanced/response-directly.md +++ b/docs/es/docs/advanced/response-directly.md @@ -16,9 +16,9 @@ Normalmente tendrás mucho mejor rendimiento usando un [Response Model](../tutor ## Devolver una `Response` { #return-a-response } -De hecho, puedes devolver cualquier `Response` o cualquier subclase de ella. +Puedes devolver una `Response` o cualquier subclase de ella. -/// info | Información +/// note | Nota `JSONResponse` en sí misma es una subclase de `Response`. @@ -78,6 +78,6 @@ En su lugar, toma los bytes JSON generados con Pydantic usando el response model Cuando devuelves una `Response` directamente, sus datos no son validados, convertidos (serializados), ni documentados automáticamente. -Pero aún puedes documentarlo como se describe en [Additional Responses in OpenAPI](additional-responses.md). +Pero aún puedes documentarlo como se describe en [Respuestas adicionales en OpenAPI](additional-responses.md). Puedes ver en secciones posteriores cómo usar/declarar estas `Response`s personalizadas mientras todavía tienes conversión automática de datos, documentación, etc. diff --git a/docs/es/docs/advanced/security/oauth2-scopes.md b/docs/es/docs/advanced/security/oauth2-scopes.md index 6ee3dd5ac..f9ddd19e3 100644 --- a/docs/es/docs/advanced/security/oauth2-scopes.md +++ b/docs/es/docs/advanced/security/oauth2-scopes.md @@ -46,7 +46,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. @@ -126,7 +126,7 @@ Lo estamos haciendo aquí para demostrar cómo **FastAPI** maneja scopes declara {* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *} -/// info | Información Técnica +/// note | Detalles técnicos `Security` es en realidad una subclase de `Depends`, y tiene solo un parámetro extra que veremos más adelante. diff --git a/docs/es/docs/advanced/stream-data.md b/docs/es/docs/advanced/stream-data.md index 964a9ed58..2db037e0a 100644 --- a/docs/es/docs/advanced/stream-data.md +++ b/docs/es/docs/advanced/stream-data.md @@ -4,7 +4,7 @@ Si quieres transmitir datos que se puedan estructurar como JSON, deberías [Tran Pero si quieres transmitir datos binarios puros o strings, aquí tienes cómo hacerlo. -/// info | Información +/// note | Nota Añadido en FastAPI 0.134.0. @@ -90,7 +90,7 @@ Por ejemplo, no tienen un `await file.read()`, ni un `async for chunk in file`. Y en muchos casos leerlos sería una operación bloqueante (que podría bloquear el event loop), porque se leen desde disco o desde la red. -/// info | Información +/// note | Nota El ejemplo anterior es en realidad una excepción, porque el objeto `io.BytesIO` ya está en memoria, así que leerlo no bloqueará nada. diff --git a/docs/es/docs/advanced/strict-content-type.md b/docs/es/docs/advanced/strict-content-type.md index 41615edf3..d8003dc9d 100644 --- a/docs/es/docs/advanced/strict-content-type.md +++ b/docs/es/docs/advanced/strict-content-type.md @@ -40,7 +40,7 @@ Ten en cuenta que ambos tienen el mismo host. Luego, usando el frontend, puedes hacer que el agente de IA haga cosas en tu nombre. -Como está corriendo localmente y no en Internet abierta, decides no tener ninguna autenticación configurada, confiando simplemente en el acceso a la red local. +Como está corriendo **localmente** y no en Internet abierta, decides **no tener ninguna autenticación** configurada, confiando simplemente en el acceso a la red local. Entonces, uno de tus usuarios podría instalarlo y ejecutarlo localmente. @@ -69,9 +69,9 @@ Si tu app está en Internet abierta, no “confiarías en la red” ni permitir Los atacantes podrían simplemente ejecutar un script para enviar requests a tu API, sin necesidad de interacción del navegador, así que probablemente ya estás asegurando cualquier endpoint privilegiado. -En ese caso, este ataque/riesgo no aplica a ti. +En ese caso, **este ataque/riesgo no aplica a ti**. -Este riesgo y ataque es relevante principalmente cuando la app corre en la red local y esa es la única protección asumida. +Este riesgo y ataque es relevante principalmente cuando la app corre en la **red local** y esa es la **única protección asumida**. ## Permitir requests sin Content-Type { #allowing-requests-without-content-type } @@ -81,7 +81,7 @@ Si necesitas soportar clientes que no envían un header `Content-Type`, puedes d Con esta configuración, las requests sin un header `Content-Type` tendrán su body parseado como JSON, que es el mismo comportamiento de versiones anteriores de FastAPI. -/// info | Información +/// note | Nota Este comportamiento y configuración se añadieron en FastAPI 0.132.0. diff --git a/docs/es/docs/advanced/websockets.md b/docs/es/docs/advanced/websockets.md index fe75e644b..e3e0ba554 100644 --- a/docs/es/docs/advanced/websockets.md +++ b/docs/es/docs/advanced/websockets.md @@ -111,7 +111,7 @@ Funcionan de la misma manera que para otros endpoints de FastAPI/*path operation {* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *} -/// info | Información +/// note | Nota Como esto es un WebSocket no tiene mucho sentido lanzar un `HTTPException`, en su lugar lanzamos un `WebSocketException`. diff --git a/docs/es/docs/advanced/wsgi.md b/docs/es/docs/advanced/wsgi.md index 0d0c42fd5..8afe215a1 100644 --- a/docs/es/docs/advanced/wsgi.md +++ b/docs/es/docs/advanced/wsgi.md @@ -6,7 +6,7 @@ Para eso, puedes usar el `WSGIMiddleware` y usarlo para envolver tu aplicación ## Usando `WSGIMiddleware` { #using-wsgimiddleware } -/// info | Información +/// note | Nota Esto requiere instalar `a2wsgi`, por ejemplo con `pip install a2wsgi`. diff --git a/docs/es/docs/deployment/docker.md b/docs/es/docs/deployment/docker.md index 6ce0e192a..f62db5e70 100644 --- a/docs/es/docs/deployment/docker.md +++ b/docs/es/docs/deployment/docker.md @@ -132,7 +132,7 @@ Successfully installed fastapi pydantic -/// info | Información +/// note | Nota Existen otros formatos y herramientas para definir e instalar dependencias de paquetes. @@ -556,7 +556,7 @@ Si estás usando contenedores (por ejemplo, Docker, Kubernetes), entonces hay do Si tienes **múltiples contenedores**, probablemente cada uno ejecutando un **proceso único** (por ejemplo, en un cluster de **Kubernetes**), entonces probablemente querrías tener un **contenedor separado** realizando el trabajo de los **pasos previos** en un solo contenedor, ejecutando un solo proceso, **antes** de ejecutar los contenedores worker replicados. -/// info | Información +/// note | Nota Si estás usando Kubernetes, probablemente sería un [Contenedor de Inicialización](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). diff --git a/docs/es/docs/deployment/fastapicloud.md b/docs/es/docs/deployment/fastapicloud.md index fc770d1ee..9c289f4b1 100644 --- a/docs/es/docs/deployment/fastapicloud.md +++ b/docs/es/docs/deployment/fastapicloud.md @@ -1,26 +1,6 @@ # FastAPI Cloud { #fastapi-cloud } -Puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com) con **un solo comando**; ve y únete a la lista de espera si aún no lo has hecho. 🚀 - -## Iniciar sesión { #login } - -Asegúrate de que ya tienes una cuenta de **FastAPI Cloud** (te invitamos desde la lista de espera 😉). - -Luego inicia sesión: - -
- -```console -$ fastapi login - -You are logged in to FastAPI Cloud 🚀 -``` - -
- -## Desplegar { #deploy } - -Ahora despliega tu app, con **un solo comando**: +Puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com) con **un solo comando**. 🚀
@@ -36,6 +16,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/deployment/manually.md b/docs/es/docs/deployment/manually.md index f3c771a51..361a57c8f 100644 --- a/docs/es/docs/deployment/manually.md +++ b/docs/es/docs/deployment/manually.md @@ -56,7 +56,6 @@ Hay varias alternativas, incluyendo: * [Hypercorn](https://hypercorn.readthedocs.io/): un servidor ASGI compatible con HTTP/2 y Trio entre otras funcionalidades. * [Daphne](https://github.com/django/daphne): el servidor ASGI construido para Django Channels. * [Granian](https://github.com/emmett-framework/granian): Un servidor HTTP Rust para aplicaciones en Python. -* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit es un runtime para aplicaciones web ligero y versátil. ## Máquina Servidor y Programa Servidor { #server-machine-and-server-program } diff --git a/docs/es/docs/deployment/server-workers.md b/docs/es/docs/deployment/server-workers.md index 3e3a1898b..a7665ccb6 100644 --- a/docs/es/docs/deployment/server-workers.md +++ b/docs/es/docs/deployment/server-workers.md @@ -17,7 +17,7 @@ Como viste en el capítulo anterior sobre [Conceptos de Despliegue](concepts.md) Aquí te mostraré cómo usar **Uvicorn** con **worker processes** usando el comando `fastapi` o el comando `uvicorn` directamente. -/// info | Información +/// note | Nota Si estás usando contenedores, por ejemplo con Docker o Kubernetes, te contaré más sobre eso en el próximo capítulo: [FastAPI en Contenedores - Docker](docker.md). diff --git a/docs/es/docs/how-to/extending-openapi.md b/docs/es/docs/how-to/extending-openapi.md index d00455afd..b0fa23024 100644 --- a/docs/es/docs/how-to/extending-openapi.md +++ b/docs/es/docs/how-to/extending-openapi.md @@ -25,9 +25,17 @@ Y esa función `get_openapi()` recibe como parámetros: * `openapi_version`: La versión de la especificación OpenAPI utilizada. Por defecto, la más reciente: `3.1.0`. * `summary`: Un breve resumen de la API. * `description`: La descripción de tu API, esta puede incluir markdown y se mostrará en la documentación. -* `routes`: Una list de rutas, estas son cada una de las *path operations* registradas. Se toman de `app.routes`. +* `routes`: Las rutas de la aplicación, tomadas de `app.routes`. FastAPI las usa para recolectar las *path operations* registradas, incluidas las de los routers incluidos. -/// info | Información +/// tip | Detalles técnicos + +`app.routes` es un árbol de rutas de nivel inferior. Puede incluir rutas candidatas que FastAPI usa internamente para routers incluidos, no solo objetos `APIRoute` finales. + +Aun así puedes pasar `app.routes` a `get_openapi()`. FastAPI recorrerá ese árbol de rutas para recolectar las path operations efectivas. + +/// + +/// note | Nota El parámetro `summary` está disponible en OpenAPI 3.1.0 y versiones superiores, soportado por FastAPI 0.99.0 y superiores. diff --git a/docs/es/docs/how-to/separate-openapi-schemas.md b/docs/es/docs/how-to/separate-openapi-schemas.md index db9b46ddb..1026085e0 100644 --- a/docs/es/docs/how-to/separate-openapi-schemas.md +++ b/docs/es/docs/how-to/separate-openapi-schemas.md @@ -85,7 +85,7 @@ Probablemente el caso principal para esto es si ya tienes algún código cliente En ese caso, puedes desactivar esta funcionalidad en **FastAPI**, con el parámetro `separate_input_output_schemas=False`. -/// info | Información +/// note | Nota El soporte para `separate_input_output_schemas` fue agregado en FastAPI `0.102.0`. 🤓 diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md index 1217c4c6f..58d534eef 100644 --- a/docs/es/docs/index.md +++ b/docs/es/docs/index.md @@ -45,7 +45,7 @@ Las funcionalidades clave son: * **Rápido**: Muy alto rendimiento, a la par con **NodeJS** y **Go** (gracias a Starlette y Pydantic). [Uno de los frameworks Python más rápidos disponibles](#performance). * **Rápido de programar**: Aumenta la velocidad para desarrollar funcionalidades en aproximadamente un 200% a 300%. * * **Menos bugs**: Reduce en aproximadamente un 40% los errores inducidos por humanos (desarrolladores). * -* **Intuitivo**: Gran soporte para editores. Autocompletado en todas partes. Menos tiempo depurando. +* **Intuitivo**: Gran soporte para editores. Autocompletado en todas partes. Menos tiempo depurando. * **Fácil**: Diseñado para ser fácil de usar y aprender. Menos tiempo leyendo documentación. * **Corto**: Minimiza la duplicación de código. Múltiples funcionalidades desde cada declaración de parámetro. Menos bugs. * **Robusto**: Obtén código listo para producción. Con documentación interactiva automática. @@ -492,9 +492,7 @@ Para un ejemplo más completo incluyendo más funcionalidades, ve al @@ -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/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/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: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) @@ -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/fastapi/__init__.py b/fastapi/__init__.py index 808f6b294..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.137.0" +__version__ = "0.137.1" from starlette import status as status diff --git a/fastapi/routing.py b/fastapi/routing.py index fb4784309..48c0c2153 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -1062,6 +1062,41 @@ def _populate_api_route_state( 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, @@ -2435,9 +2470,16 @@ class APIRouter(routing.Router): "A path prefix must not end with '/', as the routes will start with '/'" ) else: - for r in _iter_included_route_candidates(router.routes): - path = getattr(r, "path", None) - 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})" 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_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 index 408cdd3f1..c2679aa11 100644 --- a/tests/test_router_include_context.py +++ b/tests/test_router_include_context.py @@ -2,6 +2,7 @@ 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, @@ -807,6 +808,60 @@ def test_no_prefix_include_validation_sees_effective_starlette_route_candidates( 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() 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 86a67f8f9..6a9d669fe 100644 --- a/tests/test_sse.py +++ b/tests/test_sse.py @@ -227,7 +227,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(): @@ -237,7 +237,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 "