我有一个从某个站点获取美元当前货币的功能:
def update_currency(request):
import urllib2
import ast
from django.conf import settings
s = urllib2.urlopen('https://api.privatbank.ua/p24api/pubinfo?exchange=&json&coursid=11').read(1000)
data = ast.literal_eval(s) #parse string list to list
settings.CURRENCY_USD = float(data[2]['sale'])
return redirect(reverse('manager_page'))
经理通过按按钮更新货币。但是,如果经理忘了这样做,那么货币就不现实了。因此,我需要在某个时间每天调用一次此功能。如何执行呢?
我将货币保存在settings.py
中,因为此方法update_currency
需要花费几秒钟的时间才能从服务器获取货币,并且我不希望每次客户购买商品时都使用
python大神给出的解决方案
您可以通过CLI中的CRON或Django中的Celery安排例行任务。
我建议您按照以下步骤操作:
从设置文件中存储数据(存储在db或JSON文件或XML文件中)
Make a Django management instruction例如运行update_currency
功能的update_currency
。
制作CRON文件或设置celery,以便在几天的特定时间内运行./manage.py update_currency
命令。
更新:
如果要在数据库中存储数据,则可以创建新模型,并在该模型与其他模型之间建立一对多关系,我建议您重写此模型的保存方法,如下所示:
class Currency(models.Model):
value = models.IntegerField()
...
def save(self, *args, **kwargs):
if Currency.objects.all().count() > 0 and self != Currency.objects.all()[0]:
obj = Currency.objects.all()[0]
obj.value = self.value
obj.save(*args, **kwargs)
else:
super(Currency, self).save(*args, **kwargs)
...
通过保存方法,下次最多只能有一个实例。
还要感谢@martinarroyo,django-priodically项目非常完美,非常有用。