我正在尝试使用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结尾。
有没有人有关于装饰器及其预期参数顺序的类似问题?
drf-extensions提供了可以在视图中使用的缓存和ETag混合,而不是使用Django提供的。
https://chibisov.github.io/drf-extensions/docs/#cache-etag-mixins
在DRF不使用标准的HttpResponse
类之前,不可能使用Django提供的方法,并且大多数装饰器都期望它。
你可以使用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())