如何每 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()
正在使用 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()