2013-11-27 42 views
1

我是新的tastypie REST for django,我在我的ModelResource中使用屬性緩存但不起作用,當我對數據庫進行更改並刷新API url http://localhost:8000/api/rest/tip/ this顯示上一次的變化,這種信息並不需要不斷刷新如何在Django中緩存API JSON響應Tastypie

class TipResource(ModelResource): 
    class Meta: 
     queryset = Tip.objects.all() 
     resource_name = 'tip' 
     allowed_methods = ['get'] 
     include_resource_uri = False 
     cache = SimpleCache(timeout=1000) 

我需要緩存爲不使許多數據庫查詢

什麼都可以錯對此有何反應?

感謝

回答

4

Tastypie的SimpleCache將緩存單個資源獲取,但不會緩存查詢。這是非常有限的。所以/ api/rest/tip/< TIP_ID> /會被緩存,但是任何需要查詢的請求都不會。

緩存結果的最簡單方法是啓用Django的視圖緩存。在這種情況下,Django只會緩存序列化的JSON結果,並返回,直到緩存超時。 Tastypie甚至不會看到這個請求。

但是,要小心,因爲Django的緩存使用HTTP緩存,所以瀏覽器可以緩存數據,而不是向服務器發出請求。如果你的數據發生變化,你在這種情況下非常麻煩。

一個適當的解決方案是更復雜一些,並且不包括與Tastypie。實際上,我在不久之前就已經完成了這項工作。看到tastypie組我的消息,雖然我還沒有看到任何人感興趣的是一個尚未解決:https://groups.google.com/forum/?hl=en#!topic/django-tastypie/87mlo7bvCgo

+0

這是否消息有followups?不能相信沒有任何興趣...... – tutuca

+0

從未有過後續行動。我相信,隨着緩存任意查詢無效的問題幾乎是不可能的,所以它不處理。如果您只使用特定的查詢,你就必須自己手動處理的緩存失效。 – dragonx

1

你可以重寫功能get_listtastypie.resources.ModelResource 更改代碼objects = self.obj_get_list(bundle=base_bundle,**self.remove_api_resource_names(kwargs))objects=self.cached_obj_get_list(bundle=base_bundle,**self.remove_api_resource_names(kwargs))

def get_list(self, request, **kwargs): 
    base_bundle = self.build_bundle(request=request) 

    objects = self.cached_obj_get_list(bundle=base_bundle, **self.remove_api_resource_names(kwargs)) 

    sorted_objects = self.apply_sorting(objects, options=request.GET) 

    paginator = self._meta.paginator_class(request.GET, sorted_objects, resource_uri=self.get_resource_uri(), limit=self._meta.limit, max_limit=self._meta.max_limit, collection_name=self._meta.collection_name) 
    to_be_serialized = paginator.page() 

    # Dehydrate the bundles in preparation for serialization. 
    bundles = [] 

    for obj in to_be_serialized[self._meta.collection_name]: 
     bundle = self.build_bundle(obj=obj, request=request) 
     bundles.append(self.full_dehydrate(bundle, for_list=True)) 

    to_be_serialized[self._meta.collection_name] = bundles 
    to_be_serialized = self.alter_list_data_to_serialize(request, to_be_serialized) 

    return self.create_response(request, to_be_serialized) 

然後/ API/REST /提示/將得到緩存,不僅/ API/REST /尖端/ < TIP_ID>/