__call __ () brakuje 1 wymaganego argumentu pozycyjnego: „wyślij” FastAPI w App Engine
Podczas próby hostowania interfejsu API w App Engine ciągle pojawia się następujący błąd. Program działał na Flasku, który działał, ale bardzo wolno.
Błąd:
"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'
"
Plik Dockera:
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
Odpowiedzi
1 DustinIngram
App Engine wymaga, aby main.py
plik zadeklarował app
zmienną, która odpowiada aplikacji WSGI .
Ponieważ FastAPI jest asynchroniczną strukturą internetową, nie jest kompatybilny z WSGI (który jest synchroniczny).
Najlepszym rozwiązaniem byłoby skorzystanie z usługi takiej jak Cloud Run , która umożliwiłaby zdefiniowanie własnego środowiska uruchomieniowego i użycie asynchronicznego serwera HTTP kompatybilnego z FastAPI.