Python 如何在Django中呈现缓存的JSONP视图

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

我正在查询一个选举信息数据库,并在JSONP中将其输出,以用于我们正在创建的一些ajax/jQuery小部件

然而,我想做的是缓存视图,这样就不会在每次呈现小部件时都有新的请求

不过我遇到了两个问题

  • 我应该使用哪种缓存方法来呈现此视图,以便数据库不会受到严重影响

  • 我需要将视图呈现为JSONP,这意味着我需要回调变量是动态的(它当前与我的脚本在一起,但我担心它不会与缓存视图在一起)

  • 下面是我的代码

    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'):”之类的内容,或者使缓存键依赖于查询字符串。