我正在尝试使用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。
结束有没有人有关于装饰器及其预期参数顺序的类似问题?
答案 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())