如何使用Django和Python根据表值提供权限

时间:2017-08-14 05:00:30

标签: python django

我需要一些帮助。我需要根据表值给一些函数授予权限。我首先在下面解释我的模型。

class Permission(models.Model):
    """docstring for Permission"""

    user = models.ForeignKey(User)
    control_reactor = models.IntegerField(default=0)
    find_reactor = models.IntegerField(default=0)
    view_reactor = models.IntegerField(default=0)

我预计会在下面给出表格。

id   control_reactor      view_reactor       find_reactor   user_id

1       1                    1                   1             2

2       0                     1                  0             1

这里假设谁user_id = 2已登录该站点。并且需要为以下views.py函数设置权限。

  

views.py:

def home(request):
    """ This function for home screen . """

    return render(request, 'plant/home.html', {'count': 1})


def view_reactor(request):
    """ This function for to get serch screen. """

    return render(request, 'plant/view_reactor.html',
                        {'count': 1})

这里我需要使用类似装饰函数i.e-@permission_required and @login_required。假设user_id=2已登录,那么它将检查数据库中的所有权限,例如control_reactor=1,view_reactor=1,find_reactor=1,所有权限都将检查home函数,而view_reactor函数将检查view_reactor=1 }} 或不 。和user_id=1的过程相同。请帮帮我。

1 个答案:

答案 0 :(得分:0)

这样怎么样?

from functools import wraps

def custom_permission_check(func):
    @wraps(func) # so that you can use help() method.
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        func_name = func.__name__ # get function name
        request = args[0] # get request from args
        permission_criteria = {
            'home':['control_reactor', 'view_reactor', 'find_reactor'],
            'control_reactor':['control_reactor'],
        }
        qs = Permission.objects.filter(user=request.user)
        for per in permission_criteria[func_name]:
            qs.filter(**{per: 1}) # use variable for field
        if not qs.exists(): # when it doesn't pass
            render(request, 'somepage.html', {}) # permission denied page
        return result
    return wrapper

@custom_permission_check
def control_reactor(request):
    return render( ... )

@ custom_permission_check
def home(request):
    return render( ... )