【问题标题】:How do I render a cached JSONP view in Django如何在 Django 中呈现缓存的 JSONP 视图
【发布时间】:2012-10-22 06:21:15
【问题描述】:

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

但是,我想要做的是缓存视图,以便每次呈现小部件时都不会收到新请求。

我遇到了 2 个问题。

  1. 我应该使用哪种缓存方法来呈现此视图,以免数据库受到重创。

  2. 我需要将视图呈现为 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

【问题讨论】:

    标签: python django json caching django-views


    【解决方案1】:

    您必须将low-level cache API 与您喜欢的任何缓存后端一起使用。

    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中,根据documentation配置CACHE。内存后端是最简单的,memcached 可能是最好的。

    【讨论】:

    • 工作就像一个魅力!无论如何要实现缓存破坏器?
    • 当然,只需添加类似“如果 jsonstring 为 None 或 request.GET.get('nocache'):”或使缓存键依赖于查询字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2013-12-26
    • 2012-01-26
    • 2020-11-15
    • 2021-06-28
    • 2016-10-28
    相关资源
    最近更新 更多