Как запускать апи Django асинхронно

У меня есть долго работающий API в Django. Когда пользователь1 обращается к этому API, другие API блокируются для пользователя1 до тех пор, пока не будет решен этот вызов API. Но в то же время для других пользователей эти API работают нормально.

class CreateOrderAPIView(APIView):

    def post(self, request):
        # Creates order
        # Some third-party services are invoked (Takes so long)
        return Response(order_data, status=201)

Пример

Теперь, когда вышеупомянутый API вызывается пользователем1, другие вызовы API блокируются для пользователя1 до тех пор, пока не завершится затянувшийся вызов. Однако другие пользователи могут вызывать API в то же самое время.

Я пока не хочу использовать подход celery/redis для своих долгосрочных задач.

Есть ли способ решить эту проблему?

Вы можете использовать встроенную библиотеку Python asyncio. Вы можете создать асинхронную функцию для обработки длительной задачи и использовать asyncio.run() для ее асинхронного выполнения внутри вашего представления API.

EXAMPLE

import asyncio
from rest_framework.response import Response
from rest_framework.views import APIView

class CreateOrderAPIView(APIView):

    async def create_order_async(self, request):
        # Simulate long-running task
        await asyncio.sleep(5)  # Example: Simulate a task that takes 5 seconds

        # Generate order data
        order_data = {"order_id": 123, "status": "created"}

        return order_data

    async def post(self, request):
        # Execute the long-running task asynchronously
        order_data = await self.create_order_async(request)

        return Response(order_data, status=201)
Вернуться на верх