__call __ () 1 argument de position requis manquant: "envoyer" FastAPI sur App Engine

Aug 15 2020

Lorsque vous essayez d'héberger une API sur App Engine, l'erreur suivante continue de se produire. Le programme fonctionnait sur Flask qui fonctionnait mais très lentement.

Erreur:

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

Fichier 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

Réponses

1 DustinIngram Aug 18 2020 at 01:36

App Engine requiert que votre main.pyfichier déclare une appvariable qui correspond à une application WSGI .

Étant donné que FastAPI est un framework Web asynchrone, il n'est pas compatible avec WSGI (qui est synchrone).

Votre meilleure option serait d'utiliser un service tel que Cloud Run , qui vous permettrait de définir votre propre environnement d'exécution et d'utiliser un serveur HTTP asynchrone compatible avec FastAPI.