Python 如何缓存Django Rest框架API调用?
我正在使用Memcached作为django应用程序的后端。此代码在普通django查询中运行良好:Python 如何缓存Django Rest框架API调用?,python,django,caching,django-rest-framework,memcached,Python,Django,Caching,Django Rest Framework,Memcached,我正在使用Memcached作为django应用程序的后端。此代码在普通django查询中运行良好: def get_myobj(): cache_key = 'mykey' result = cache.get(cache_key, None) if not result: result = Product.objects.all().filter(draft=False) cache.set(ca
def get_myobj():
cache_key = 'mykey'
result = cache.get(cache_key, None)
if not result:
result = Product.objects.all().filter(draft=False)
cache.set(cache_key, result)
return result
但与django rest framework api调用一起使用时,它不起作用:
class ProductListAPIView(generics.ListAPIView):
def get_queryset(self):
product_list = Product.objects.all()
return product_list
serializer_class = ProductSerializer
我将尝试提供缓存功能的DRF扩展:
但是github上的构建状态当前显示为“构建失败”
我的应用程序非常依赖api调用。有没有办法缓存这些呼叫
谢谢。好的,为了对查询集使用缓存:
class ProductListAPIView(generics.ListAPIView):
def get_queryset(self):
return get_myobj()
serializer_class = ProductSerializer
不过,您可能希望在缓存集上设置超时(例如60秒):
如果要缓存整个视图,请执行以下操作:
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
class ProductListAPIView(generics.ListAPIView):
serializer_class = ProductSerializer
@method_decorator(cache_page(60))
def dispatch(self, *args, **kwargs):
return super(ProductListAPIView, self).dispatch(*args, **kwargs)
我刚刚实现了这个,用于我的序列化程序
def cache_me(cache):
def true_decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
instance = args[1]
cache_key = '%s.%s' % (instance.facility, instance.id)
logger.debug('%s cache_key: %s' % (cache, cache_key))
try:
data = caches[cache].get(cache_key)
if data is not None:
return data
except:
pass
logger.info('did not cache')
data = f(*args, **kwargs)
try:
caches[cache].set(cache_key, data)
except:
pass
return data
return wrapper
return true_decorator
然后我在序列化程序上重写to_表示方法,以便它缓存每个实例的序列化输出
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
exclude = ('is_deleted', 'facility',)
@cache_me('mymodel')
def to_representation(self, instance):
return super(MyModelSerializer, self).to_representation(instance)
你是否用“@cache_response()”修饰了该方法?您好@cache_响应来自DRF扩展,我还没有尝试实现它,因为构建状态在他们的github页面上显示“构建失败”:您意识到您粘贴的视图没有调用缓存吗?是的,我在admin中修改值并重新加载DRF web browsable api。刷新后,值始终更改。如果我的内存正常,默认超时时间应为5分钟,但如果在5分钟间隔内刷新,则网站上的产品列表不会更改。所以我假设缓存正在工作(网站)谢谢!很好地工作。当我完全按照图中所示进行尝试时,我得到一个错误
“ShopsList”对象没有属性“method”
。有什么想法吗?这是另一个在当前线程中无法回答的问题。@shacker你有没有想过这个问题?或者你为此单独提出了一个问题吗?是的@eugene,只需调用URL路由器模式cache\u页面(YourView.as\u view())中视图上的cache\u页面
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
exclude = ('is_deleted', 'facility',)
@cache_me('mymodel')
def to_representation(self, instance):
return super(MyModelSerializer, self).to_representation(instance)