django - Django 自定义权限方法或装饰器
问题描述
我有很多观点和不止一种用户类型。我想要一些特定用户类型可以看到的视图,而其他用户看不到。
例如,只有公司才能看到此视图,为此我在下面这样做:
@login_required
def only_company_can_view(request):
if not Company.objects.filter(owner_id=request.user.id).exists():
return HttpResponse('Permission Denied. Only Company can see this')
# > rest of the logic
return render(request, 'template.html')
上面这个工作得很好,解决了我的问题,但我不喜欢这个。因为,我不想每次都写公司相关观点的其余观点。
所以我正在寻找一个解决方案,以便我可以使用装饰器或其他最佳实践
在这种情况下有人可以帮助我吗?
解决方案
您可以将逻辑包装在装饰器中:
from django.core.exceptions import PermissionDenied
from functools import wraps
def requires_company(view):
@wraps(view)
def _view(request, *args, **kwargs):
if not Company.objects.filter(owner_id=request.user.id).exists():
raise PermissionDenied
return view(request, *args, **kwargs)
return _view
然后你使用装饰器:
@login_required
@requires_company
def only_company_can_view(request):
# … rest of the logic …
return render(request, 'template.html')
推荐阅读
- node.js - Expressjs 未从 msnodesqlv8 err 对象返回所有属性
- angular - 角度原生脚本中的图像缩放问题
- cmake - 如何修复“CMAKE_C_COMPILER 不是完整路径且未在 PATH 中找到”?
- java - 使用java拆分获取值
- react-redux - 不断不得不杀死工作进程来启动我的 Phoenix 应用程序
- swift - Swift 动态动画,后跟属性动画师
- java - 如何获取 Spectron 测试结果并将其传递给外部测试(例如,Ucumber-Junit 测试)
- powershell - 获取 NetFirewallRule 用户{GIUD}
- css - 具有可变高度的css flex网格
- react-native - 如何在测试函数中模拟常量值