__call__() отсутствует 1 обязательный позиционный аргумент: 'send' FastAPI в App Engine
При попытке разместить API в App Engine продолжает появляться следующая ошибка. Программа работала на Flask, который работал, но очень медленно.
Ошибка:
"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:
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
5 ответов
Как сказал Дастин, я обнаружил, что рабочий класс нужно изменить. Попробуйте следующее.
gunicorn -k uvicorn.workers.UvicornWorker main:app
Нашел это в проблемах с github
App Engine требует вашего main.py
файл, чтобы объявить app
переменная, соответствующая приложению WSGI.
Поскольку FastAPI является асинхронной веб-платформой, он несовместим с WSGI (который является синхронным).
Лучшим вариантом будет использование такой службы, как Cloud Run, которая позволит вам определить свою собственную среду выполнения и использовать асинхронный HTTP-сервер, совместимый с FastAPI.
Я столкнулся с той же проблемой, когда хотел развернуть приложение FastAPI на Heroku. Действительно, вы не можете использовать (это структура ASGI, которую использует FastAPI) с Heroku, который использует .
Однако, добавив
uvicorn
рабочий к
gunicorn
тогда это работает!:
gunicorn api:app --bind 0.0.0.0:$PORT --worker-class uvicorn.workers.UvicornWorker
В коде Starlette я нашел ссылку на a2wsgi. И похоже, что это происходит в обоих направлениях (wsgi<>asgi).
Я попробовал, и это сработало для меня хорошо:
from a2wsgi import ASGIMiddleware
wsgi_app = ASGIMiddleware(app)
# use this wsgi instead of your app
Я решил это, поставивpython main.py
как команда сборки и установка моей команды uvicorn в main.py какuvicorn.run("main:app", host="0.0.0.0", port=8080)