@ubirust

Как лучше связать парсер и Django?

Я написал парсер на Python, который мониторит новые объявления на досках объявлений, каждую секунду делает запрос, чтобы найти новое объявление.

Далее я написал что-то типо CRM на Django, которое ДОЛЖНО выводить новые объявления из парсера.

Но у меня вопрос. Как связать парсер и CRM? У меня была идея просто через Post запрос отправлять данные из парсера в Django. Но для этого придется разделить 2 этих приложения, я имею здесь ввиду:
1.Запустить отдельно на сервере парсер

2.Запустить отдельно Django и ловить от парсера запросы и потом выводить в новые объявления в CRM (таблицу)

Сейчас уже реализован код, который обрабатывает Post запрос и удачно выводит через websocket (django channels) новые объявления.

НО. Мне кажется это не логично.

Я бы хотел, чтобы парсер был внедрен внутрь проекта Django. Чтобы он работал в условно в отдельном потоке и напрямую вызывал функцию вызова websocket для динамического обновления контента в CRM:

channel_layer = get_channel_layer()

# Когда парсер находит новое объявление:
async_to_sync(channel_layer.group_send)(
   "listings",  # Название группы
   {
      "type": "listing_message",  
      "listing": data  # Данные объявления
   }
)


Но как это сделать? Я начал пробовать это реализовать через Celery:

1.Для начала создал новый пакет в моем приложении, туда закинул скрипты моего парсера. Там В результате как раз таки вызывается channel_layer = get_channel_layer(), это про то что я писал ранее

2.Настроил Celery

Запустил worker celery, запустил джанго. Вызвал задачу парсера, вроде worker запустился. Но я так понял парсер работает не верно, потому что функция использует асинхронный код (asyncio). Celery, в свою очередь, работает на основе синхронных задач.

Прочитал в инете, что нужно использовать Celery с поддержкой асинхронности, например, настроив Celery с eventlet или gevent.

Но что-то мне кажется, что я уже перемудрил максимально. Может кто делал похожую задачу?

По факту нужно объединить парсер и Django (отображение новых объявлений в CRM).

Возможно кто-то скажет: используй вэбхуки:

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

Я ранее примерно так и делал. Я просто сохранял данные в бд. А в самом html я просто прописал ajax скрипт, который каждую секунду обращался в базу данных и если там новое объявление выходит, то оно там тоже появлялось.

Но! Меня почему-то это смущает, потому что через режим разработчика видно, как эти запросы вызываются.

Именно поэтому решил перейти на websocket:
channel_layer = get_channel_layer()

# Когда парсер находит новое объявление:
async_to_sync(channel_layer.group_send)(
   "listings",  # Название группы
   {
      "type": "listing_message",  
      "listing": data  # Данные объявления
   }
)


Как лучше реализовать задачу?
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
dimonchik2013
@dimonchik2013
non progredi est regredi
как-то так
https://docs.celeryq.dev/en/stable/django/first-st...

воркеры и парсер живут у тебя отдельно, но работаешь сразу с моделями
CRM - отдельно
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы