в FastAPI не может использовать преобразователь asyn c await - PullRequest
0 голосов
/ 05 апреля 2020

Я использую графен с fastapi, но не могу заставить работать простой asyn c. любая помощь приветствуется.

class Query(graphene.ObjectType):
    hello = graphene.String(name=graphene.String(default_value=""))

    async def resolve_hello(self, info, name):
      image_url = "my_url"
      async with httpx.AsyncClient() as client:
        response = await client.get(image_url)
        # img_bytes = await get_bytes(request.query_params["url"])
        // do stuff

и ошибка

{
  "data": {
    "hello": null
  },
  "errors": [
    {
      "message": "There is no current event loop in thread 'ThreadPoolExecutor-1_0'."
    }
  ]
}

1 Ответ

1 голос
/ 10 апреля 2020

TL; DR

При добавлении конечной точки GraphQL к объекту app замените ее на

app = FastAPI()
app.add_route("/", GraphQLApp(schema=graphene.Schema(query=Query),
    executor_class=AsyncioExecutor))

ПОЛНЫЙ ОТВЕТ

Хорошо, поэтому я нашел вашу проблему после проверки с документами и сравнения их с вашим кодом.

Это не проблема с httpx, а проблема с тем, как вы используете GraphQL.

Как видно из Документы Fastapi , функция resolve_hello объявлена ​​с традиционным def вместо async def. Это имеет значение для движка GraphQL при запуске, потому что он вызывает функцию, но не ожидает ее, вместо этого он получает объект сопрограммы и продолжает возвращать результат. Поскольку результатом является сопрограмма, он не работает и выдает исключение, которое вы опубликовали. Решение лежит в Starlette Docs , который в качестве параметра передает движок asyncio для выполнения async запросов GraphQL.

Это сложно, потому что fastAPI основан на Starlette, поэтому у вас есть чтобы прочитать оба документа на случай, если вам что-то понадобится.

Дайте мне знать, если проблема не исчезнет.

...