Red de conocimiento informático - Aprendizaje de programación - Lectura de código fuente FastAPI (1) aplicación ASGI

Lectura de código fuente FastAPI (1) aplicación ASGI

Este capítulo comienza con la lectura del código fuente de FastAPI. FastAPI es una nueva estrella en la web Python actual y un marco que hace época. Con la velocidad y la simplicidad como conceptos centrales, es un marco que hace época.

Hereda de Starlette, y se mejora y amplía en base a ella. Puedes leer más sobre esto en mi código fuente anterior.

openapi() y setup() son funciones que inicializan documentos OpenAPI durante la fase de inicialización.

Desde add_api_route() hasta trace(), todas son funciones sobre enrutamiento y son referencias directas a métodos de enrutador. Por lo tanto, al decodificar route.py, estas funciones se combinan.

Además de los parámetros nativos de Starlette, muchos parámetros están relacionados con la documentación de la API.

Se cambió el enrutamiento del Router de Starlette al nuevo APIRouter

Estos dos conceptos se entendieron consultando la documentación. Implican principalmente documentación y parámetros de proxy inverso. Cuando se utiliza un proxy inverso como Nginx, las rutas a las que se accede directamente desde Uvicorn y a las que se accede desde el proxy Nginx pueden ser inconsistentes. Por ejemplo, el directorio raíz de Fastapi en Nginx es 127.0.0.1/api/, mientras que la perspectiva de Uvicorn es 127.0.0.1:8000/. Para la interfaz API, esto en realidad no tiene ningún impacto ya que el servidor se encarga automáticamente de esto por nosotros. Pero cuando se trata de documentación API, hay un problema.

Porque cuando abrimos /docs, la página busca openapi.json. Escribe en html, no en cambios. ¿Qué problemas causa esto?

Por ejemplo, cuando accedemos a 127.0.0.1:8000/docs desde Uvicorn, buscará /openapi.json, lo que significa que accederá a 127.0.0.1:8000/openapi.json (para entender el frontend Para usuarios)

Pero si accedemos al documento desde fuera, por ejemplo, configuramos Nginx así. Supongamos que configuramos Nginx de esta manera:

Necesitamos acceder a 127.0.0.1/api/docs para poder acceder a él desde fuera del proxy. Al abrir documentos debemos buscar openapi.json.

Entonces, en este punto debería existir en 127.0.0.1/api/openapi.

Pero nuestro navegador no sabe esto, rastreará /openapi.json y buscará la ubicación 127.0.0.1/openapi.json. Por lo tanto, no puede encontrar openapi.json y, naturalmente, no puede iniciarlo.

Esto es en realidad un problema con la interfaz de documentación de openapi.

root_path se utiliza para resolver este problema. Como no se encontró /openapi.json, lo cambié a /api/openapi.json.

root_path es /api, que es un parámetro que se establece manualmente en el momento de la definición. Este es un parámetro que se establece manualmente en el momento de la definición para indicarle a FastAPI dónde se encuentra en todo el host. Es decir, indique la ubicación del directorio raíz. De esta manera, FastAPI tiene el "conocimiento" para agregar el prefijo para encontrar el directorio raíz correcto.

Después de usar root_path, la ubicación de openapi.json será /api/openapi.json.

Cuando intentas acceder a la dirección nuevamente desde el proxy usando la dirección proporcionada por Uvicorn, ¿dónde mira? Sí, 127.0.0.1:8000/api/openapi.json, pero no necesitamos el prefijo para acceder a él desde dentro del proxy, pero de todos modos nos agrega el prefijo, por lo que el acceso interno falla.

Aunque es poco probable que necesitemos acceder exactamente a la misma documentación de la API desde dos ubicaciones. Pero debemos darnos cuenta de esto.

Cuando revisé la documentación oficial, descubrí que excluían root_path por completo e incluso eliminaban el parámetro openapi_prefix. Pero terminó confundiéndome.

Para referirse al parámetro servidores de esta forma, el primer ejemplo oficial es así, pero con algunas modificaciones.

Cuando abrimos el documento API

Podemos cambiar este servidor y el enlace de envío en la interfaz de prueba a continuación también cambiará en consecuencia.

Pero recuerde que cambiar de servidor no cambiará lo que se envía en la siguiente interfaz, solo el host al que se envía.

Sin embargo, esto significa que la interfaz se puede probar en muchos otros hosts a través de la documentación. Sin embargo, estos hosts necesitan tener interfaces coherentes consigo mismos. Esto suele ocurrir en servidores en vivo/de desarrollo o en clústeres de servidores. Si bien no se requiere una coherencia exacta, para que sea significativa queremos ser coherentes en general.

Pero vemos que esto se abre fuera del proxy. Si queremos abrirlo desde dentro del proxy, debemos eliminar root_path. ¿lo que sucede?

Comentemos root_path:

Si desea resolver este problema, puede agregarse al servidor manualmente.

Con respecto a root_path_in_servers, cuando tanto root_path como los servidores existen, root_path se agregará automáticamente a los servidores. Sin embargo, si se establece en "falso", no habrá unión automática. (El valor predeterminado es Verdadero)

La documentación de API en realidad está concatenada en FastAPI en forma de cadenas. En realidad, esta es una plantilla tradicional y creo que todos la conocen. Su ventaja es la generación flexible, pero su desventaja es que es inconveniente para el desarrollo secundario. Fastapi proporciona varios complementos de documentación, que también puede agregar según sus necesidades.

Una cadena tan larga es en realidad solo una oración: self.router.add_api_route() Omitiré el resto por ahora, pero eso es básicamente todo. Simplemente llama a una función en el enrutador. A continuación los enumeraré de forma elíptica.

Puedes ver que algunos de estos cierres se realizan aquí; de hecho, excepto "add_api_route()" aquí, al final todos son cierres. Es solo que el proceso está en el enrutador. En última instancia, todos apuntan a router.add_api_route(), que agrega el punto final real a la ruta.

La forma en que FastAPI agrega rutas mejora el método tradicional de lista de rutas de Starlette y se basa en decoradores.

En realidad, agrega la ruta utilizando estos métodos como decorador, pasándose a sí mismo como el punto final para generar el nodo de ruta.

El punto de entrada de FastAPI no ha cambiado mucho. Pida prestado await self.middleware_stack (alcance, recepción, envío) de starlette para ingresar directamente a la pila de middleware.