我是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数据?
谢谢,真的很抱歉,如果我听起来很混乱,我很困惑,再次感谢。
答案 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)})