Django ViewSet с асинхронными внешними вызовами
У меня есть набор представлений Django с действиями (конечными точками). Мне нужно вызвать два сервиса и - поскольку время их ответа велико - я хочу сделать это асинхронно. По какой-то причине этот код выполняется синхронно (get_bad_things
запускается только после завершения get_good_things
).
import asyncio
import requests
from rest_framework import viewsets
from rest_framework.response import Response
class AllThingsViewSet(viewsets.ViewSet):
@action(detail=False, url_path="get_things/")
def get_things(self, request) -> Response:
async def get_good_things(cls):
return requests.get("https://stackoverflow.com/")
async def get_bad_things(cls):
return requests.get("https://stackexchange.com/")
try:
loop = asyncio.get_event_loop()
except RuntimeError:
asyncio.set_event_loop(asyncio.new_event_loop())
loop = asyncio.get_event_loop()
things = loop.run_until_complete(
asyncio.gather(*[get_good_things(self), get_bad_things(self)])
)
return Response(things[0], status=200)
Что я делаю неправильно? Я использую gunicorn WSGI.