__call __ () fehlt 1 erforderliches Positionsargument: 'send' FastAPI auf App Engine

Aug 15 2020

Beim Versuch, eine API in App Engine zu hosten, tritt immer wieder der folgende Fehler auf. Das Programm lief früher auf Flask, was funktionierte, aber sehr langsam war.

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

Docker-Datei:

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

Antworten

1 DustinIngram Aug 18 2020 at 01:36

App Engine erfordert, dass Ihre main.pyDatei eine appVariable deklariert , die einer WSGI-Anwendung entspricht .

Da FastAPI ein asynchrones Webframework ist, ist es nicht mit WSGI (das synchron ist) kompatibel.

Am besten verwenden Sie einen Dienst wie Cloud Run , mit dem Sie Ihre eigene Laufzeit definieren und einen mit FastAPI kompatiblen asynchronen HTTP-Server verwenden können.