如何获取Kraken公开API的JSON数据并存入Django数据库
问题修复方案
1. 正确获取Kraken接口JSON响应
Kraken公开时间接口的返回结构为{"error":[],"result":{"unixtime":xxx,"rfc1123":"xxx"}},原代码没有正确提取result层级的数据,且GET请求无需额外传入Content-Type请求头,正确的请求逻辑如下:
import requests url = 'https://api.kraken.com/0/public/Time' resp = requests.get(url) unixtime = 0 # 先校验请求状态与接口返回错误 if resp.status_code == 200: resp_data = resp.json() if not resp_data.get('error'): unixtime = resp_data['result']['unixtime']
原代码直接返回接口原始字典数据,而ModelSerializer仅能识别Django ORM模型实例,无法序列化普通字典,这是接口返回空JSON的核心原因。
2. 将JSON数据存入Django数据库
原代码中的seed_kraken方法存在三个问题:没有被调用、无法访问get_object中的局部变量kraken、遍历逻辑不符合Kraken接口的返回结构,直接合并拉取、存库、返回逻辑到视图中即可,修改后的views.py代码如下:
from rest_framework import generics from .serializers import KrakenSerializer from kraken.models import Kraken import requests class KrakenList(generics.RetrieveAPIView): serializer_class = KrakenSerializer queryset = Kraken.objects.all() def get_object(self): # 拉取Kraken接口数据 url = 'https://api.kraken.com/0/public/Time' resp = requests.get(url) unixtime = 0 if resp.status_code == 200: resp_data = resp.json() if not resp_data.get('error'): unixtime = resp_data['result']['unixtime'] # 数据存入数据库 kraken_record = Kraken.objects.create(unixtime=unixtime) # 返回ORM实例,供序列化器正常解析 return kraken_record
可选优化
如果不需要保留历史时间记录,仅需要存储最新的时间数据,可将存库逻辑替换为如下代码,避免数据库生成冗余行:
kraken_record, _ = Kraken.objects.update_or_create( id=1, # 固定ID保证仅存在一条记录 defaults={"unixtime": unixtime} )
其余models.py、serializers.py、urls.py代码无需修改,调整后访问接口即可返回{"unixtime": 对应时间戳}的正常结果。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

