es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Proxy un sitio web externo utilizando Python FastAPI sin admitir parámetros de consulta.

Estoy tratando de hacer una proxy de un sitio web externo (URL de monitorización de Flower que se ejecuta en un contenedor diferente) usando el framework Fast API de Python:

client = AsyncClient(base_url=f'http://containername:7800/monitor')

@app.get("/monitor/{path:path}")
async def tile_request(path: str):
    req = client.build_request("GET", path)
    r = await client.send(req, stream=True)
    return StreamingResponse(
        r.aiter_raw(),
        background=BackgroundTask(r.aclose),
        headers=r.headers
   )

Es capaz de hacer proxy con la URL del contenedor para cada ruta. Por ejemplo:

http://python_server:8001/monitor/dashboard –> http://containername:7800/monitor/dashboard

http://python_server:8001/monitor/tasks –> http://containername:7800/monitor/tasks

Funciona bien. Pero falla cuando la ruta tiene parámetros de consulta en la URL.

Por ejemplo:

http://python_server:8001/monitor/dashboard?json=1&_=1641485992460 –> redirecciona a http://containername:7800/monitor/dashboard

(Tenga en cuenta que no se añaden parámetros de consulta a la URL).

¿Alguien puede ayudar con cómo podemos hacer proxy de cualquier ruta de este sitio web externo con cualquier parámetro de consulta?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para proxyar un sitio web externo con cualquier ruta y parámetros de consulta usando FastAPI, puedes modificar el código existente utilizando el atributo “query_params” de la función “client.build_request()”. El código actualizado se verá así:

    client = AsyncClient(base_url='http://containername:7800/monitor')
    
    @app.get("/monitor/{path:path}")
    async def proxy_request(path: str, request: Request):
        url = request.url
        query_params = dict(url.query_params)
        req = client.build_request("GET", path, params=query_params)
        response = await client.send(req, stream=True)
        headers = response.headers
        background_task = BackgroundTask(response.aclose)
        return StreamingResponse(
            response.aiter_raw(),
            headers=headers,
            background=background_task,
        )
    

    Este código obtiene los parámetros de consulta de la URL de la solicitud original y los pasa como un diccionario al atributo “query_params” de la función “client.build_request()”. Esto permite que el código proxye cualquier ruta con cualquier parámetro de consulta de un sitio web externo.

Comments are closed.