0% encontró este documento útil (0 votos)
18 vistas20 páginas

Validación de Parámetros en FastAPI

FastAPI permite declarar validaciones y metadatos para parámetros de consulta, como establecer longitudes máximas y mínimas, así como patrones de expresión regular. Se recomienda usar Annotated para agregar estas validaciones, facilitando la documentación y asegurando la coherencia en el uso de parámetros. También se pueden implementar validaciones personalizadas mediante AfterValidator para casos específicos que no se cubren con las validaciones estándar.

Cargado por

Alexandra
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
18 vistas20 páginas

Validación de Parámetros en FastAPI

FastAPI permite declarar validaciones y metadatos para parámetros de consulta, como establecer longitudes máximas y mínimas, así como patrones de expresión regular. Se recomienda usar Annotated para agregar estas validaciones, facilitando la documentación y asegurando la coherencia en el uso de parámetros. También se pueden implementar validaciones personalizadas mediante AfterValidator para casos específicos que no se cubren con las validaciones estándar.

Cargado por

Alexandra
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

PARÁMETROS DE CONSULTA Y VALIDACIONES DE CADENAS

FastAPI le permite declarar información adicional y validación para sus


parámetros.

Tomemos esta aplicación como ejemplo:

El parámetro de consulta q es de tipo str | None, lo que significa que es


de tipo str pero también podría ser None, y, de hecho, el valor
predeterminado es None, por lo que FastAPI sabrá que no es necesario.

VALIDACIÓN ADICIONAL

Vamos a hacer cumplir que, aunque q sea opcional, siempre que se


proporcione, su longitud no exceda los 50 caracteres.

Importar Query y Annotated

Para lograrlo, primero importe:

 Query de fastapi
 Annotated de typing
Úselo Annotated en el tipo para el q parámetro

¿Recuerdas que te dije antes que Annotated se puede usar para


agregar metadatos a tus parámetros en la Introducción a los tipos de
Python?

Ahora es el momento de usarlo con FastAPI.

Teníamos este tipo de anotación:

Lo que haremos es envolverlo con Annotated, por lo que se convierte


en:

Ambas versiones significan lo mismo, q es un parámetro que puede ser


un str o None, y por defecto es None.

Ahora pasemos a la parte divertida.

Añadir al parámetro Query Annotated q

Ahora que tenemos este Annotated lugar donde podemos poner más
información (en este caso alguna validación adicional),
agregamos Query dentro de Annotated y establecemos el
parámetro max_length en 50:

Tenga en cuenta que el valor predeterminado sigue siendo None, por lo


que el parámetro sigue siendo opcional.

Pero ahora, teniendo Query(max_length=50) dentro de Annotated, le


estamos diciendo a FastAPI que queremos que tenga una validación
adicional para este valor, queremos que tenga un máximo de 50
caracteres.

FastAPI ahora:

 Validar los datos asegurándose de que la longitud máxima sea de


50 caracteres
 Mostrar un error claro para el cliente cuando los datos no son
válidos
 Documente el parámetro en la operación de ruta del esquema
OpenAPI (para que aparezca en la interfaz de usuario de
documentos automáticos)

Alternativa (antigua): Query como valor predeterminado

Las versiones anteriores de FastAPI (antes de 0.95.0) requerían que


usaras Query como valor predeterminado de tu parámetro, en lugar de
ponerlo en Annotated, hay muchas posibilidades de que veas código
usándolo, así que te lo explicaré.
Así es como lo usarías Query() como valor predeterminado del
parámetro de tu función, estableciendo el parámetro max_length en
50:

Como en este caso (sin usar Annotated) tenemos que reemplazar el


valor predeterminado None en la función con Query(), ahora
necesitamos establecer el valor predeterminado con el
parámetro Query(default=None), sirve para el mismo propósito de
definir ese valor predeterminado (al menos para FastAPI).

Query como valor predeterminado o en Annotated


Tenga en cuenta que al utilizar Query dentro de Annotated no puede
utilizar el default parámetro for Query.

En su lugar, utilice el valor predeterminado del parámetro de la función.


De lo contrario, sería incoherente.

Ventajas de Annotated

Annotated Se recomienda usar en lugar del valor predeterminado en


los parámetros de la función, es mejor por varias razones.

El valor predeterminado del parámetro de función es el


valor predeterminado real, lo cual es más intuitivo con Python en
general.

Podrías llamar a esa misma función en otros lugares sin FastAPI y


funcionaría correctamente. Si hay un parámetro obligatorio (sin valor
predeterminado), tu editor te lo notificará con un error. Python también
se quejará si lo ejecutas sin pasar el parámetro obligatorio.

Si no usas el estilo de valor predeterminado (antiguo) Annotated,


y en su lugar lo usas, si llamas a esa función sin FastAPI en otros
lugares, debes recordar pasarle los argumentos para que funcione
correctamente; de lo contrario, los valores serán diferentes a los
esperados (por ejemplo, o algo similar en lugar de [nombre faltante]). Tu
editor no se quejará al ejecutar esa función, y Python tampoco se
quejará al ejecutarla, solo cuando las operaciones internas generen un
error. QueryInfo str
Dado que Annotated puede tener más de una anotación de metadatos,
ahora puede incluso usar la misma función con otras herramientas,
como Mecanógrafo

AÑADIR MÁS VALIDACIONES

También puedes agregar un parámetro min_length:

Agregar expresiones regulares

Puede definir una expresión regular pattern con la que el parámetro


debe coincidir:
Este patrón de expresión regular específico verifica que el valor del
parámetro recibido:

 ^: comienza con los siguientes caracteres, no tiene caracteres


anteriores.
 Fixedquery: tiene el valor exacto fixedquery.
 $: termina ahí, no tiene más caracteres después de fixedquery.

Si te sientes perdido con todas estas ideas sobre expresiones


regulares, no te preocupes. Es un tema complejo para mucha gente.
Aún puedes hacer muchas cosas sin necesidad de usar expresiones
regulares.

Ahora ya sabes que siempre que los necesites podrás utilizarlos


en FastAPI.

Pydantic v1 regex en lugar de pattern

Antes de la versión 2 de Pydantic y antes de FastAPI 0.100.0, se


llamaba al parámetro regex en lugar de pattern, pero ahora está
obsoleto.

Aún puedes ver algo de código usándolo:


ero ten en cuenta que esto está obsoleto y debería actualizarse para
usar el nuevo parámetro pattern.

Valores predeterminados

Por supuesto, puedes utilizar valores predeterminados distintos de None.

Digamos que desea declarar que el q parámetro de consulta tenga


un min_length valor de 3 y un valor predeterminado de "fixedquery":

Parámetros requeridos
Cuando no necesitamos declarar más validaciones o metadatos,
podemos hacer que el q parámetro de consulta sea obligatorio
simplemente al no declarar un valor predeterminado, como:

Entonces, cuando necesitas declarar un valor como requerido mientras


usas Query, simplemente puedes no declarar un valor predeterminado:

Obligatorio, puede ser None

Puedes declarar que un parámetro acepta None, pero que sigue siendo
obligatorio. Esto obligaría a los clientes a enviar un valor, incluso si este
es None.

Para hacer eso, puede declarar que None es un tipo válido, pero
simplemente no declare un valor predeterminado:
LISTA DE PARÁMETROS DE CONSULTA / VALORES MÚLTIPLES

Cuando defines un parámetro de consulta explícitamente, Query


también puedes declararlo para recibir una lista de valores, o, dicho de
otra forma, para recibir múltiples valores.

Por ejemplo, para declarar un parámetro de consulta q que pueda


aparecer varias veces en la URL, puede escribir:

Luego, con una URL como:

Recibirías los valores de los múltiples parámetros de consulta q (foo y


bar) en una lista de Python dentro de tu función de operación de ruta,
en el parámetro de función q.

Entonces, la respuesta a esa URL sería:


Los documentos de la API interactiva se actualizarán en consecuencia
para permitir múltiples valores:
Lista de parámetros de consulta / valores múltiples con valores
predeterminados

También puede definir un list valor predeterminado si no se proporciona


ninguno:

Si vas a:

Usando solo list

También puedes utilizar list directamente en lugar de list[str]:


Declarar más metadatos

Puede agregar más información sobre el parámetro.

Esa información se incluirá en la OpenAPI generada y será utilizada por


las interfaces de usuario de la documentación y las herramientas
externas.

Puedes agregar un title:


Y un description:

Parámetros de alias

Imagina que quieres que el parámetro sea item-query.


Pero item-query no es un nombre de variable de Python válido.

Lo más cercano sería item_query. Pero aun así es necesario que sea
exactamente item-query...

Luego puedes declarar un alias, y ese alias es lo que se utilizará para


encontrar el valor del parámetro:

Parámetros en desuso

Ahora digamos que ya no te gusta este parámetro.

Debes dejarlo allí por un tiempo porque hay clientes que lo usan, pero
quieres que los documentos lo muestren claramente como obsoleto.

Luego pasa el parámetro deprecated=True a Query:


Los documentos lo mostrarán así:
Excluir parámetros de OpenAPI

Para excluir un parámetro de consulta del esquema OpenAPI generado


(y, por lo tanto, de los sistemas de documentación automática),
establezca el parámetro include_in_schemade Query en False:

Validación personalizada
Podría haber casos en los que necesite realizar alguna validación
personalizada que no se pueda realizar con los parámetros que se
muestran arriba.

En esos casos, puede utilizar una función de validación


personalizada que se aplique después de la validación normal (por
ejemplo, después de validar que el valor es a str).

Puedes lograrlo usando Pydantic's AfterValidator Dentro


de Annotated.

Por ejemplo, este validador personalizado verifica que el ID del artículo


comience con isbn-para un número de libro ISBN o con imdb- para un
ID de URL de película IMDB:
Entiende ese Código

Lo importante es usar AfterValidator una función dentro de


[nombre del archivo] Annotated.

Pero si tienes curiosidad sobre este ejemplo de código específico y aun


así te entretiene, aquí hay algunos detalles adicionales.

Cuerda con value.startswith()

¿Te diste cuenta? Una cadena que usa value.startswith() puede tomar
una tupla y verificará cada valor en la tupla:

Un artículo al azar

Con data.items() obtenemos un objeto iterable con tuplas que contienen


la clave y el valor de cada elemento del diccionario.

Convertimos este objeto iterable en uno propio list con list(data.items()).

Luego, con random.choice() podemos obtener un valor aleatorio de la


lista, por lo que obtenemos una tupla con (id, name). Será algo así
como ("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy").
Luego asignamos esos dos valores de la tupla a las variables id
y name.

Por lo tanto, si el usuario no proporcionó un ID de artículo, igualmente


recibirá una sugerencia aleatoria.

...hacemos todo esto en una sola línea simple. ¿No te encanta Python?

RESUMEN

Puede declarar validaciones y metadatos adicionales para sus


parámetros.

Validaciones genéricas y metadatos:

 alias
 title
 description
 deprecated

Validaciones específicas para cadenas:

 min_length
 max_length
 pattern

Validaciones personalizadas utilizando AfterValidator.

En estos ejemplos viste cómo declarar validaciones para str valores.

También podría gustarte