Python 如何在Django中呈现缓存的JSONP视图
我正在查询一个选举信息数据库,并在JSONP中将其输出,以用于我们正在创建的一些ajax/jQuery小部件 然而,我想做的是缓存视图,这样就不会在每次呈现小部件时都有新的请求 不过我遇到了两个问题Python 如何在Django中呈现缓存的JSONP视图,python,django,json,caching,django-views,Python,Django,Json,Caching,Django Views,我正在查询一个选举信息数据库,并在JSONP中将其输出,以用于我们正在创建的一些ajax/jQuery小部件 然而,我想做的是缓存视图,这样就不会在每次呈现小部件时都有新的请求 不过我遇到了两个问题 我应该使用哪种缓存方法来呈现此视图,以便数据库不会受到严重影响 我需要将视图呈现为JSONP,这意味着我需要回调变量是动态的(它当前与我的脚本在一起,但我担心它不会与缓存视图在一起) 下面是我的代码 from models import race from models import candida
from models import race
from models import candidates
from django.http import HttpResponse
from django.utils import simplejson
def data(request):
data = []
races = race.objects.all()
for election in races:
race_candidate = candidates.objects.filter(race__id=election.pk)
candidate_info = []
for n,candidate in enumerate(race_candidate):
candidate_values = {
"name":candidate.name,
"percent":candidate.percent,
"totalvotes":candidate.totalvotes,
"partyname":candidate.partyname,
"partyabbrv":candidate.partyabbrv,
}
candidate_info.append(candidate_values)
race_values = {
"title":election.title,
"description":election.description,
"priority":election.priority,
"decided":election.decided,
"candidates":candidate_info,
}
data.append(race_values)
json_races = '{"races":' + simplejson.dumps(data) + '}'
if("callback" in request.GET.keys()):
callback = request.GET["callback"]
else:
callback = None
if(callback):
response = HttpResponse("%s(%s)" % (
callback,
simplejson.dumps(data)
), mimetype="application/json"
)
else:
response = HttpResponse(json_races, mimetype="application/json")
return response
您必须与您喜欢的任何缓存后端一起使用
from django.core.cache import cache
...
CACHE_TIMEOUT = 3600 # choose your timeout
def data(request):
jsonstring = cache.get('elections')
if jsonstring is None:
data = [{
"title": election.title,
"description": election.description,
"priority": election.priority,
"decided": election.decided,
"candidates": [
{
"name": candidate.name,
"percent": candidate.percent,
"totalvotes": candidate.totalvotes,
"partyname": candidate.partyname,
"partyabbrv": candidate.partyabbrv,
} for candidate in election.candidates_set.all()
],
} for election in race.objects.all()]
jsonstring = simplejson.dumps(data)
cache.set('elections', jsonstring, CACHE_TIMEOUT)
callback = request.GET.get('callback')
if callback:
response = HttpResponse("%s(%s)" % (callback, jsonstring),
mimetype="application/json")
else:
response = HttpResponse('{"races":' + jsonstring + '}',
mimetype="application/json")
return response
在
settings.py
中,根据配置CACHE
。内存后端是最简单的,memcached可能是最好的。非常有效!是否仍然需要实现缓存buster?当然,只需添加类似“if jsonstring为None或request.GET.GET('nocache'):”之类的内容,或者使缓存键依赖于查询字符串。