最好的方法来更新来自外部api源的django模型?

时间:2018-11-14 05:01:53

标签: django python-3.x django-rest-framework

我通过请求api源获取数据,然后将其放入django模型中。但是,数据每天都会更新。.那么如何在不每次渲染的情况下更新这些数据?

def index (request):
    session = requests.Session()
    df = session.get('https://api.coincap.io/v2/assets')
    response= df.json()
    coin = response['data']
    final_result = coin.to_dict('records')
    for coin in final_result:
        obj, created = Coincap.objects.update_or_create(
            symbol = coin['symbol'],
            name = coin['name'],
            defaults = {
                'price': coin['priceUsd']
                })
    return render(request, '/home.html/')

现在,如果要更新数据,我必须转到/home.html。但是,我的目标是稍后对其进行序列化并使其成为REST api数据,因此我不再涉及django模板。无论如何,我每天manage.py runserver之后每天都要内部更新一次?

2 个答案:

答案 0 :(得分:2)

一种简单且常见的解决方案是创建一个custom Django admin command并使用Cron在指定的时间间隔运行它。您可以根据自己的喜好编写命令代码,并且可以访问Django项目的所有模型,设置和其他部分。

您可以将代码使用Django模型在新的Command类的handle()方法中发出请求并将数据写入数据库(显然不再需要request参数)。然后,例如,如果您已将命令命名为update_some_data,则可以将其作为python manage.py update_some_data来运行。

假设Cron存在并且正在计算机上运行。然后,您可以设置Cron以指定的间隔为您运行此命令,例如创建文件/etc/cron.d/your_app_name并放入

0 4 * * * www-data /usr/local/bin/python /path/to/your/manage.py update_some_data >> /var/log/update_some_data.log  2>&1

这将使您的更新每天在04:00完成。如果您的命令将提供任何输出,它将被写入/var/log/update_some_data.log文件。 当然,这只是一个示例,因此应针对特定用途调整运行应用程序的服务器用户(此处为www-data和服务器上Python可执行文件的路径(此处为/usr/local/bin/python)。

请参阅链接以获取更多指导。

答案 1 :(得分:2)

对于正在寻找示例的人:

from django.core.management.base import BaseCommand
class Command(BaseCommand):
    def handle(self,*args,**kwargs):
        //Your request api here
        for coin in final_result:
            obj, created = Coincap.objects.update_or_create(
                symbol = coin['symbol'],
                name = coin['name'],
                defaults = {
                    'price': coin['priceUsd']})

然后按照Nikita的建议运行cron。