Django中复用UserPassesTestMixin的test_func以避免代码重复
Django视图复用test_func验证逻辑的方案
方法一:自定义验证Mixin(推荐)
这是最贴合Django类视图设计思想的做法,把重复的验证逻辑封装成独立的Mixin,后续其他视图需要相同验证时直接继承即可:
# 自定义Mixin,封装重复的test_func逻辑 class CustomValidationMixin(UserPassesTestMixin): def test_func(self): # 这里写入你原本重复的验证逻辑 # 示例:判断用户是否拥有特定权限或满足某个条件 return self.request.user.has_perm('your_app.your_permission') or self.request.user.is_staff # 改造原有View1 class View1(LoginRequiredMixin, CustomValidationMixin, View): def get(self, request, *args, **kwargs): # 原有的页面渲染逻辑 return render(request, 'your_template.html') # 改造原有View2 class View2(LoginRequiredMixin, CustomValidationMixin, View): def get(self, request, *args, **kwargs): # 原有的JsonResponse返回逻辑 return JsonResponse({'data': 'some_data'})
方法二:抽离独立验证函数
如果验证逻辑比较简单,不想新增Mixin类,可以把逻辑抽成单独的函数,在两个视图的test_func里直接调用:
# 抽离公共验证函数 def validate_user(user): # 这里写入重复的验证逻辑 return user.is_active and user.profile.is_verified class View1(LoginRequiredMixin, UserPassesTestMixin, View): def get(self, request, *args, **kwargs): # 原有的页面渲染逻辑 pass def test_func(self): return validate_user(self.request.user) class View2(LoginRequiredMixin, UserPassesTestMixin, View): def get(self, request, *args, **kwargs): # 原有的JsonResponse返回逻辑 pass def test_func(self): return validate_user(self.request.user)
两种方式对比:
- 自定义Mixin更适合后续需要在多个视图中复用验证逻辑的场景,扩展性更好;
- 抽离函数的方式更轻便,适合逻辑简单、复用范围小的情况。
内容的提问来源于stack exchange,提问作者jxw
相关产品推荐
相关产品推荐

