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

时间:2015-04-10 09:03:08

标签: python django python-2.7 django-rest-framework etag

我正在尝试使用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方法的参数。这会在条件方法的开头处混淆@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。

结束

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

安装:

pip install django-rest-framework-condition

以与Django装饰器相同的方式使用它:

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())