|
| 1 | +# Características |
| 2 | + |
| 3 | +## Características de FastAPI |
| 4 | + |
| 5 | +**FastAPI** te provee lo siguiente: |
| 6 | + |
| 7 | +### Basado en estándares abiertos |
| 8 | + |
| 9 | +* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> para la creación de APIs, incluyendo declaraciones de <abbr title="en español: ruta. En inglés también conocido cómo: endpoints, routes">path</abbr> <abbr title="también conocido como HTTP methods, cómo POST, GET, PUT, DELETE">operations</abbr>, parámetros, <abbr title="cuerpo del mensaje HTTP">body</abbr> requests, seguridad, etc. |
| 10 | +* Documentación automática del modelo de datos con <a href="http://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (dado que OpenAPI mismo está basado en JSON Schema). |
| 11 | +* Diseñado alrededor de estos estándares después de un estudio meticuloso. En vez de ser una capa añadida a último momento. |
| 12 | +* Esto también permite la **generación automática de código de cliente** para muchos lenguajes. |
| 13 | + |
| 14 | +### Documentación automática |
| 15 | + |
| 16 | +Documentación interactiva de la API e interfaces web de exploración. Hay múltiples opciones, dos incluídas por defecto, porque el framework está basado en OpenAPI. |
| 17 | + |
| 18 | +* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>, con exploración interactiva, llama y prueba tu API directamente desde tu navegador. |
| 19 | + |
| 20 | + |
| 21 | + |
| 22 | +* Documentación alternativa de la API con <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>. |
| 23 | + |
| 24 | + |
| 25 | + |
| 26 | +### Simplemente Python moderno |
| 27 | + |
| 28 | +Todo está basado en las declaraciones de tipo de **Python 3.6** estándar (gracias a Pydantic). No necesitas aprender una sintáxis nueva, solo Python moderno. |
| 29 | + |
| 30 | +Si necesitas un repaso de 2 minutos de cómo usar los tipos de Python (así no uses FastAPI) prueba el tutorial corto: [Python Types](python-types.md){.internal-link target=_blank}. |
| 31 | + |
| 32 | +Escribes Python estándar con tipos así: |
| 33 | + |
| 34 | +```Python |
| 35 | +from typing import List, Dict |
| 36 | +from datetime import date |
| 37 | + |
| 38 | +from pydantic import BaseModel |
| 39 | + |
| 40 | +# Declaras la variable como un str |
| 41 | +# y obtienes soporte del editor dentro de la función |
| 42 | +def main(user_id: str): |
| 43 | + return user_id |
| 44 | + |
| 45 | + |
| 46 | +# Un modelo de Pydantic |
| 47 | +class User(BaseModel): |
| 48 | + id: int |
| 49 | + name: str |
| 50 | + joined: date |
| 51 | +``` |
| 52 | + |
| 53 | +Este puede ser usado como: |
| 54 | + |
| 55 | +```Python |
| 56 | +my_user: User = User(id=3, name="John Doe", joined="2018-07-19") |
| 57 | + |
| 58 | +second_user_data = { |
| 59 | + "id": 4, |
| 60 | + "name": "Mary", |
| 61 | + "joined": "2018-11-30", |
| 62 | +} |
| 63 | + |
| 64 | +my_second_user: User = User(**second_user_data) |
| 65 | +``` |
| 66 | + |
| 67 | +!!! info |
| 68 | + `**second_user_data` significa: |
| 69 | + |
| 70 | + Pasa las <abbr title="en español key se refiere a la guía de un diccionario">keys</abbr> y los valores del dict `second_user_data` directamente como argumentos de key-value, equivalente a: `User(id=4, name="Mary", joined="2018-11-30")` |
| 71 | + |
| 72 | +### Soporte del editor |
| 73 | + |
| 74 | +El framework fue diseñado en su totalidad para ser fácil e intuitivo de usar. Todas las decisiones fueron probadas en múltiples editores antes de comenzar el desarrollo para asegurar la mejor experiencia de desarrollo. |
| 75 | + |
| 76 | +En la última encuesta a desarrolladores de Python fue claro que <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">la característica más usada es el "autocompletado"</a>. |
| 77 | + |
| 78 | +El framework **FastAPI** está creado para satisfacer eso. El autocompletado funciona en todas partes. |
| 79 | + |
| 80 | +No vas a tener que volver a la documentación seguido. |
| 81 | + |
| 82 | +Así es como tu editor te puede ayudar: |
| 83 | + |
| 84 | +* en <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>: |
| 85 | + |
| 86 | + |
| 87 | + |
| 88 | +* en <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>: |
| 89 | + |
| 90 | + |
| 91 | + |
| 92 | +Obtendrás completado para tu código que podrías haber considerado imposible antes. Por ejemplo, el key `price` dentro del JSON body (que podría haber estado anidado) que viene de un request. |
| 93 | + |
| 94 | +Ya no pasará que escribas los nombres de key equivocados, o que tengas que revisar constantemente la documentación o desplazarte arriba y abajo para saber si usaste `username` o `user_name`. |
| 95 | + |
| 96 | +### Corto |
| 97 | + |
| 98 | +Tiene **configuraciones por defecto** razonables para todo, con configuraciones opcionales en todas partes. Todos los parámetros pueden ser ajustados para tus necesidades y las de tu API. |
| 99 | + |
| 100 | +Pero, todo **simplemente funciona** por defecto. |
| 101 | + |
| 102 | +### Validación |
| 103 | + |
| 104 | +* Validación para la mayoría (¿o todos?) los **tipos de datos** de Python incluyendo: |
| 105 | + * Objetos JSON (`dict`). |
| 106 | + * JSON array (`list`) definiendo tipos de ítem. |
| 107 | + * Campos de texto (`str`) definiendo longitudes mínimas y máximas. |
| 108 | + * Números (`int`, `float`) con valores mínimos y máximos, etc. |
| 109 | + |
| 110 | +* Validación para tipos más exóticos como: |
| 111 | + * URL. |
| 112 | + * Email. |
| 113 | + * UUID. |
| 114 | + * ...y otros. |
| 115 | + |
| 116 | +Toda la validación es manejada por **Pydantic**, que es robusto y sólidamente establecido. |
| 117 | + |
| 118 | +### Seguridad y autenticación |
| 119 | + |
| 120 | +La seguridad y la autenticación están integradas. Sin ningún compromiso con bases de datos ni modelos de datos. |
| 121 | + |
| 122 | +Todos los schemes de seguridad están definidos en OpenAPI incluyendo: |
| 123 | + |
| 124 | +* HTTP Basic. |
| 125 | +* **OAuth2** (también con **JWT tokens**). Prueba el tutorial en [OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. |
| 126 | +* API keys en: |
| 127 | + * Headers. |
| 128 | + * Parámetros de Query. |
| 129 | + * Cookies, etc. |
| 130 | + |
| 131 | +Más todas las características de seguridad de Starlette (incluyendo **session cookies**). |
| 132 | + |
| 133 | +Todo ha sido construido como herramientas y componentes reutilizables que son fácilmente integrados con tus sistemas, almacenamiento de datos, bases de datos relacionales y no relacionales, etc. |
| 134 | + |
| 135 | +### Dependency Injection |
| 136 | + |
| 137 | +FastAPI incluye un sistema de <abbr title='En español: Inyección de Dependencias. También conocido en inglés cómo: "components", "resources", "services", "providers"'><strong>Dependency Injection</strong></abbr> extremadamente poderoso y fácil de usar. |
| 138 | + |
| 139 | +* Inclusive las dependencias pueden tener dependencias creando una jerarquía o un **"grafo" de dependencias**. |
| 140 | +* Todas son **manejadas automáticamente** por el framework. |
| 141 | +* Todas las dependencias pueden requerir datos de los requests y aumentar las restricciones del *path operation* y la documentación automática. |
| 142 | +* **Validación automática** inclusive para parámetros del *path operation* definidos en las dependencias. |
| 143 | +* Soporte para sistemas complejos de autenticación de usuarios, **conexiones con bases de datos**, etc. |
| 144 | +* **Sin comprometerse** con bases de datos, frontends, etc. Pero permitiendo integración fácil con todos ellos. |
| 145 | + |
| 146 | +### "Plug-ins" ilimitados |
| 147 | + |
| 148 | +O dicho de otra manera, no hay necesidad para "plug-ins". Importa y usa el código que necesites. |
| 149 | + |
| 150 | +Cualquier integración está diseñada para que sea tan sencilla de usar (con dependencias) que puedas crear un "plug-in" para tu aplicación en dos líneas de código usando la misma estructura y sintáxis que usaste para tus *path operations*. |
| 151 | + |
| 152 | +### Probado |
| 153 | + |
| 154 | +* <abbr title="La cantidad de código que es probado automáticamente">Cobertura de pruebas</abbr> al 100%. |
| 155 | +* Base de código 100% <abbr title="Type annotations de Python, con esto tu editor y otras herramientas externas pueden darte mejor soporte">anotada con tipos</abbr>. |
| 156 | +* Usado en aplicaciones en producción. |
| 157 | + |
| 158 | +## Características de Starlette |
| 159 | + |
| 160 | +**FastAPI** está basado y es completamente compatible con <a href="https://www.starlette.io/" class="external-link" target="_blank"><strong>Starlette</strong></a>. Tanto así, que cualquier código de Starlette que tengas también funcionará. |
| 161 | + |
| 162 | +`FastAPI` es realmente una sub-clase de `Starlette`. Así que, si ya conoces o usas Starlette, muchas de las características funcionarán de la misma manera. |
| 163 | + |
| 164 | +Con **FastAPI** obtienes todas las características de **Starlette** (porque FastAPI es simplemente Starlette en esteroides): |
| 165 | + |
| 166 | +* Desempeño realmente impresionante. Es uno <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank"> de los frameworks de Python más rápidos, a la par con **NodeJS** y **Go**</a>. |
| 167 | +* Soporte para **WebSocket**. |
| 168 | +* Soporte para **GraphQL**. |
| 169 | +* <abbr title="En español: tareas que se ejecutan en el fondo, sin frenar requests, en el mismo proceso. En ingles: In-process background tasks">Tareas en background</abbr>. |
| 170 | +* Eventos de startup y shutdown. |
| 171 | +* Cliente de pruebas construido con `requests`. |
| 172 | +* **CORS**, GZip, Static Files, Streaming responses. |
| 173 | +* Soporte para **Session and Cookie**. |
| 174 | +* Cobertura de pruebas al 100%. |
| 175 | +* Base de código 100% anotada con tipos. |
| 176 | + |
| 177 | +## Características de Pydantic |
| 178 | + |
| 179 | +**FastAPI** está basado y es completamente compatible con <a href="https://pydantic-docs.helpmanual.io" class="external-link" target="_blank"><strong>Pydantic</strong></a>. Tanto así, que cualquier código de Pydantic que tengas también funcionará. |
| 180 | + |
| 181 | +Esto incluye a librerías externas basadas en Pydantic como <abbr title="Object-Relational Mapper">ORM</abbr>s y <abbr title="Object-Document Mapper">ODM</abbr>s para bases de datos. |
| 182 | + |
| 183 | +Esto también significa que en muchos casos puedes pasar el mismo objeto que obtuviste de un request **directamente a la base de datos**, dado que todo es validado automáticamente. |
| 184 | + |
| 185 | +Lo mismo aplica para el sentido contrario. En muchos casos puedes pasarle el objeto que obtienes de la base de datos **directamente al cliente**. |
| 186 | + |
| 187 | +Con **FastAPI** obtienes todas las características de **Pydantic** (dado que FastAPI está basado en Pydantic para todo el manejo de datos): |
| 188 | + |
| 189 | +* **Sin dificultades para entender**: |
| 190 | + * No necesitas aprender un nuevo micro-lenguaje de definición de schemas. |
| 191 | + * Si sabes tipos de Python, sabes cómo usar Pydantic. |
| 192 | +* Interactúa bien con tu **<abbr title="en inglés: Integrated Development Environment, similar a editor de código">IDE</abbr>/<abbr title="Un programa que chequea errores en el código">linter</abbr>/cerebro**: |
| 193 | + * Porque las estructuras de datos de Pydantic son solo <abbr title='En español: ejemplares. Aunque a veces los llaman incorrectamente "instancias"'>instances</abbr> de clases que tu defines, el auto-completado, el linting, mypy y tu intuición deberían funcionar bien con tus datos validados. |
| 194 | +* **Rápido**: |
| 195 | + * En <a href="https://pydantic-docs.helpmanual.io/#benchmarks-tag" class="external-link" target="_blank">benchmarks</a> Pydantic es más rápido que todas las otras <abbr title='Herramienta, paquete. A veces llamado "librería"'>libraries</abbr> probadas. |
| 196 | +* Valida **estructuras complejas**: |
| 197 | + * Usa modelos jerárquicos de modelos de Pydantic, `typing` de Python, `List` y `Dict`, etc. |
| 198 | + * Los validadores también permiten que se definan fácil y claramente schemas complejos de datos. Estos son chequeados y documentados como JSON Schema. |
| 199 | + * Puedes tener objetos de **JSON profundamente anidados** y que todos sean validados y anotados. |
| 200 | +* **Extensible**: |
| 201 | + * Pydantic permite que se definan tipos de datos a la medida o puedes extender la validación con métodos en un modelo decorado con el <abbr title="en inglés: validator decorator"> decorador de validación</abbr>. |
| 202 | +* Cobertura de pruebas al 100%. |
0 commit comments