首页 > 解决方案 > 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')

上面这个工作得很好,解决了我的问题,但我不喜欢这个。因为,我不想每次都写公司相关观点的其余观点。

所以我正在寻找一个解决方案,以便我可以使用装饰器或其他最佳实践

在这种情况下有人可以帮助我吗?

标签: djangodjango-permissions

解决方案


您可以将逻辑包装在装饰器中:

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

推荐阅读