committed by
GitHub
2 changed files with 198 additions and 0 deletions
@ -0,0 +1,197 @@ |
|||||
|
# Parámetros de query |
||||
|
|
||||
|
Cuando declaras otros parámetros de la función que no hacen parte de los parámetros de path estos se interpretan automáticamente como parámetros de "query". |
||||
|
|
||||
|
```Python hl_lines="9" |
||||
|
{!../../../docs_src/query_params/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
El query es el conjunto de pares de key-value que van después del `?` en la URL, separados por caracteres `&`. |
||||
|
|
||||
|
Por ejemplo, en la URL: |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/?skip=0&limit=10 |
||||
|
``` |
||||
|
|
||||
|
...los parámetros de query son: |
||||
|
|
||||
|
* `skip`: con un valor de `0` |
||||
|
* `limit`: con un valor de `10` |
||||
|
|
||||
|
Dado que son parte de la URL son strings "naturalmente". |
||||
|
|
||||
|
Pero cuando los declaras con tipos de Python (en el ejemplo arriba, como `int`) son convertidos a ese tipo y son validados con él. |
||||
|
|
||||
|
Todo el proceso que aplicaba a los parámetros de path también aplica a los parámetros de query: |
||||
|
|
||||
|
* Soporte del editor (obviamente) |
||||
|
* <abbr title="convertir el string que viene de un HTTP request a datos de Python">"Parsing"</abbr> de datos |
||||
|
* Validación de datos |
||||
|
* Documentación automática |
||||
|
|
||||
|
## Configuraciones por defecto |
||||
|
|
||||
|
Como los parámetros de query no están fijos en una parte del path pueden ser opcionales y pueden tener valores por defecto. |
||||
|
|
||||
|
El ejemplo arriba tiene `skip=0` y `limit=10` como los valores por defecto. |
||||
|
|
||||
|
Entonces, si vas a la URL: |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/ |
||||
|
``` |
||||
|
|
||||
|
Sería lo mismo que ir a: |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/?skip=0&limit=10 |
||||
|
``` |
||||
|
|
||||
|
Pero, si por ejemplo vas a: |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/?skip=20 |
||||
|
``` |
||||
|
|
||||
|
Los valores de los parámetros en tu función serán: |
||||
|
|
||||
|
* `skip=20`: porque lo definiste en la URL |
||||
|
* `limit=10`: porque era el valor por defecto |
||||
|
|
||||
|
## Parámetros opcionales |
||||
|
|
||||
|
Del mismo modo puedes declarar parámetros de query opcionales definiendo el valor por defecto como `None`: |
||||
|
|
||||
|
```Python hl_lines="9" |
||||
|
{!../../../docs_src/query_params/tutorial002.py!} |
||||
|
``` |
||||
|
|
||||
|
En este caso el parámetro de la función `q` será opcional y será `None` por defecto. |
||||
|
|
||||
|
!!! check "Revisa" |
||||
|
También puedes notar que **FastAPI** es lo suficientemente inteligente para darse cuenta de que el parámetro de path `item_id` es un parámetro de path y que `q` no lo es, y por lo tanto es un parámetro de query. |
||||
|
|
||||
|
!!! note "Nota" |
||||
|
FastAPI sabrá que `q` es opcional por el `= None`. |
||||
|
|
||||
|
El `Optional` en `Optional[str]` no es usado por FastAPI (FastAPI solo usará la parte `str`), pero el `Optional[str]` le permitirá a tu editor ayudarte a encontrar errores en tu código. |
||||
|
|
||||
|
## Conversión de tipos de parámetros de query |
||||
|
|
||||
|
También puedes declarar tipos `bool` y serán convertidos: |
||||
|
|
||||
|
```Python hl_lines="9" |
||||
|
{!../../../docs_src/query_params/tutorial003.py!} |
||||
|
``` |
||||
|
|
||||
|
En este caso, si vas a: |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/foo?short=1 |
||||
|
``` |
||||
|
|
||||
|
o |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/foo?short=True |
||||
|
``` |
||||
|
|
||||
|
o |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/foo?short=true |
||||
|
``` |
||||
|
|
||||
|
o |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/foo?short=on |
||||
|
``` |
||||
|
|
||||
|
o |
||||
|
|
||||
|
``` |
||||
|
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`. Si no, lo verá como `False`. |
||||
|
|
||||
|
## Múltiples parámetros de path y query |
||||
|
|
||||
|
Puedes declarar múltiples parámetros de path y parámetros de query al mismo tiempo. **FastAPI** sabe cuál es cuál. |
||||
|
|
||||
|
No los tienes que declarar en un orden específico. |
||||
|
|
||||
|
Serán detectados por nombre: |
||||
|
|
||||
|
```Python hl_lines="8 10" |
||||
|
{!../../../docs_src/query_params/tutorial004.py!} |
||||
|
``` |
||||
|
|
||||
|
## Parámetros de query requeridos |
||||
|
|
||||
|
Cuando declaras un valor por defecto para los parámetros que no son de path (por ahora solo hemos visto parámetros de query), entonces no es requerido. |
||||
|
|
||||
|
Si no quieres añadir un valor específico sino solo hacerlo opcional, pon el valor por defecto como `None`. |
||||
|
|
||||
|
Pero cuando quieres hacer que un parámetro de query sea requerido, puedes simplemente no declararle un valor por defecto: |
||||
|
|
||||
|
```Python hl_lines="6-7" |
||||
|
{!../../../docs_src/query_params/tutorial005.py!} |
||||
|
``` |
||||
|
|
||||
|
Aquí el parámetro de query `needy` es un parámetro de query requerido, del tipo `str`. |
||||
|
|
||||
|
Si abres tu navegador en una URL como: |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/foo-item |
||||
|
``` |
||||
|
|
||||
|
...sin añadir el parámetro `needy` requerido, verás un error como: |
||||
|
|
||||
|
```JSON |
||||
|
{ |
||||
|
"detail": [ |
||||
|
{ |
||||
|
"loc": [ |
||||
|
"query", |
||||
|
"needy" |
||||
|
], |
||||
|
"msg": "field required", |
||||
|
"type": "value_error.missing" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
Dado que `needy` es un parámetro requerido necesitarías declararlo en la URL: |
||||
|
|
||||
|
``` |
||||
|
http://127.0.0.1:8000/items/foo-item?needy=sooooneedy |
||||
|
``` |
||||
|
|
||||
|
...esto funcionaría: |
||||
|
|
||||
|
```JSON |
||||
|
{ |
||||
|
"item_id": "foo-item", |
||||
|
"needy": "sooooneedy" |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
Por supuesto que también puedes definir algunos parámetros como requeridos, con un valor por defecto y otros completamente opcionales: |
||||
|
|
||||
|
```Python hl_lines="10" |
||||
|
{!../../../docs_src/query_params/tutorial006.py!} |
||||
|
``` |
||||
|
|
||||
|
En este caso hay 3 parámetros de query: |
||||
|
|
||||
|
* `needy`, un `str` requerido. |
||||
|
* `skip`, un `int` con un valor por defecto de `0`. |
||||
|
* `limit`, un `int` opcional. |
||||
|
|
||||
|
!!! tip "Consejo" |
||||
|
También podrías usar los `Enum`s de la misma manera que con los [Parámetros de path](path-params.md#predefined-values){.internal-link target=_blank}. |
Loading…
Reference in new issue