You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义权限装饰器返回None报错,如何正确返回HttpResponse?

解决Django自定义权限装饰器返回None的问题

你碰到的这个错误核心原因很简单:你的装饰器在用户通过所有权限校验后,没有调用并返回原视图函数的响应,导致wrapper函数默认返回了None,而Django要求视图必须返回HttpResponse对象。

修正后的装饰器代码

你需要在权限校验通过的分支里,调用被装饰的原视图函数,并返回它的结果:

def ask_permission(func):
    def wrapper(request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect('login')
        if not (request.user.groups.filter(name__in=["group_1", "group_2", "group_3"]).exists()):
            return redirect('access_denied')
        # 关键:调用原视图并返回其HttpResponse
        return func(request, *args, **kwargs)
    return wrapper

类视图(CBV)中使用该装饰器的两种方式

如果要在CBV里用这个装饰器,除了直接在类名前加装饰器,还有两种更规范的写法:

  1. 重写dispatch方法并添加装饰器
    在类内部重写dispatch方法,用@method_decorator装饰:
from django.utils.decorators import method_decorator

class YourModelView(generic.View):
    @method_decorator(ask_permission)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
  1. 更优写法:直接装饰类指定dispatch方法
    不需要在类内部写dispatch方法,直接在类上用@method_decorator指定要装饰的方法名:
from django.utils.decorators import method_decorator

@method_decorator(ask_permission, name='dispatch')
class ModelCreateView(generic.CreateView):
    # 你的类视图逻辑
    model = YourModel
    fields = ['...']

这种方式更简洁,符合Django的最佳实践。

内容的提问来源于stack exchange,提问作者DavidMM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:39:26