You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:09:06