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')