【问题标题】:How to update my Django database with rss feed every X minutes?如何每 X 分钟使用 rss 提要更新我的 Django 数据库?
【发布时间】:2022-01-26 07:39:10
【问题描述】:

我正在使用新的 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})

【问题讨论】:

  • 您将不得不编写代码。如果您遇到困难,请将您的代码与特定问题一起发布!
  • 您使用的是基于函数的视图还是基于类的视图?
  • 是的,我为此做了编码。它在启动服务器之前运行一次并从 rss 获取内容并将更新数据库。但我希望它每 10 分钟运行一次,而不会影响活动的服务器网站页面。你能帮帮我吗

标签: python django sqlite django-views rss


【解决方案1】:

一个简单的方法是使用APScheduler 库。安装后,您需要在运行manage.py runserver 命令时从应用程序的配置文件 (apps.py) 调用调度程序以启动。一旦 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 中,您将定义一个函数/类,该函数/类将从 APScheduler 创建一个 BackgroundScheduler 的实例,它会在您定义的每个 X 间隔无限期地在后台运行。使用它,您将从BackgroundClass 调用您的update_db 函数。

首页/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 中定义的函数/类来运行,因此您的后台任务从服务器开始,并且只要服务器正在运行;每 X 间隔执行一次。

首页/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()

【讨论】:

  • 这工作?非常感谢
  • 很高兴能帮上忙。
  • 有什么方法可以联系你寻求帮助吗?
  • 如果问题与该主题无关,您可以创建一个新帖子。否则你可以在这里发表评论,我会看看我能做什么。
  • 是的,好吧。。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 2016-01-11
  • 2014-05-01
  • 1970-01-01
相关资源
最近更新 更多