Я написал парсер на 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 # Данные объявления
}
)
Как лучше реализовать задачу?