如何每 X 分钟用 rss 提要更新我的 Django 数据库?

How to update my Django database with rss feed every X minutes?

正在使用 RSS 提要进行新工作

每 x 分钟,如果其中有任何新内容,我想从 rss 提要向我的数据库添加内容。我已经编写了在数据库中获取和更新的代码,但是如何使该代码每 X 分钟 运行。 如果我将这段代码放在我的一个呈现主页的视图函数中,它会降低页面加载速度。我希望它每 x 分钟自动发生一次,而不影响我的网站功能。

VIEWS.PY

from django.shortcuts import render
from .models import Article,Slide
import feedparser

rss = feedparser.parse('url am passing')
already_updated = False

first_entry = rss.entries[0]
for slide in Slide.objects.all():
    if first_entry.title == slide.title:
        already_updated = True

if not already_updated:
    for entry in rss.entries:
        new = Slide(title = entry.title, article_name = Article.objects.last())
        new.save()
        print(entry['title'])


def test(request):
    articles = Article.objects.all()
    slides = Slide.objects.all()
    return render(request, 'sample/test_amp.html', {'articles':articles, 'slides':slides})

一个简单的方法是使用 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 中,您将定义一个 function/class,它将从 APScheduler 创建一个 BackgroundScheduler 的实例,它会在后台无限期地保持 运行ning您定义的 X 间隔。使用它,您将从 BackgroundClass.

调用您的 update_db 函数

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 中,当调用 manage.py runserver 命令时,您将调用 jobs.py 中定义的 function/class 到 运行,因此您的后台任务从服务器开始,只要服务器运行ning就保持运行ning;每 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()