Django 自定义权限方法或装饰器
Django Custom Permission method or decorator
我有很多观点和不止一种用户类型。我想要一些特定用户类型可以看到而其他用户看不到的视图。
例如,只有公司才能看到此视图,为此我做了如下操作:
@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 <b>requires_company</b>(view):
@wraps(view)
def <b>_view</b>(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
<b>@requires_company</b>
def only_company_can_view(request):
# … rest of the logic …
return render(request, 'template.html')
我有很多观点和不止一种用户类型。我想要一些特定用户类型可以看到而其他用户看不到的视图。
例如,只有公司才能看到此视图,为此我做了如下操作:
@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 <b>requires_company</b>(view):
@wraps(view)
def <b>_view</b>(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
<b>@requires_company</b>
def only_company_can_view(request):
# … rest of the logic …
return render(request, 'template.html')