Получение ответа scrapy spider обратно на django Rest api GET
Я работаю над проектом, который содержит GET запрос с несколькими параметрами, такими как (код авиакомпании и дата полета), я передаю эти параметры краулеру, закодированному с помощью scrapy. Я создал команду Django в management/commands для запуска scrapy crawler, и как только скрап будет выполнен, данные будут сохранены в определенных моделях. Поскольку я хочу вернуть эти сохраненные данные тем же GET-запросом, у меня есть несколько вопросов по этому поводу.
Как вернуть данные в GET запросе? Поскольку я не смог найти способ получить возвращаемые данные из scrapy crawler.
.Как мне сделать так, чтобы GET запрос ожидал определенное время, когда выполняется скрапинг.
Предполагая, что GET запрос находится в ожидании и скраппинг выполнен, теперь я должен проверить, присутствуют ли скраппированные данные в базе данных в соответствии с параметрами.
- Предположим, что данные найдены в базе данных, как я могу вернуть их в тот же GET запрос?
- Если я хочу использовать сельдерей во всем этом процессе, как лучше всего его использовать?
- YourAPIView для создания задания
- ПроверкаВыполненияЗадания для создания
- Ваш вид APIView для получения данных
Вы можете создать асинхронную задачу для соскабливания данных с помощью вашего скраппера и после этого вы можете неоднократно проверить, была ли задача выполнена или нет, если да, то вы можете вызвать ваш API, который может вернуть ваши соскобленные данные.
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