mirror of
https://github.com/fastapi/fastapi.git
synced 2026-10-10 12:12:55 -04:00
🌐 Sync Spanish docs (outdated pages found with script) (#14553)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
1 parent
e675b25c60
commit
6a8a2d62c4
26 files changed
+316
-315
No files matched your search
@@ -1,4 +1,4 @@
|
||||
# Tareas en Segundo Plano
|
||||
# Tareas en Segundo Plano { #background-tasks }
|
||||
|
||||
Puedes definir tareas en segundo plano para que se ejecuten *después* de devolver un response.
|
||||
|
||||
@@ -11,7 +11,7 @@ Esto incluye, por ejemplo:
|
||||
* Procesamiento de datos:
|
||||
* Por ejemplo, supongamos que recibes un archivo que debe pasar por un proceso lento, puedes devolver un response de "Accepted" (HTTP 202) y procesar el archivo en segundo plano.
|
||||
|
||||
## Usando `BackgroundTasks`
|
||||
## Usando `BackgroundTasks` { #using-backgroundtasks }
|
||||
|
||||
Primero, importa `BackgroundTasks` y define un parámetro en tu *path operation function* con una declaración de tipo de `BackgroundTasks`:
|
||||
|
||||
@@ -19,7 +19,7 @@ Primero, importa `BackgroundTasks` y define un parámetro en tu *path operation
|
||||
|
||||
**FastAPI** creará el objeto de tipo `BackgroundTasks` por ti y lo pasará como ese parámetro.
|
||||
|
||||
## Crear una función de tarea
|
||||
## Crear una función de tarea { #create-a-task-function }
|
||||
|
||||
Crea una función para que se ejecute como la tarea en segundo plano.
|
||||
|
||||
@@ -33,7 +33,7 @@ Y como la operación de escritura no usa `async` y `await`, definimos la funció
|
||||
|
||||
{* ../../docs_src/background_tasks/tutorial001.py hl[6:9] *}
|
||||
|
||||
## Agregar la tarea en segundo plano
|
||||
## Agregar la tarea en segundo plano { #add-the-background-task }
|
||||
|
||||
Dentro de tu *path operation function*, pasa tu función de tarea al objeto de *background tasks* con el método `.add_task()`:
|
||||
|
||||
@@ -45,7 +45,7 @@ Dentro de tu *path operation function*, pasa tu función de tarea al objeto de *
|
||||
* Cualquier secuencia de argumentos que deba pasarse a la función de tarea en orden (`email`).
|
||||
* Cualquier argumento de palabras clave que deba pasarse a la función de tarea (`message="some notification"`).
|
||||
|
||||
## Inyección de Dependencias
|
||||
## Inyección de Dependencias { #dependency-injection }
|
||||
|
||||
Usar `BackgroundTasks` también funciona con el sistema de inyección de dependencias, puedes declarar un parámetro de tipo `BackgroundTasks` en varios niveles: en una *path operation function*, en una dependencia (dependable), en una sub-dependencia, etc.
|
||||
|
||||
@@ -59,7 +59,7 @@ Si hay un query en el request, se escribirá en el log en una tarea en segundo p
|
||||
|
||||
Y luego otra tarea en segundo plano generada en la *path operation function* escribirá un mensaje usando el parámetro de path `email`.
|
||||
|
||||
## Detalles Técnicos
|
||||
## Detalles Técnicos { #technical-details }
|
||||
|
||||
La clase `BackgroundTasks` proviene directamente de <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">`starlette.background`</a>.
|
||||
|
||||
@@ -71,7 +71,7 @@ Todavía es posible usar `BackgroundTask` solo en FastAPI, pero debes crear el o
|
||||
|
||||
Puedes ver más detalles en <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">la documentación oficial de Starlette sobre Background Tasks</a>.
|
||||
|
||||
## Advertencia
|
||||
## Advertencia { #caveat }
|
||||
|
||||
Si necesitas realizar una computación intensa en segundo plano y no necesariamente necesitas que se ejecute por el mismo proceso (por ejemplo, no necesitas compartir memoria, variables, etc.), podrías beneficiarte del uso de otras herramientas más grandes como <a href="https://docs.celeryq.dev" class="external-link" target="_blank">Celery</a>.
|
||||
|
||||
@@ -79,6 +79,6 @@ Tienden a requerir configuraciones más complejas, un gestor de cola de mensajes
|
||||
|
||||
Pero si necesitas acceder a variables y objetos de la misma app de **FastAPI**, o necesitas realizar pequeñas tareas en segundo plano (como enviar una notificación por email), simplemente puedes usar `BackgroundTasks`.
|
||||
|
||||
## Resumen
|
||||
## Resumen { #recap }
|
||||
|
||||
Importa y usa `BackgroundTasks` con parámetros en *path operation functions* y dependencias para agregar tareas en segundo plano.
|
||||
@@ -1,4 +1,4 @@
|
||||
# Middleware
|
||||
# Middleware { #middleware }
|
||||
|
||||
Puedes añadir middleware a las aplicaciones de **FastAPI**.
|
||||
|
||||
@@ -15,11 +15,11 @@ Un "middleware" es una función que trabaja con cada **request** antes de que se
|
||||
|
||||
Si tienes dependencias con `yield`, el código de salida se ejecutará *después* del middleware.
|
||||
|
||||
Si hubiera alguna tarea en segundo plano (documentada más adelante), se ejecutará *después* de todo el middleware.
|
||||
Si hubiera tareas en segundo plano (cubiertas en la sección [Tareas en segundo plano](background-tasks.md){.internal-link target=_blank}, lo verás más adelante), se ejecutarán *después* de todo el middleware.
|
||||
|
||||
///
|
||||
|
||||
## Crear un middleware
|
||||
## Crear un middleware { #create-a-middleware }
|
||||
|
||||
Para crear un middleware usas el decorador `@app.middleware("http")` encima de una función.
|
||||
|
||||
@@ -35,7 +35,7 @@ La función middleware recibe:
|
||||
|
||||
/// tip | Consejo
|
||||
|
||||
Ten en cuenta que los custom proprietary headers se pueden añadir <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">usando el prefijo 'X-'</a>.
|
||||
Ten en cuenta que los custom proprietary headers se pueden añadir <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">usando el prefijo `X-`</a>.
|
||||
|
||||
Pero si tienes custom headers que deseas que un cliente en un navegador pueda ver, necesitas añadirlos a tus configuraciones de CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) usando el parámetro `expose_headers` documentado en <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">la documentación de CORS de Starlette</a>.
|
||||
|
||||
@@ -49,7 +49,7 @@ También podrías usar `from starlette.requests import Request`.
|
||||
|
||||
///
|
||||
|
||||
### Antes y después de la `response`
|
||||
### Antes y después de la `response` { #before-and-after-the-response }
|
||||
|
||||
Puedes añadir código que se ejecute con la `request`, antes de que cualquier *path operation* la reciba.
|
||||
|
||||
@@ -65,7 +65,30 @@ Aquí usamos <a href="https://docs.python.org/3/library/time.html#time.perf_coun
|
||||
|
||||
///
|
||||
|
||||
## Otros middlewares
|
||||
## Orden de ejecución con múltiples middlewares { #multiple-middleware-execution-order }
|
||||
|
||||
Cuando añades múltiples middlewares usando ya sea el decorador `@app.middleware()` o el método `app.add_middleware()`, cada nuevo middleware envuelve la aplicación, formando un stack. El último middleware añadido es el más externo, y el primero es el más interno.
|
||||
|
||||
En el camino de la request, el middleware más externo se ejecuta primero.
|
||||
|
||||
En el camino de la response, se ejecuta al final.
|
||||
|
||||
Por ejemplo:
|
||||
|
||||
```Python
|
||||
app.add_middleware(MiddlewareA)
|
||||
app.add_middleware(MiddlewareB)
|
||||
```
|
||||
|
||||
Esto da como resultado el siguiente orden de ejecución:
|
||||
|
||||
* **Request**: MiddlewareB → MiddlewareA → ruta
|
||||
|
||||
* **Response**: ruta → MiddlewareA → MiddlewareB
|
||||
|
||||
Este comportamiento de apilamiento asegura que los middlewares se ejecuten en un orden predecible y controlable.
|
||||
|
||||
## Otros middlewares { #other-middlewares }
|
||||
|
||||
Más adelante puedes leer sobre otros middlewares en la [Guía del Usuario Avanzado: Middleware Avanzado](../advanced/middleware.md){.internal-link target=_blank}.
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Parámetros de Path y Validaciones Numéricas
|
||||
# Parámetros de Path y Validaciones Numéricas { #path-parameters-and-numeric-validations }
|
||||
|
||||
De la misma manera que puedes declarar más validaciones y metadatos para los parámetros de query con `Query`, puedes declarar el mismo tipo de validaciones y metadatos para los parámetros de path con `Path`.
|
||||
|
||||
## Importar Path
|
||||
## Importar Path { #import-path }
|
||||
|
||||
Primero, importa `Path` de `fastapi`, e importa `Annotated`:
|
||||
|
||||
@@ -18,7 +18,7 @@ Asegúrate de [Actualizar la versión de FastAPI](../deployment/versions.md#upgr
|
||||
|
||||
///
|
||||
|
||||
## Declarar metadatos
|
||||
## Declarar metadatos { #declare-metadata }
|
||||
|
||||
Puedes declarar todos los mismos parámetros que para `Query`.
|
||||
|
||||
@@ -32,7 +32,7 @@ Un parámetro de path siempre es requerido ya que tiene que formar parte del pat
|
||||
|
||||
///
|
||||
|
||||
## Ordena los parámetros como necesites
|
||||
## Ordena los parámetros como necesites { #order-the-parameters-as-you-need }
|
||||
|
||||
/// tip | Consejo
|
||||
|
||||
@@ -60,7 +60,7 @@ Pero ten en cuenta que si usas `Annotated`, no tendrás este problema, no import
|
||||
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py *}
|
||||
|
||||
## Ordena los parámetros como necesites, trucos
|
||||
## Ordena los parámetros como necesites, trucos { #order-the-parameters-as-you-need-tricks }
|
||||
|
||||
/// tip | Consejo
|
||||
|
||||
@@ -85,13 +85,13 @@ Python no hará nada con ese `*`, pero sabrá que todos los parámetros siguient
|
||||
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial003.py hl[7] *}
|
||||
|
||||
### Mejor con `Annotated`
|
||||
### Mejor con `Annotated` { #better-with-annotated }
|
||||
|
||||
Ten en cuenta que si usas `Annotated`, como no estás usando valores por defecto de los parámetros de la función, no tendrás este problema y probablemente no necesitarás usar `*`.
|
||||
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py hl[10] *}
|
||||
|
||||
## Validaciones numéricas: mayor o igual
|
||||
## Validaciones numéricas: mayor o igual { #number-validations-greater-than-or-equal }
|
||||
|
||||
Con `Query` y `Path` (y otros que verás más adelante) puedes declarar restricciones numéricas.
|
||||
|
||||
@@ -99,7 +99,7 @@ Aquí, con `ge=1`, `item_id` necesitará ser un número entero "`g`reater than o
|
||||
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py hl[10] *}
|
||||
|
||||
## Validaciones numéricas: mayor que y menor o igual
|
||||
## Validaciones numéricas: mayor que y menor o igual { #number-validations-greater-than-and-less-than-or-equal }
|
||||
|
||||
Lo mismo aplica para:
|
||||
|
||||
@@ -108,19 +108,19 @@ Lo mismo aplica para:
|
||||
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py hl[10] *}
|
||||
|
||||
## Validaciones numéricas: flotantes, mayor y menor
|
||||
## Validaciones numéricas: flotantes, mayor y menor { #number-validations-floats-greater-than-and-less-than }
|
||||
|
||||
Las validaciones numéricas también funcionan para valores `float`.
|
||||
|
||||
Aquí es donde se convierte en importante poder declarar <abbr title="greater than"><code>gt</code></abbr> y no solo <abbr title="greater than or equal"><code>ge</code></abbr>. Ya que con esto puedes requerir, por ejemplo, que un valor sea mayor que `0`, incluso si es menor que `1`.
|
||||
Aquí es donde se convierte en importante poder declarar <abbr title="greater than – mayor que"><code>gt</code></abbr> y no solo <abbr title="greater than or equal – mayor o igual que"><code>ge</code></abbr>. Ya que con esto puedes requerir, por ejemplo, que un valor sea mayor que `0`, incluso si es menor que `1`.
|
||||
|
||||
Así, `0.5` sería un valor válido. Pero `0.0` o `0` no lo serían.
|
||||
|
||||
Y lo mismo para <abbr title="less than"><code>lt</code></abbr>.
|
||||
Y lo mismo para <abbr title="less than – menor que"><code>lt</code></abbr>.
|
||||
|
||||
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py hl[13] *}
|
||||
|
||||
## Resumen
|
||||
## Resumen { #recap }
|
||||
|
||||
Con `Query`, `Path` (y otros que aún no has visto) puedes declarar metadatos y validaciones de string de las mismas maneras que con [Parámetros de Query y Validaciones de String](query-params-str-validations.md){.internal-link target=_blank}.
|
||||
|
||||
@@ -139,7 +139,7 @@ Todas ellas comparten los mismos parámetros para validación adicional y metada
|
||||
|
||||
///
|
||||
|
||||
/// note | Nota técnica
|
||||
/// note | Detalles técnicos
|
||||
|
||||
Cuando importas `Query`, `Path` y otros de `fastapi`, en realidad son funciones.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Parámetros de Path
|
||||
# Parámetros de Path { #path-parameters }
|
||||
|
||||
Puedes declarar "parámetros" o "variables" de path con la misma sintaxis que se usa en los format strings de Python:
|
||||
|
||||
@@ -12,7 +12,7 @@ Así que, si ejecutas este ejemplo y vas a <a href="http://127.0.0.1:8000/items/
|
||||
{"item_id":"foo"}
|
||||
```
|
||||
|
||||
## Parámetros de path con tipos
|
||||
## Parámetros de path con tipos { #path-parameters-with-types }
|
||||
|
||||
Puedes declarar el tipo de un parámetro de path en la función, usando anotaciones de tipos estándar de Python:
|
||||
|
||||
@@ -26,7 +26,7 @@ Esto te dará soporte del editor dentro de tu función, con chequeo de errores,
|
||||
|
||||
///
|
||||
|
||||
## Conversión de datos
|
||||
## <abbr title="también conocido como: serialización, parsing, marshalling">Conversión</abbr> de datos { #data-conversion }
|
||||
|
||||
Si ejecutas este ejemplo y abres tu navegador en <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>, verás un response de:
|
||||
|
||||
@@ -38,11 +38,11 @@ Si ejecutas este ejemplo y abres tu navegador en <a href="http://127.0.0.1:8000/
|
||||
|
||||
Nota que el valor que tu función recibió (y devolvió) es `3`, como un `int` de Python, no un string `"3"`.
|
||||
|
||||
Entonces, con esa declaración de tipo, **FastAPI** te ofrece <abbr title="converting the string that comes from an HTTP request into Python data">"parsing"</abbr> automático de requests.
|
||||
Entonces, con esa declaración de tipo, **FastAPI** te ofrece <abbr title="convertir el string que viene de un request HTTP en datos de Python">"parsing"</abbr> automático de request.
|
||||
|
||||
///
|
||||
|
||||
## Validación de datos
|
||||
## Validación de datos { #data-validation }
|
||||
|
||||
Pero si vas al navegador en <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, verás un bonito error HTTP de:
|
||||
|
||||
@@ -76,7 +76,7 @@ Esto es increíblemente útil mientras desarrollas y depuras código que interac
|
||||
|
||||
///
|
||||
|
||||
## Documentación
|
||||
## Documentación { #documentation }
|
||||
|
||||
Y cuando abras tu navegador en <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>, verás una documentación de API automática e interactiva como:
|
||||
|
||||
@@ -90,7 +90,7 @@ Nota que el parámetro de path está declarado como un entero.
|
||||
|
||||
///
|
||||
|
||||
## Beneficios basados en estándares, documentación alternativa
|
||||
## Beneficios basados en estándares, documentación alternativa { #standards-based-benefits-alternative-documentation }
|
||||
|
||||
Y porque el esquema generado es del estándar <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md" class="external-link" target="_blank">OpenAPI</a>, hay muchas herramientas compatibles.
|
||||
|
||||
@@ -100,7 +100,7 @@ Debido a esto, el propio **FastAPI** proporciona una documentación de API alter
|
||||
|
||||
De la misma manera, hay muchas herramientas compatibles. Incluyendo herramientas de generación de código para muchos lenguajes.
|
||||
|
||||
## Pydantic
|
||||
## Pydantic { #pydantic }
|
||||
|
||||
Toda la validación de datos se realiza internamente con <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>, así que obtienes todos los beneficios de esta. Y sabes que estás en buenas manos.
|
||||
|
||||
@@ -108,7 +108,7 @@ Puedes usar las mismas declaraciones de tipo con `str`, `float`, `bool` y muchos
|
||||
|
||||
Varios de estos se exploran en los siguientes capítulos del tutorial.
|
||||
|
||||
## El orden importa
|
||||
## El orden importa { #order-matters }
|
||||
|
||||
Al crear *path operations*, puedes encontrarte en situaciones donde tienes un path fijo.
|
||||
|
||||
@@ -128,11 +128,11 @@ De manera similar, no puedes redefinir una path operation:
|
||||
|
||||
La primera siempre será utilizada ya que el path coincide primero.
|
||||
|
||||
## Valores predefinidos
|
||||
## 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 <abbr title="Enumeration">`Enum`</abbr> 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 <abbr title="Enumeration – Enumeración">`Enum`</abbr> estándar de Python.
|
||||
|
||||
### Crear una clase `Enum`
|
||||
### Crear una clase `Enum` { #create-an-enum-class }
|
||||
|
||||
Importa `Enum` y crea una subclase que herede de `str` y de `Enum`.
|
||||
|
||||
@@ -154,29 +154,29 @@ Si te estás preguntando, "AlexNet", "ResNet" y "LeNet" son solo nombres de <abb
|
||||
|
||||
///
|
||||
|
||||
### Declarar un *path parameter*
|
||||
### Declarar un *path parameter* { #declare-a-path-parameter }
|
||||
|
||||
Luego crea un *path parameter* con una anotación de tipo usando la clase enum que creaste (`ModelName`):
|
||||
|
||||
{* ../../docs_src/path_params/tutorial005.py hl[16] *}
|
||||
|
||||
### Revisa la documentación
|
||||
### Revisa la documentación { #check-the-docs }
|
||||
|
||||
Como los valores disponibles para el *path parameter* están predefinidos, la documentación interactiva puede mostrarlos de manera ordenada:
|
||||
|
||||
<img src="/img/tutorial/path-params/image03.png">
|
||||
|
||||
### Trabajando con *enumeraciones* de Python
|
||||
### Trabajando con *enumeraciones* de Python { #working-with-python-enumerations }
|
||||
|
||||
El valor del *path parameter* será un *miembro* de enumeración.
|
||||
|
||||
#### Comparar *miembros* de enumeraciones
|
||||
#### Comparar *miembros* de enumeraciones { #compare-enumeration-members }
|
||||
|
||||
Puedes compararlo con el *miembro* de enumeración en tu enum creada `ModelName`:
|
||||
|
||||
{* ../../docs_src/path_params/tutorial005.py hl[17] *}
|
||||
|
||||
#### Obtener el valor de *enumeración*
|
||||
#### Obtener el valor de *enumeración* { #get-the-enumeration-value }
|
||||
|
||||
Puedes obtener el valor actual (un `str` en este caso) usando `model_name.value`, o en general, `your_enum_member.value`:
|
||||
|
||||
@@ -188,7 +188,7 @@ También podrías acceder al valor `"lenet"` con `ModelName.lenet.value`.
|
||||
|
||||
///
|
||||
|
||||
#### Devolver *miembros* de enumeración
|
||||
#### Devolver *miembros* de enumeración { #return-enumeration-members }
|
||||
|
||||
Puedes devolver *miembros de enum* desde tu *path operation*, incluso anidados en un cuerpo JSON (por ejemplo, un `dict`).
|
||||
|
||||
@@ -205,7 +205,7 @@ En tu cliente recibirás un response JSON como:
|
||||
}
|
||||
```
|
||||
|
||||
## Parámetros de path conteniendo paths
|
||||
## Parámetros de path conteniendo paths { #path-parameters-containing-paths }
|
||||
|
||||
Imaginemos que tienes una *path operation* con un path `/files/{file_path}`.
|
||||
|
||||
@@ -213,7 +213,7 @@ Pero necesitas que `file_path` en sí mismo contenga un *path*, como `home/johnd
|
||||
|
||||
Entonces, la URL para ese archivo sería algo como: `/files/home/johndoe/myfile.txt`.
|
||||
|
||||
### Soporte de OpenAPI
|
||||
### Soporte de OpenAPI { #openapi-support }
|
||||
|
||||
OpenAPI no soporta una manera de declarar un *path parameter* para que contenga un *path* dentro, ya que eso podría llevar a escenarios que son difíciles de probar y definir.
|
||||
|
||||
@@ -221,7 +221,7 @@ Sin embargo, todavía puedes hacerlo en **FastAPI**, usando una de las herramien
|
||||
|
||||
Y la documentación seguiría funcionando, aunque no agregue ninguna documentación indicando que el parámetro debe contener un path.
|
||||
|
||||
### Convertidor de Path
|
||||
### Convertidor de Path { #path-convertor }
|
||||
|
||||
Usando una opción directamente de Starlette puedes declarar un *path parameter* conteniendo un *path* usando una URL como:
|
||||
|
||||
@@ -243,12 +243,12 @@ En ese caso, la URL sería: `/files//home/johndoe/myfile.txt`, con una doble bar
|
||||
|
||||
///
|
||||
|
||||
## Resumen
|
||||
## Resumen { #recap }
|
||||
|
||||
Con **FastAPI**, al usar declaraciones de tipo estándar de Python, cortas e intuitivas, obtienes:
|
||||
|
||||
* Soporte del editor: chequeo de errores, autocompletado, etc.
|
||||
* "<abbr title="converting the string that comes from an HTTP request into Python data">parsing</abbr>" de datos
|
||||
* "<abbr title="convertir el string que viene de un request HTTP en datos de Python">parsing</abbr>" de datos
|
||||
* Validación de datos
|
||||
* Anotación de API y documentación automática
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Parámetros de Query
|
||||
# Parámetros de Query { #query-parameters }
|
||||
|
||||
Cuando declaras otros parámetros de función que no son parte de los parámetros de path, son automáticamente interpretados como parámetros de "query".
|
||||
|
||||
@@ -24,11 +24,11 @@ Pero cuando los declaras con tipos de Python (en el ejemplo anterior, como `int`
|
||||
Todo el mismo proceso que se aplica para los parámetros de path también se aplica para los parámetros de query:
|
||||
|
||||
* Soporte del editor (obviamente)
|
||||
* <abbr title="convirtiendo el string que viene de un request HTTP en datos de Python">"Parsing"</abbr> de datos
|
||||
* <abbr title="convirtiendo el string que viene de un request HTTP en datos de Python">"parsing"</abbr> de datos
|
||||
* Validación de datos
|
||||
* Documentación automática
|
||||
|
||||
## Valores por defecto
|
||||
## Valores por defecto { #defaults }
|
||||
|
||||
Como los parámetros de query no son una parte fija de un path, pueden ser opcionales y pueden tener valores por defecto.
|
||||
|
||||
@@ -57,19 +57,21 @@ Los valores de los parámetros en tu función serán:
|
||||
* `skip=20`: porque lo configuraste en la URL
|
||||
* `limit=10`: porque ese era el valor por defecto
|
||||
|
||||
## Parámetros opcionales
|
||||
## Parámetros opcionales { #optional-parameters }
|
||||
|
||||
De la misma manera, puedes declarar parámetros de query opcionales, estableciendo su valor por defecto en `None`:
|
||||
|
||||
{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
|
||||
|
||||
En este caso, el parámetro de función `q` será opcional y será `None` por defecto.
|
||||
|
||||
/// check | Revisa
|
||||
|
||||
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.
|
||||
|
||||
///
|
||||
|
||||
## Conversión de tipos en parámetros de query
|
||||
## Conversión de tipos en parámetros de query { #query-parameter-type-conversion }
|
||||
|
||||
También puedes declarar tipos `bool`, y serán convertidos:
|
||||
|
||||
@@ -107,7 +109,7 @@ http://127.0.0.1:8000/items/foo?short=yes
|
||||
|
||||
o cualquier otra variación (mayúsculas, primera letra en mayúscula, etc.), tu función verá el parámetro `short` con un valor `bool` de `True`. De lo contrario, será `False`.
|
||||
|
||||
## Múltiples parámetros de path y de query
|
||||
## Múltiples parámetros de path y de query { #multiple-path-and-query-parameters }
|
||||
|
||||
Puedes declarar múltiples parámetros de path y de query al mismo tiempo, **FastAPI** sabe cuál es cuál.
|
||||
|
||||
@@ -117,7 +119,7 @@ Serán detectados por nombre:
|
||||
|
||||
{* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *}
|
||||
|
||||
## Parámetros de query requeridos
|
||||
## Parámetros de query requeridos { #required-query-parameters }
|
||||
|
||||
Cuando declaras un valor por defecto para parámetros que no son de path (por ahora, solo hemos visto parámetros de query), entonces no es requerido.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Seguridad
|
||||
# Seguridad { #security }
|
||||
|
||||
Hay muchas formas de manejar la seguridad, autenticación y autorización.
|
||||
|
||||
@@ -10,11 +10,11 @@ En muchos frameworks y sistemas, solo manejar la seguridad y autenticación requ
|
||||
|
||||
Pero primero, vamos a revisar algunos pequeños conceptos.
|
||||
|
||||
## ¿Con prisa?
|
||||
## ¿Con prisa? { #in-a-hurry }
|
||||
|
||||
Si no te importan ninguno de estos términos y solo necesitas agregar seguridad con autenticación basada en nombre de usuario y contraseña *ahora mismo*, salta a los siguientes capítulos.
|
||||
|
||||
## OAuth2
|
||||
## OAuth2 { #oauth2 }
|
||||
|
||||
OAuth2 es una especificación que define varias maneras de manejar la autenticación y autorización.
|
||||
|
||||
@@ -24,7 +24,7 @@ Incluye formas de autenticarse usando un "tercero".
|
||||
|
||||
Eso es lo que todos los sistemas con "iniciar sesión con Facebook, Google, X (Twitter), GitHub" utilizan internamente.
|
||||
|
||||
### OAuth 1
|
||||
### OAuth 1 { #oauth-1 }
|
||||
|
||||
Hubo un OAuth 1, que es muy diferente de OAuth2, y más complejo, ya que incluía especificaciones directas sobre cómo encriptar la comunicación.
|
||||
|
||||
@@ -38,7 +38,7 @@ En la sección sobre **deployment** verás cómo configurar HTTPS de forma gratu
|
||||
|
||||
///
|
||||
|
||||
## OpenID Connect
|
||||
## OpenID Connect { #openid-connect }
|
||||
|
||||
OpenID Connect es otra especificación, basada en **OAuth2**.
|
||||
|
||||
@@ -48,7 +48,7 @@ Por ejemplo, el login de Google usa OpenID Connect (que internamente usa OAuth2)
|
||||
|
||||
Pero el login de Facebook no soporta OpenID Connect. Tiene su propia versión de OAuth2.
|
||||
|
||||
### OpenID (no "OpenID Connect")
|
||||
### OpenID (no "OpenID Connect") { #openid-not-openid-connect }
|
||||
|
||||
Hubo también una especificación "OpenID". Que intentaba resolver lo mismo que **OpenID Connect**, pero no estaba basada en OAuth2.
|
||||
|
||||
@@ -56,7 +56,7 @@ Entonces, era un sistema completo adicional.
|
||||
|
||||
No es muy popular o usado hoy en día.
|
||||
|
||||
## OpenAPI
|
||||
## OpenAPI { #openapi }
|
||||
|
||||
OpenAPI (anteriormente conocido como Swagger) es la especificación abierta para construir APIs (ahora parte de la Linux Foundation).
|
||||
|
||||
@@ -96,7 +96,7 @@ El problema más complejo es construir un proveedor de autenticación/autorizaci
|
||||
|
||||
///
|
||||
|
||||
## Utilidades de **FastAPI**
|
||||
## Utilidades de **FastAPI** { #fastapi-utilities }
|
||||
|
||||
FastAPI proporciona varias herramientas para cada uno de estos esquemas de seguridad en el módulo `fastapi.security` que simplifican el uso de estos mecanismos de seguridad.
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Archivos Estáticos
|
||||
# Archivos Estáticos { #static-files }
|
||||
|
||||
Puedes servir archivos estáticos automáticamente desde un directorio utilizando `StaticFiles`.
|
||||
|
||||
## Usa `StaticFiles`
|
||||
## Usa `StaticFiles` { #use-staticfiles }
|
||||
|
||||
* Importa `StaticFiles`.
|
||||
* "Monta" una instance de `StaticFiles()` en un path específico.
|
||||
@@ -17,7 +17,7 @@ También podrías usar `from starlette.staticfiles import StaticFiles`.
|
||||
|
||||
///
|
||||
|
||||
### Qué es "Montar"
|
||||
### Qué es "Montar" { #what-is-mounting }
|
||||
|
||||
"Montar" significa agregar una aplicación completa "independiente" en un path específico, que luego se encargará de manejar todos los sub-paths.
|
||||
|
||||
@@ -25,7 +25,7 @@ Esto es diferente a usar un `APIRouter`, ya que una aplicación montada es compl
|
||||
|
||||
Puedes leer más sobre esto en la [Guía de Usuario Avanzada](../advanced/index.md){.internal-link target=_blank}.
|
||||
|
||||
## Detalles
|
||||
## Detalles { #details }
|
||||
|
||||
El primer `"/static"` se refiere al sub-path en el que esta "sub-aplicación" será "montada". Por lo tanto, cualquier path que comience con `"/static"` será manejado por ella.
|
||||
|
||||
@@ -35,6 +35,6 @@ El `name="static"` le da un nombre que puede ser utilizado internamente por **Fa
|
||||
|
||||
Todos estos parámetros pueden ser diferentes a "`static`", ajústalos según las necesidades y detalles específicos de tu propia aplicación.
|
||||
|
||||
## Más info
|
||||
## Más info { #more-info }
|
||||
|
||||
Para más detalles y opciones revisa <a href="https://www.starlette.dev/staticfiles/" class="external-link" target="_blank">la documentación de Starlette sobre Archivos Estáticos</a>.
|
||||
Reference in new issue
Block a user