__call __ () falta 1 argumento posicional obligatorio: 'enviar' FastAPI en App Engine

Aug 15 2020

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.

Error:

"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'
"

Archivo Docker:

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

app.yaml

runtime: custom
env: flex
entrypoint: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
service: encoder

runtime_config:
  python_version: 3

handlers:

- url: /.*
  script: auto

Respuestas

1 DustinIngram Aug 18 2020 at 01:36

App Engine requiere que su main.pyarchivo declare una appvariable que corresponda a una aplicación WSGI .

Dado que FastAPI es un marco web asincrónico, no es compatible con WSGI (que es sincrónico).

Su mejor opción sería utilizar un servicio como Cloud Run , que le permitiría definir su propio tiempo de ejecución y utilizar un servidor HTTP asíncrono compatible con FastAPI.