您的位置:

django出现TypeError("never_cache didn't receive an HttpRequest. If you are ""decorating a classmethod, be sure to use @method_decorator.")的解决方案

  发布时间:2023-03-14 19:52:00
报错的原因这个错误是因为你在使用 `never_cache` 装饰器,但是没有将它用在一个视图函数上装饰器是用来设置视图函数的缓存行为的,它会将缓存的 HTTP 响应标记为 "永不缓存"。如果你正在使用 Django 的类视图,你可以使用来包装 `never_cache` 装饰器,然后将它应用到类视图的 `dispatch` 方法上。这样,所有在类视图中定义的 HTTP 方法都会被修饰。

报错的原因

这个错误是因为你在使用 `never_cache` 装饰器,但是没有将它用在一个视图函数上。

`never_cache` 装饰器是用来设置视图函数的缓存行为的,它会将缓存的 HTTP 响应标记为 "永不缓存"。 如果你没有在视图函数上使用这个装饰器,那么你会看到这样的错误消息:`TypeError("never_cache didn't receive an HttpRequest. If you are decorating a classmethod, be sure to use @method_decorator.")`

要解决这个错误,你需要将 `never_cache` 装饰器放在你要修饰的视图函数前面,比如这样:


from django.views.decorators.cache import never_cache

@never_cache
def my_view(request):
    # view code here

如果你正在修饰一个类的方法,那么你需要使用 `@method_decorator` 来包装 `never_cache` 装饰器,比如这样:


from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache

class MyView(View):
    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

如何解决

为了解决这个错误,你需要检查你的代码,确保你正在使用 `never_cache` 装饰器的方式是正确的。 如果你正在修饰一个视图函数,你需要将 `never_cache` 装饰器放在视图函数前面,比如这样:


from django.views.decorators.cache import never_cache

@never_cache
def my_view(request):
    # view code here

如果你正在修饰一个类的方法,你需要使用 `@method_decorator` 来包装 `never_cache` 装饰器,比如这样:


from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache

class MyView(View):
    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

这样就能解决 `TypeError("never_cache didn't receive an HttpRequest. If you are decorating a classmethod, be sure to use @method_decorator.")` 这个错误了。

希望这个回答对你有帮助。如果你有更多的问题,请随时追问。

使用例子

当然有。下面是一个使用 `never_cache` 装饰器的例子:


from django.views.decorators.cache import never_cache
from django.shortcuts import render

@never_cache
def my_view(request):
    # view code here
    return render(request, 'my_template.html')

这个视图函数会渲染 `my_template.html` 模板,并且任何请求的响应都不会被缓存。

如果你正在使用 Django 的类视图,你可以使用 `@method_decorator` 来包装 `never_cache` 装饰器,然后将它应用到类视图的 `dispatch` 方法上。 这样,所有在类视图中定义的 HTTP 方法(比如 `get` 和 `post`)都会被修饰。

下面是一个例子:


from django.utils.decorators import method_decorator
from django.views.decorators.cache import never_cache
from django.views.generic import View

class MyView(View):
    @method_decorator(never_cache)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        # view code here
        return render(request, 'my_template.html')

    def post(self, request):
        # view code here
        return render(request, 'my_template.html')

这样,所有在这个类视图中定义的 HTTP 方法(包括 `get` 和 `post`)都会被修饰,并且任何请求的响应都不会被缓存。

希望这些例子对你有帮助。如果你有更多的问题,请随时追问。