【问题标题】:How to use @condition decorator for REST view classes如何为 REST 视图类使用 @condition 装饰器
【发布时间】:2015-06-15 22:23:35
【问题描述】:

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


【解决方案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())

【讨论】:

    【解决方案2】:

    drf-extensions 提供缓存和 ETag mixin,您可以在视图上使用它们,而不是使用 Django 提供的那些。

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

    在DRF没有使用标准的HttpResponse类之前,Django提供的方法是无法使用的,大多数装饰者都在期待。

    【讨论】:

    • 我已经通过使用here 描述的修复成功地使用了 django etag mixins。通过创建一个覆盖 dispatch 方法的超类,代码不会那么难看
    猜你喜欢
    • 2021-07-16
    • 2015-06-23
    • 1970-01-01
    • 2016-08-14
    • 2011-08-29
    • 1970-01-01
    • 2022-08-15
    • 2012-08-02
    相关资源
    最近更新 更多