django的自定义权限

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django的自定义权限相关的知识,希望对你有一定的参考价值。

最近在写发布系统,涉及到权限的控制

如下  

1;定义一张权限控制的表

 1 [[email protected] app01]# tailf -25 models.py
 2 
 3 
 4 
 5 class Permission(models.Model):
 6     name = models.CharField("权限名称", max_length=64)
 7     url = models.CharField(URL名称, max_length=255)
 8     chioces = ((1, GET), (2, POST))
 9     per_method = models.SmallIntegerField(请求方法, choices=chioces, default=1)
10     argument_list = models.CharField(参数列表, max_length=255, help_text=多个参数之间用英文半角逗号隔开, blank=True, null=True)
11     describe = models.CharField(描述, max_length=255)
12 
13     def __str__(self):
14         return self.name
15 
16     class Meta:
17         verbose_name = 权限表
18         verbose_name_plural = verbose_name
19         #权限信息,这里定义的权限的名字,后面是描述信息,描述信息是在django admin中显示权限用的
20         permissions = (
21             (views_svns_list, 查看svn版本库信息表),
22             (views_onlinecode_info, 查看推送代码详细信息表),
23             (views_assets_info, 查看资产详细信息表),
24         )

2:定义权限文件

[[email protected] app01]# cat permission.py
#!/usr/bin/env python
#_*_coding:utf-8_*_
from django.shortcuts import render
from app01 import models
from django.db.models import Q
from django.core.urlresolvers import resolve   #此方法可以将url地址转换成url的name

def perm_check(request, *args, **kwargs):
    url_obj = resolve(request.path_info)
    url_name = url_obj.url_name
    perm_name = ‘‘
    #权限必须和urlname配合使得
    if url_name:
        #获取请求方法,和请求参数
        url_method, url_args = request.method, request.GET
        url_args_list = []
        #将各个参数的值用逗号隔开组成字符串,因为数据库中是这样存的
        for i in url_args:
            url_args_list.append(str(url_args[i]))
        url_args_list = ,.join(url_args_list)
        #操作数据库
        get_perm = models.Permission.objects.filter(Q(url=url_name) and Q(per_method=url_method) and Q(argument_list=url_args_list))
        if get_perm:
            for i in get_perm:
                perm_name = i.name
                perm_str = school.%s % perm_name
                if request.user.has_perm(perm_str):
                    print(====》权限已匹配)
                    return True
            else:
                print(---->权限没有匹配)
                return False
        else:
            return False
    else:
        return False   #没有权限设置,默认不放过


def check_permission(fun):    #定义一个装饰器,在views中应用
    def wapper(request, *args, **kwargs):
        if perm_check(request, *args, **kwargs):  #调用上面的权限验证方法
            return fun(request, *args, **kwargs)
        return render(request, 403.html, locals())
    return wapper

 

3:定义views.py

from app01.permission import  check_permission

@login_required(login_url=/login/)
@check_permission
def svnupdate(request,svn_id,u_type):
    pass

20170426
添加权限控制,具体使用方式登录admin,然后在权限表里操作。
权限名称 就是models中定义的权限
URL名称 就是具体访问的某个url 就是在urls.py里的name字段
以上两个字段必须和models中和url中的一致。
添加这个为拒绝的权限,如果普通用户需要访问,需要单独对普通用户授权。
点击admin 的User选项,具体的赋权操作

以上是关于django的自定义权限的主要内容,如果未能解决你的问题,请参考以下文章

找到我的自定义代码片段 Xcode 6?

Django REST框架--认证和权限

具有过滤查询集的组权限的自定义表单

如何在自定义仪表板中显示 django 角色和权限

raise PermissionDenied 中的自定义消息在 Django rest 中不起作用

是否可以使用 django 的自定义模板标签在模板的其他块中插入代码?