Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何缓存Django Rest框架API调用?_Python_Django_Caching_Django Rest Framework_Memcached - Fatal编程技术网

Python 如何缓存Django Rest框架API调用?

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

我正在使用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(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)