¿Es posible obtener la URL de la que provino una solicitud en FastAPI?
Por ejemplo, si tengo un punto final que se solicita en api.mysite.com/endpoint y se realiza una solicitud a este punto final desde www.othersite.com , ¿hay alguna manera de recuperar la cadena "www.othersite.com"? " en mi función de punto final?
La premisa de la pregunta, que podría formularse como
un servidor puede identificar la URL desde donde vino una solicitud
está equivocado. Cierto, algunas solicitudes HTTP (especialmente algunas de las solicitudes emitidas por los navegadores) llevan un encabezado Origin y/o un encabezado Referer [sic] . Además, el encabezado Forwarded , si está presente, contiene información sobre dónde se emitió la solicitud. Sin embargo, nada en la especificación HTTP requiere que las solicitudes en general anuncien de dónde provienen.
Por lo tanto, ya sea con FastAPI o alguna otra tecnología de servidor, no existe una forma definitiva de saber de dónde proviene una solicitud.
Según la documentación de FastAPI y, por lo tanto , la de Starlette :
Imaginemos que desea obtener la dirección IP/host del cliente dentro de su función de operación de ruta.
@app.get("/items/{item_id}") def read_root(item_id: str, request: Request): client_host = request.client.host return {"client_host": client_host, "item_id": item_id}Tenga en cuenta que, como lo señalaron otros, si usa nginx, debe agregar encabezados a la solicitud de nginx para manejar esos datos.
Una vez que obtenga la dirección IP del cliente (suponiendo que las solicitudes a su API se manejen en el back-end del sitio web y, por lo tanto, la dirección IP del cliente sería la dirección IP del sitio web y no la navegación del usuario), puede realizar una búsqueda inversa de DNS para obtener el nombre de host del servidor del sitio web (aunque no siempre existe o no tiene un nombre significativo), como se muestra a continuación. Desde allí, puede buscar información sobre el nombre de host o la propia dirección IP en línea. Puede crear una base de datos con cada dirección IP (o mejor nombre de host) que resuelva para referencia futura.
import socket #address = '2001:4860:4860::8888' # Google's Public DNS IPv6 address address = '216.58.214.14' # a Google's IP address print(socket.gethostbyaddr(address)[0])