在我的代码中使用JSON数据

时间:2016-11-20 20:34:58

标签: python json django django-models

我是Django的新手,非常感谢任何帮助。

我在我的app的services.py

中请求我的JSON使用以下功能
def get_games():
    url = "https://igdbcom-internet-game-database-v1.p.mashape.com/games/"
    headers = {"X-Mashape-Key": "12131221"}
    # Pop the Offset with ajax When user reaches the end of the page
    params = {"filter[release_dates.date][gte]": datetime.date.today(),
              "fields": '*',
              "limit": 50,
              "order": "release_dates.date:desc",
              "offset": 0}
    r = requests.get(url, headers=headers, params=params)
    games = r.json()
    # Returns JSON Array
    return games

JSON很好地回复了我,但是如何在我的代码中使用我从上面的函数中获得的JSON数组?我的主页视图调用get_games()函数,然后将JSON数据发送到名为game_list.html的模板。从那里,我解析了我的JSON,然后在我的网站上显示来自web api的信息。

class HomePage(TemplateView):
    def get(self, request):
        games = services.get_games()
        # Sends the json string to the template
        return render(request, 'releases/game_list.html', {"games": games})

现在当我提出任何其他观点时出现问题,我无法使用上面提到的JSON。 "通常,我们从models.py文件中的数据库中获取数据,但我不确定是否应该在models.py或views.py"中获取此API数据。我的网站有零模型,我可以创建一些并以某种方式将JSON数据放入模型中,但是我必须只在我这边请求而不是客户端(每次访问主页时) )或者可能缓存json数据?

谢谢,真的很抱歉,如果我听起来很混乱,我很困惑,再次感谢。

1 个答案:

答案 0 :(得分:0)

我认为您需要使用json.loads将json数据转换为Python对象,因此您的视图将如下所示:

class HomePage(TemplateView):
    def get(self, request):
        games = json.loads(services.get_games())
        # Sends the games object to the template
        return render(request, 'releases/game_list.html', {"games": games})

修改

我认为在这种情况下你不需要使用模型。将结果数据存储在您的最终或每次请求远程服务取决于您的用例,如果您不必获取最后更新的数据,那么您可以使用某种缓存来存储返回的json。在这种情况下,我通常使用Redis缓存我的数据。

要将Redis用作Django的缓存后端,请按照以下步骤操作:

安装redis-server

sudo apt-get install redis-server

在虚拟环境中安装django-redis-cache

pip install django-redis-cache

将以下内容添加到settings.py文件中:

CACHES = {
    'default': {
        'BACKEND': 'redis_cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379',
        'TIMEOUT': 24*3600  # example of 1 day
    }
}

在您的视图中使用Django缓存:

import json
from django.core.cache import cache


class HomePage(TemplateView):
    def get(self, request):
        games = cache.get('games')
        if not games:
            games = json.dumps(services.get_games())
            # Store data in Redis
            cache.set('games', games)
        return render(request, 'releases/game_list.html', {"games": json.loads(games)})