Как обновлять мою базу данных Django с помощью rss-ленты каждые X минут?

Новая работа с RSS-каналом

Каждые x минут я хочу добавлять в базу данных информацию из rss-ленты, если в ней есть что-то новое. Я написал код для получения и обновления в базе данных, но как сделать так, чтобы этот код выполнялся каждые X минут. Если я помещу этот код в одну из моих функций представления, которая отображает главную страницу, это замедлит скорость загрузки страницы. Я хочу, чтобы это происходило автоматически каждые X минут, не влияя на функциональность моего сайта.

Простой подход заключается в использовании библиотеки APScheduler. После установки необходимо вызвать планировщик из конфигурационного файла приложения (apps.py), чтобы он запускался при выполнении команды manage.py runserver. После запуска процесса APScheduler таким образом, он будет запускаться каждый заданный вами интервал. Вот рабочий пример, предполагающий, что у вас есть приложение под названием Home.

Структура каталога:

Basedir
| - ProjectName
| - Home
| - - __init__.py
| - - admin.py
| - - apps.py
| - - models.py
| - - test.py
| - - views.py
| - - jobs.py
| - - BackgroundClass.py

В вашей BackgroundClass.py функции вы определите функцию, которая будет выполнять часть обработки, где вы получаете RSS канал и обновляете БД, используя результаты.

Home/BackgroundClass.py

class BackgroundClass:

    @staticmethod
    def update_db():
        # Do your update db from RSS task here

Теперь в вашем jobs.py вы определите функцию/класс, который создаст экземпляр BackgroundScheduler из APScheduler, который будет работать в фоновом режиме неограниченно каждые X интервалов, которые вы определите. Используя это, вы будете вызывать вашу функцию update_db из BackgroundClass.

Home/jobs.py

from apscheduler.schedulers.background import BackgroundScheduler
from .BackgroundClass import BackgroundClass


def start():
    scheduler = BackgroundScheduler()
    scheduler.add_job(BackgroundClass.update_db, 'interval', minutes=1)
    scheduler.start()

Теперь в apps.py вы собираетесь вызвать функцию/класс, определенный в jobs.py для запуска при вызове команды manage.py runserver, так что ваша фоновая задача запускается вместе с сервером и продолжает выполняться, пока работает сервер; выполнение каждые X интервалов.

Home/apps.py

from django.apps import AppConfig


class HomeConfig(AppConfig):
    name = 'Home'

    def ready(self):
        import os
        from . import jobs

        # RUN_MAIN check to avoid running the code twice since manage.py runserver runs 'ready' twice on startup
        if os.environ.get('RUN_MAIN', None) != 'true':
            jobs.start()
Вернуться на верх