【问题标题】:Best way to update my django model coming from an external api source?更新来自外部 api 源的 django 模型的最佳方法?
【发布时间】:2019-04-17 00:30:59
【问题描述】:

我通过请求一个 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 模板。无论如何,它在我做@​​987654325@ 之后每天内部更新一次?

【问题讨论】:

  • 似乎应该是一个周期性的任务。您可以使用 cronjob 或 celery 进行更新。
  • 您可以使用 crontab 来实现此目的,对于 Django,您可以使用 django-crontab 来定期调用您的视图。

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


【解决方案1】:

一个简单而常见的解决方案是创建一个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 这里)应该针对特定用途进行调整。

查看链接以获得更多指导。

【讨论】:

    【解决方案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。

    【讨论】:

    • 如果由于某种原因,您的自定义管理命令必须在没有活动区域设置的情况下运行(例如,为了防止将翻译的内容插入到数据库中),请使用您的 @no_translations 装饰器停用翻译handle() 方法:
    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 2017-06-16
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2013-11-29
    • 2019-05-31
    相关资源
    最近更新 更多