Django/Python中的日常过程

And*_*rew 2 python django python-2.7

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

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'))
Run Code Online (Sandbox Code Playgroud)

经理按下按钮更新货币.但是,如果经理忘记这样做,那么货币就不是实际的了.所以我需要在某个时间每天调用一次这个函数.怎么实现呢?

我正在节省货币settings.py,因为这种方法update_currency需要几秒钟才能从服务器获得货币,而且每次客户购买时都不需要它

M.j*_*vid 5

您可以通过CLI中的CRON或Django中的Celery来安排例行任务.我建议你遵循以下步骤:

  1. 将数据存储在设置文件之外(存储在db或JSON文件或XML文件中)
  2. 制作一个Django管理指令,例如update_currency运行update_currency函数.
  3. 制作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)
    ...
Run Code Online (Sandbox Code Playgroud)

通过保存方法,您在下次最多只能有一个实例.


同样感谢@martinarroyo,django-priodically项目非常完美,非常有用.