我有一个从某个站点获取当前美元的函数:

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中保存货币,因为这种方法需要几秒钟才能从服务器获取货币,而且我不希望每次客户购买东西时都使用这种方法

最佳答案

您可以通过CLI中的CRON或Django中的Celery来安排例行任务。
我建议您遵循以下步骤:
将数据存储在设置文件之外(存储在db或JSON文件或XML文件中)
Make a Django management instruction例如update_currency运行update_currency函数。
制作CRON文件或设置芹菜,以便在一天中的特定时间运行./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项目非常完美,非常有用。

关于python - Django/Python中的日常流程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30367153/

10-11 22:48
查看更多