Al intentar alojar una API en App Engine, sigue apareciendo el siguiente error. El programa solía ejecutarse en Flask, que funcionaba pero era muy lento.
"Traceback (most recent call last): File "/env/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 134, in handle self.handle_request(listener, req, client, addr) File "/env/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 175, in handle_request respiter = self.wsgi(environ, resp.start_response) TypeError: __call__() missing 1 required positional argument: 'send' " FROM gcr.io/google_appengine/python RUN apt-get update && apt-get install -y ffmpeg # Create a virtualenv for dependencies. This isolates these packages from # system-level packages. RUN virtualenv /env -p python3.7 # Setting these environment variables are the same as running # source /env/bin/activate. ENV VIRTUAL_ENV /env ENV PATH /env/bin:$PATH ADD requirements.txt /app/requirements.txt RUN pip install -r /app/requirements.txt # Add the application source code. ADD . /app CMD gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app runtime: custom env: flex entrypoint: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app service: encoder runtime_config: python_version: 3 handlers: - url: /.* script: autoComo dijo Dustin, descubrí que la clase trabajadora debe cambiar. Prueba el de abajo.
gunicorn -k uvicorn.workers.UvicornWorker main:appEncontré esto en problemas de github
App Engine requiere que su archivo main.py declare una variable de app que corresponda a una aplicación WSGI .
Dado que FastAPI es un marco web asíncrono, no es compatible con WSGI (que es síncrono).
Su mejor opción sería usar un servicio como Cloud Run , que le permitiría definir su propio tiempo de ejecución y usar un servidor HTTP asíncrono compatible con FastAPI.
Me encontré con el mismo problema cuando quiero implementar una aplicación FastAPI en Heroku. De hecho, no puede usar uvicorn (que es el marco ASGI que usa FastAPI) con Heroku que usa gunicorn .
Sin embargo, al agregar un trabajador de uvicorn a gunicorn , ¡entonces funciona!:
gunicorn api:app --bind 0.0.0.0:$PORT --worker-class uvicorn.workers.UvicornWorker