我通过请求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
之后每天都要内部更新一次?
答案 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。