如何在REST视图类中使用@condition装饰器

3

我正在尝试使用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中。

是否有人遇到过与装饰器及其参数顺序相关的类似问题?


在这里找到了答案https://dev59.com/zGnWa4cB1Zd3GeqP49wV - David Schumann
2个回答

2
您可以使用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())

2

我成功地使用了Django的ETag混合技术,通过使用此处描述的修复方法。通过创建一个覆盖dispatch方法的超类,代码看起来并不那么丑陋。 - David Schumann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接