自定义权限装饰器返回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里用这个装饰器,除了直接在类名前加装饰器,还有两种更规范的写法:
- 重写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)
- 更优写法:直接装饰类指定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
相关产品推荐
相关产品推荐

