Получение ответа scrapy spider обратно на django Rest api GET

Я работаю над проектом, который содержит GET запрос с несколькими параметрами, такими как (код авиакомпании и дата полета), я передаю эти параметры краулеру, закодированному с помощью scrapy. Я создал команду Django в management/commands для запуска scrapy crawler, и как только скрап будет выполнен, данные будут сохранены в определенных моделях. Поскольку я хочу вернуть эти сохраненные данные тем же GET-запросом, у меня есть несколько вопросов по этому поводу.

  • Как вернуть данные в GET запросе? Поскольку я не смог найти способ получить возвращаемые данные из scrapy crawler.

    .
  • Как мне сделать так, чтобы GET запрос ожидал определенное время, когда выполняется скрапинг.

  • Предполагая, что GET запрос находится в ожидании и скраппинг выполнен, теперь я должен проверить, присутствуют ли скраппированные данные в базе данных в соответствии с параметрами.

  • Предположим, что данные найдены в базе данных, как я могу вернуть их в тот же GET запрос?

  • Если я хочу использовать сельдерей во всем этом процессе, как лучше всего его использовать?

  • Вы можете создать асинхронную задачу для соскабливания данных с помощью вашего скраппера и после этого вы можете неоднократно проверить, была ли задача выполнена или нет, если да, то вы можете вызвать ваш API, который может вернуть ваши соскобленные данные.

    1. YourAPIView для создания задания
    2. ПроверкаВыполненияЗадания для создания
    3. Ваш вид APIView для получения данных

    from django.core.management import call_command

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status
    
    # configure and import celery app
    
    from cel.tasks import app
    from celery.result import AsyncResult
    from django.core.management import call_command
    
    
    @app.task
    def your_async_task(*args, **kwargs):
        call_command("your_command_name", *args, **kwargs)
    
    class CreateTaskView(APIView):
    
        def get(self, request):
            my_task = your_async_task.delay(args, name="something")
            return Response({'task_id': my_task.id}, status=status.HTTP_200_OK)
    
    class CheckTaskCompletionView(APIView):
    
        def get(self, request):
            res = AsyncResult(request.GET.get('task_id'),app=app)
            return Response({'task_state': res.state}, status=status.HTTP_200_OK)
    
    class YourAPIView(APIView):
        
        pass
        # Now you can call your get api to get the relevant data
    
    Вернуться на верх