在我的django models.py中,我使用lxml从亚马逊抓取商品的价格。 当我在管理页面点击保存时,它将此价格存储在“价格”字段中,但有时亚马逊价格会发生变化,所以我想每2天自动更新一次价格。这是我现在的职责:
try_create
我真的不知道如何做到这一点,我只希望自动完成
答案 0 :(得分:2)
首先,我将同步功能与保存区分开来,例如您可以创建AmazonItem.sync()
方法
def sync(self):
# Your HTTP request and HTML parsing here
# Update self.price, self.last_updated etc
现在,您的出发点是在要同步的模型实例上调用.sync()
。一个非常粗糙的方法是:
for amazon_item in AmazonItem.objects.all():
amazon_item.sync()
amazon_item.save()
你可以,例如将该代码放在名为sync_amazon_items
的{{3}}内,并设置一个cron作业,每2天运行一次
# app/management/commands/sync_amazon_items.py
class Command(BaseCommand):
def handle(self, *args, **options):
for amazon_item in AmazonItem.objects.all():
amazon_item.sync()
amazon_item.save()
然后,您可以让您的操作系统或作业调度程序运行它,例如使用python manage.py sync_amazon_items
*这将会非常缓慢,因为它会顺序通过您的列表,任何项目中的错误都会停止操作,所以您需要捕获异常记录它们并继续前进,例如 < / p>
更具性能和可靠性(隔离故障)的方法是将同步作业(例如每个amazon_item的作业或一批N amazon_items)排队到Django Command之类的作业队列中,然后将Celery同意设置为目前运行一些同步作业
要安排Celery的定期任务,请查看Celery