如何将@condition decorator用于REST视图类

问题描述 投票:2回答:2

我正在尝试使用ETAG HTTP标头发送304 NOT MODIFIED响应。使用以下代码:

class MyView(GenericAPIView):
    serializer_class = MySerializer

    @condition(etag_func=get_language_etag)
    def get(self, request, *args, **kwargs):
        return Response(self.get_cached_response())

问题在于get方法的'self'参数。这会在条件方法的开头混淆@condition生成器方法中的参数:

def condition(etag_func=None, last_modified_func=None):
    def decorator(func):
        @wraps(func, assigned=available_attrs(func))
        def inner(request, *args, **kwargs):

因为现在'self'被分配给请求,实际请求最终以* args结尾。

有没有人有关于装饰器及其预期参数顺序的类似问题?

python django python-2.7 django-rest-framework etag
2个回答
2
投票

drf-extensions提供了可以在视图中使用的缓存和ETag混合,而不是使用Django提供的。

https://chibisov.github.io/drf-extensions/docs/#cache-etag-mixins

在DRF不使用标准的HttpResponse类之前,不可能使用Django提供的方法,并且大多数装饰器都期望它。


1
投票

你可以使用django-rest-framework-condition

安装它:

pip install django-rest-framework-condition

以与Django的decorator相同的方式使用它:

from rest_framework_condition import condition

class MyView(GenericAPIView):
    serializer_class = MySerializer

    @condition(etag_func=get_language_etag)
    def get(self, request, *args, **kwargs):
        return Response(self.get_cached_response())
© www.soinside.com 2019 - 2024. All rights reserved.