<div class="cnblogs_code" onclick="cnblogs_code_show('23b3937b-2e92-439b-acbb-886dba1573d5')">
django.db <span style="color: #0000ff;">class<span style="color: #000000;"> Menu(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
菜单组
<span style="color: #800000;">"""<span style="color: #000000;">
title = models.CharField(max_length=32<span style="color: #000000;">)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
verbose_name_plural </span>= <span style="color: #800000;">"</span><span style="color: #800000;">菜单组</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.title
<span style="color: #0000ff;">class<span style="color: #000000;"> Group(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
权限组
<span style="color: #800000;">"""<span style="color: #000000;">
caption = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">组名称<span style="color: #800000;">',max_length=16<span style="color: #000000;">)
menu = models.ForeignKey(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">所属菜单<span style="color: #800000;">',to=<span style="color: #800000;">'<span style="color: #800000;">Menu<span style="color: #800000;">',default=1<span style="color: #000000;">)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
verbose_name_plural </span>= <span style="color: #800000;">"</span><span style="color: #800000;">权限组</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.caption
<span style="color: #0000ff;">class<span style="color: #000000;"> Permission(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
权限表
<span style="color: #800000;">"""<span style="color: #000000;">
title = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">标题<span style="color: #800000;">',max_length=32<span style="color: #000000;">)
url = models.CharField(verbose_name=<span style="color: #800000;">"<span style="color: #800000;">含正则URL<span style="color: #800000;">",max_length=64<span style="color: #000000;">)
menu_gp </span>= models.ForeignKey(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">组内菜单</span><span style="color: #800000;">'</span>,to=<span style="color: #800000;">'</span><span style="color: #800000;">Permission</span><span style="color: #800000;">'</span>,null=True,blank=True,related_name=<span style="color: #800000;">'</span><span style="color: #800000;">x1</span><span style="color: #800000;">'</span><span style="color: #000000;">)
code </span>= models.CharField(verbose_name=<span style="color: #800000;">"</span><span style="color: #800000;">操作</span><span style="color: #800000;">"</span>,max_length=16<span style="color: #000000;">)
group </span>= models.ForeignKey(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">所属组</span><span style="color: #800000;">'</span>,to=<span style="color: #800000;">"</span><span style="color: #800000;">Group</span><span style="color: #800000;">"</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
verbose_name_plural </span>= <span style="color: #800000;">"</span><span style="color: #800000;">权限表</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.title
<span style="color: #0000ff;">class<span style="color: #000000;"> User(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
用户表
<span style="color: #800000;">"""<span style="color: #000000;">
username = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">用户名<span style="color: #800000;">',max_length=32<span style="color: #000000;">)
password = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">密码<span style="color: #800000;">',max_length=64<span style="color: #000000;">)
email = models.CharField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">邮箱<span style="color: #800000;">',max_length=32<span style="color: #000000;">)
roles </span>= models.ManyToManyField(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">具有的所有角色</span><span style="color: #800000;">'</span>,to=<span style="color: #800000;">"</span><span style="color: #800000;">Role</span><span style="color: #800000;">"</span>,blank=<span style="color: #000000;">True)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
verbose_name_plural </span>= <span style="color: #800000;">"</span><span style="color: #800000;">用户表</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.username
<span style="color: #0000ff;">class<span style="color: #000000;"> Role(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
角色表
<span style="color: #800000;">"""<span style="color: #000000;">
title = models.CharField(max_length=32<span style="color: #000000;">)
permissions = models.ManyToManyField(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">具有的所有权限<span style="color: #800000;">',blank=<span style="color: #000000;">True)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
verbose_name_plural </span>= <span style="color: #800000;">"</span><span style="color: #800000;">角色表</span><span style="color: #800000;">"</span>
<span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span> self.title</pre>
verbose_name---在admin模式下,字段显示的名字
blank=True ---在admin模式下,字段可以为空
class Meta:
verbose_name_plural = "表名" ---在admin模式下,显示的表名
<div class="cnblogs_code" onclick="cnblogs_code_show('c58cc8ef-20a7-480c-908a-a4ec23395d08')">


<div id="cnblogs_code_open_c58cc8ef-20a7-480c-908a-a4ec23395d08" class="cnblogs_code_hide">
django.contrib <span style="color: #0000ff;">from . <span style="color: #0000ff;">import<span style="color: #000000;"> models
admin.site.register(models.Permission)
admin.site.register(models.User)
admin.site.register(models.Role)
admin.site.register(models.Group)
admin.site.register(models.Menu)
c.基于Django admin录入权限数据
python manage.py createsuperuser
d.用户登录程序
按照逻辑,当我们输入一个URL,在跳转到相应页面前,我们需要做3件事:
,拿到用户权限信息
,如能访问此URL,当进入URL后,我们还需要根据用户的身份,在页面上显示不同的操作权限
由于每次跳转一个URL前,都会重复上面的步骤,,以免为此给每个视图函数都加上一个装饰器(麻烦)
比对账户密码,设置session的过程应该是在视图函数里完成,
首先,我们来考虑一下,作为权限管理系统,我们希望能根据用户的权限,在页面显示一些相应菜单信息和操作按钮,所以session设置,我们分两个部分:
一个是权限相关,用来检验用户访问权限,以及页面权限相关按钮(添加、编辑、删除)显示与否
二是菜单相关,比如我们点击菜单一里的子选项:用户列表,显示页面信息后,菜单一仍然是展开状态,当我们在用户列表点击添加用户,跳转新页面时,仍然展开菜单一
session权限相关
根据需求,我们知道,权限相关里,我们需要拿到、、和,
为了方便后取数据,所以我们最终想要的结构是
{group_id1:{
urls:[url1、url2、url3....],
codes:[list、del、edit、add]},
group_id2:{
urls:[url1、url2、url3....],
codes:[list、del、edit、add]}
session菜单相关
根据需求,我们知道,权限相关里,我们需要,,,,、
list = user.roles.values(,
,
,
,
,
,
,
,
一定要去重,因为有的人有几个身份,有的权限会重复,将上面拿到的数据,再处理一下,分别作为,菜单相关,权限相关所需的数据


django.conf <span style="color: #0000ff;">def<span style="color: #000000;"> init_permission(user,request):
<span style="color: #800000;">"""<span style="color: #800000;">
初始化权限信息,获取权限信息并放置到session中。
<span style="color: #800000;">"""<span style="color: #000000;">
permission_list = user.roles.values(<span style="color: #800000;">'<span style="color: #800000;">permissions
id<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">permissionstitle<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 用户列表
<span style="color: #800000;">'<span style="color: #800000;">permissions
url<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">permissionscode<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">permissions
menu_gp_id<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 组内菜单ID,Null表示是菜单
<span style="color: #800000;">'<span style="color: #800000;">permissionsgroup_id<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">permissions
groupmenu_id<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 菜单ID
<span style="color: #800000;">'<span style="color: #800000;">permissions
groupmenu__title<span style="color: #800000;">',<span style="color: #008000;">#<span style="color: #008000;"> 菜单名称
).distinct() <span style="color: #008000;">#<span style="color: #008000;">要去重,因为每个人可能有多种身份,权限会重复
<span style="color: #008000;">#</span><span style="color: #008000;"> 菜单相关(以后再匹配)</span>
sub_permission_list =<span style="color: #000000;"> []
</span><span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> permission_list:
tpl </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__id</span><span style="color: #800000;">'</span><span style="color: #000000;">],</span><span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__title</span><span style="color: #800000;">'</span><span style="color: #000000;">],</span><span style="color: #800000;">'</span><span style="color: #800000;">url</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__url</span><span style="color: #800000;">'</span><span style="color: #000000;">],</span><span style="color: #800000;">'</span><span style="color: #800000;">menu_gp_id</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__menu_gp_id</span><span style="color: #800000;">'</span><span style="color: #000000;">],</span><span style="color: #800000;">'</span><span style="color: #800000;">menu_id</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__group__menu_id</span><span style="color: #800000;">'</span><span style="color: #000000;">],</span><span style="color: #800000;">'</span><span style="color: #800000;">menu_title</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__group__menu__title</span><span style="color: #800000;">'</span><span style="color: #000000;">],}
sub_permission_list.append(tpl)
request.session[settings.PERMISSION_MENU_KEY] </span>=<span style="color: #000000;"> sub_permission_list
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 权限相关</span>
result =<span style="color: #000000;"> {}
</span><span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> permission_list:
group_id </span>= item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__group_id</span><span style="color: #800000;">'</span><span style="color: #000000;">]
code </span>= item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__code</span><span style="color: #800000;">'</span><span style="color: #000000;">]
url </span>= item[<span style="color: #800000;">'</span><span style="color: #800000;">permissions__url</span><span style="color: #800000;">'</span><span style="color: #000000;">]
</span><span style="color: #0000ff;">if</span> group_id <span style="color: #0000ff;">in</span><span style="color: #000000;"> result:
result[group_id][</span><span style="color: #800000;">'</span><span style="color: #800000;">codes</span><span style="color: #800000;">'</span><span style="color: #000000;">].append(code)
result[group_id][</span><span style="color: #800000;">'</span><span style="color: #800000;">urls</span><span style="color: #800000;">'</span><span style="color: #000000;">].append(url)
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
result[group_id] </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">codes</span><span style="color: #800000;">'</span><span style="color: #000000;">:[code,],</span><span style="color: #800000;">'</span><span style="color: #800000;">urls</span><span style="color: #800000;">'</span><span style="color: #000000;">:[url,]
}
request.session[settings.PERMISSION_URL_DICT_KEY] </span>= result</pre>
init_permission(user,request)
from rbac.service.init_permission import init_permission
在rbac中建立一个middlewares文件夹,然后建一个名为rbac.py的文件,用来编写我们自定义的中间件代码


<span style="color: #0000ff;">from django.shortcuts <span style="color: #0000ff;">import<span style="color: #000000;"> redirect,HttpResponse
<span style="color: #0000ff;">from django.conf <span style="color: #0000ff;">import<span style="color: #000000;"> settings
<span style="color: #0000ff;">class<span style="color: #000000;"> MiddlewareMixin(object):
<span style="color: #0000ff;">def <span style="color: #800080;">init(self,get_response=<span style="color: #000000;">None):
self.get_response =<span style="color: #000000;"> get_response
super(MiddlewareMixin,self).<span style="color: #800080;">init<span style="color: #000000;">()
</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__call__</span><span style="color: #000000;">(self,request):
response </span>=<span style="color: #000000;"> None
</span><span style="color: #0000ff;">if</span> hasattr(self,<span style="color: #800000;">'</span><span style="color: #800000;">process_request</span><span style="color: #800000;">'</span><span style="color: #000000;">):
response </span>=<span style="color: #000000;"> self.process_request(request)
</span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> response:
response </span>=<span style="color: #000000;"> self.get_response(request)
</span><span style="color: #0000ff;">if</span> hasattr(self,<span style="color: #800000;">'</span><span style="color: #800000;">process_response</span><span style="color: #800000;">'</span><span style="color: #000000;">):
response </span>=<span style="color: #000000;"> self.process_response(request,response)
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> response
<span style="color: #0000ff;">class<span style="color: #000000;"> RbacMiddleware(MiddlewareMixin):
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> process_request(self,request):
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 1. 获取当前请求的URL</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> request.path_info</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 2. 获取Session中保存当前用户的权限</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> request.session.get("permission_url_list')</span>
current_url =<span style="color: #000000;"> request.path_info
</span><span style="color: #008000;">#</span><span style="color: #008000;"> 当前请求不需要执行权限验证</span>
<span style="color: #0000ff;">for</span> url <span style="color: #0000ff;">in</span><span style="color: #000000;"> settings.VALID_URL:
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> re.match(url,current_url):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> None
</span><span style="color: #008000;">#</span><span style="color: #008000;">在视图函数那边验证用户登录成功后,会设置session,如果登录成功则会有此session</span>
permission_dict =<span style="color: #000000;"> request.session.get(settings.PERMISSION_URL_DICT_KEY)
</span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> permission_dict:
</span><span style="color: #008000;">#</span><span style="color: #008000;">没有session值,则说明没有登录,需要跳转登录页面</span>
<span style="color: #0000ff;">return</span> redirect(<span style="color: #800000;">'</span><span style="color: #800000;">/login/</span><span style="color: #800000;">'</span><span style="color: #000000;">)
flag </span>=<span style="color: #000000;"> False
</span><span style="color: #0000ff;">for</span> group_id,code_url <span style="color: #0000ff;">in</span><span style="color: #000000;"> permission_dict.items():
</span><span style="color: #0000ff;">for</span> db_url <span style="color: #0000ff;">in</span> code_url[<span style="color: #800000;">'</span><span style="color: #800000;">urls</span><span style="color: #800000;">'</span><span style="color: #000000;">]:
regax </span>= <span style="color: #800000;">"</span><span style="color: #800000;">^{0}$</span><span style="color: #800000;">"</span>.format(db_url) <span style="color: #008000;">#</span><span style="color: #008000;">为了精准匹配</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 将当前页面与当前用户可访问的页面进行匹配</span>
<span style="color: #0000ff;">if</span><span style="color: #000000;"> re.match(regax,current_url):
</span><span style="color: #008000;">#</span><span style="color: #008000;">匹配成功后将用户的可执行的(增、删、改、列表等操作)存到request中,方便调用</span>
request.permission_code_list = code_url[<span style="color: #800000;">'</span><span style="color: #800000;">codes</span><span style="color: #800000;">'</span><span style="color: #000000;">]
flag </span>=<span style="color: #000000;"> True
</span><span style="color: #0000ff;">break</span>
<span style="color: #0000ff;">if</span><span style="color: #000000;"> flag:
</span><span style="color: #0000ff;">break</span>
<span style="color: #008000;">#</span><span style="color: #008000;">匹配失败,则显示无权访问</span>
<span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> flag:
</span><span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">'</span><span style="color: #800000;">无权访问</span><span style="color: #800000;">'</span>)</pre>
PERMISSION_URL_DICT_KEY =
还有加上URL白名单
VALID_URL =
由于页面上都会显示菜单,所以我们先写一个模板,其他的只有继承就好


{% load rbac %} {
>
>
content=>
content=>
href= />
Title
>% menu_html request %} {
>% block content %}{% endblock %
<script src=<span style="color: #800000;">"</span><span style="color: #800000;">/static/jquery-3.2.1.min.js</span><span style="color: #800000;">"</span>></script>
<script src=<span style="color: #800000;">"</span><span style="color: #800000;">/static/rbac/rbac.js</span><span style="color: #800000;">"</span>></script>
在rbac下建立一个static再在里面建立rbac文件夹,在建我们的css和js文件


.item---


/**
* Created by Administrator on 2017/11/8*/($(this).next().hasClass(});
jquery文件我们可以放在根目录下的static文件夹中
接下来我们写自定义标签的内容在rbac下建立templatetags文件下,创建rbac.py


django.template django.conf =@register.inclusion_tag(<span style="color: #800000;">"<span style="color: #800000;">xxxxx.html<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">def<span style="color: #000000;"> menu_html(request):
<span style="color: #800000;">"""<span style="color: #800000;">
去Session中获取菜单相关信息,匹配当前URL,生成菜单
:param request:
:return:
<span style="color: #800000;">"""<span style="color: #000000;">
menu_list =<span style="color: #000000;"> request.session[settings.PERMISSION_MENU_KEY]
current_url =<span style="color: #000000;"> request.path_info
menu_dict </span>=<span style="color: #000000;"> {}
</span><span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> menu_list:
</span><span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> item[<span style="color: #800000;">'</span><span style="color: #800000;">menu_gp_id</span><span style="color: #800000;">'</span><span style="color: #000000;">]:
menu_dict[item[</span><span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>]] =<span style="color: #000000;"> item
</span><span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> menu_list:
regex </span>= <span style="color: #800000;">"</span><span style="color: #800000;">^{0}$</span><span style="color: #800000;">"</span>.format(item[<span style="color: #800000;">'</span><span style="color: #800000;">url</span><span style="color: #800000;">'</span><span style="color: #000000;">])
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> re.match(regex,current_url):
menu_gp_id </span>= item[<span style="color: #800000;">'</span><span style="color: #800000;">menu_gp_id</span><span style="color: #800000;">'</span><span style="color: #000000;">]
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> menu_gp_id:
menu_dict[menu_gp_id][</span><span style="color: #800000;">'</span><span style="color: #800000;">active</span><span style="color: #800000;">'</span>] =<span style="color: #000000;"> True
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
menu_dict[item[</span><span style="color: #800000;">'</span><span style="color: #800000;">id</span><span style="color: #800000;">'</span>]][<span style="color: #800000;">'</span><span style="color: #800000;">active</span><span style="color: #800000;">'</span>] =<span style="color: #000000;"> True
result </span>=<span style="color: #000000;"> {}
</span><span style="color: #0000ff;">for</span> item <span style="color: #0000ff;">in</span><span style="color: #000000;"> menu_dict.values():
active </span>= item.get(<span style="color: #800000;">'</span><span style="color: #800000;">active</span><span style="color: #800000;">'</span><span style="color: #000000;">)
menu_id </span>= item[<span style="color: #800000;">'</span><span style="color: #800000;">menu_id</span><span style="color: #800000;">'</span><span style="color: #000000;">]
</span><span style="color: #0000ff;">if</span> menu_id <span style="color: #0000ff;">in</span><span style="color: #000000;"> result:
result[menu_id][</span><span style="color: #800000;">'</span><span style="color: #800000;">children</span><span style="color: #800000;">'</span>].append({ <span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span>: item[<span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span>],<span style="color: #800000;">'</span><span style="color: #800000;">url</span><span style="color: #800000;">'</span>: item[<span style="color: #800000;">'</span><span style="color: #800000;">url</span><span style="color: #800000;">'</span>],<span style="color: #800000;">'</span><span style="color: #800000;">active</span><span style="color: #800000;">'</span><span style="color: #000000;">:active})
</span><span style="color: #0000ff;">if</span><span style="color: #000000;"> active:
result[menu_id][</span><span style="color: #800000;">'</span><span style="color: #800000;">active</span><span style="color: #800000;">'</span>] =<span style="color: #000000;"> True
</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:
result[menu_id] </span>=<span style="color: #000000;"> {
</span><span style="color: #800000;">'</span><span style="color: #800000;">menu_id</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">menu_id</span><span style="color: #800000;">'</span><span style="color: #000000;">],</span><span style="color: #800000;">'</span><span style="color: #800000;">menu_title</span><span style="color: #800000;">'</span>:item[<span style="color: #800000;">'</span><span style="color: #800000;">menu_title</span><span style="color: #800000;">'</span><span style="color: #000000;">],</span><span style="color: #800000;">'</span><span style="color: #800000;">active</span><span style="color: #800000;">'</span><span style="color: #000000;">:active,</span><span style="color: #800000;">'</span><span style="color: #800000;">children</span><span style="color: #800000;">'</span><span style="color: #000000;">:[
{ </span><span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span>: item[<span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span>],<span style="color: #800000;">'</span><span style="color: #800000;">active</span><span style="color: #800000;">'</span><span style="color: #000000;">:active}
]
}
</span><span style="color: #0000ff;">return</span> {<span style="color: #800000;">'</span><span style="color: #800000;">menu_dict</span><span style="color: #800000;">'</span>:result}</pre>
menu_dict = item item[]] = item
item = .format(item[= item[
menu_dict[menu_gp_id][] =
menu_dict[item[]][] = True
result = item = item.get(= item[ menu_id
result[menu_id][].append({ : item[],
result[menu_id][] ==:item[: item[],
作用是:可以将其所装饰的函数menu_html的返回值直接给xxxxx.html(此页面是用来生成菜单相关的html)中使用,
当调用自定义标签menu_html时,会将经过渲染后的xxxxx.html页面以字符串的形式返回给调用的地方
用来形成菜单
这样以后其他页面直接继承layout.html就会有其对应的菜单,内容部分,我们还需要判断一下用户的操作权限,以显示相应操作按钮,如userinfo页面


django.conf.urls django.contrib rbac app01 =


=</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> has_add(self):
</span><span style="color: #0000ff;">if</span> <span style="color: #800000;">"</span><span style="color: #800000;">add</span><span style="color: #800000;">"</span> <span style="color: #0000ff;">in</span><span style="color: #000000;"> self.code_list:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> has_edit(self):
</span><span style="color: #0000ff;">if</span> <span style="color: #800000;">'</span><span style="color: #800000;">edit</span><span style="color: #800000;">'</span> <span style="color: #0000ff;">in</span><span style="color: #000000;"> self.code_list:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
</span><span style="color: #0000ff;">def</span><span style="color: #000000;"> has_del(self):
</span><span style="color: #0000ff;">if</span> <span style="color: #800000;">'</span><span style="color: #800000;">del</span><span style="color: #800000;">'</span> <span style="color: #0000ff;">in</span><span style="color: #000000;"> self.code_list:
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> True
<span style="color: #0000ff;">def<span style="color: #000000;"> userinfo(request):
page_permission =<span style="color: #000000;"> BasePagePermission(request.permission_code_list)
data_list =<span style="color: #000000;"> [
{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':1,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx1<span style="color: #800000;">'<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':2,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx2<span style="color: #800000;">'<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':3,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx3<span style="color: #800000;">'<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':4,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx4<span style="color: #800000;">'<span style="color: #000000;">},{<span style="color: #800000;">'<span style="color: #800000;">id<span style="color: #800000;">':5,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">xxx5<span style="color: #800000;">'<span style="color: #000000;">},]
<span style="color: #0000ff;">return render(request,<span style="color: #800000;">'<span style="color: #800000;">userinfo.html<span style="color: #800000;">',{<span style="color: #800000;">'<span style="color: #800000;">data_list<span style="color: #800000;">':data_list,<span style="color: #800000;">'<span style="color: #800000;">page_permission<span style="color: #800000;">'<span style="color: #000000;">:page_permission})
<span style="color: #0000ff;">def<span style="color: #000000;"> userinfo_add(request):
page_permission =<span style="color: #000000;"> BasePagePermission(request.permission_code_list)
<span style="color: #0000ff;">return render(request,<span style="color: #800000;">'<span style="color: #800000;">userinfo_add.html<span style="color: #800000;">',{ <span style="color: #800000;">'<span style="color: #800000;">page_permission<span style="color: #800000;">'<span style="color: #000000;">: page_permission})
<span style="color: #0000ff;">class<span style="color: #000000;"> OrderPagePermission(BasePagePermission):
<span style="color: #008000;">#<span style="color: #008000;">继承基础的,方便扩展
<span style="color: #0000ff;">def<span style="color: #000000;"> has_report(self):
<span style="color: #0000ff;">if <span style="color: #800000;">'<span style="color: #800000;">report<span style="color: #800000;">' <span style="color: #0000ff;">in<span style="color: #000000;"> self.code_list:
<span style="color: #0000ff;">return<span style="color: #000000;"> True
<span style="color: #0000ff;">def<span style="color: #000000;"> order(request):
order_permission =<span style="color: #000000;"> OrderPagePermission(request.permission_code_list)
</span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">'</span><span style="color: #800000;">order.html</span><span style="color: #800000;">'</span>)</pre>


{% extends
%{% block content %<span style="color: #000000;">}
{% <span style="color: #0000ff;">if page_permission.has_add %<span style="color: #000000;">}
<a href=<span style="color: #800000;">"<span style="color: #800000;">/userinfo/add/<span style="color: #800000;">">添加<span style="color: #000000;">
{% endif %<span style="color: #000000;">}
<table><span style="color: #000000;">
{% <span style="color: #0000ff;">for row <span style="color: #0000ff;">in data_list %<span style="color: #000000;">}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td><span style="color: #000000;">
{% <span style="color: #0000ff;">if page_permission.has_edit %<span style="color: #000000;">}
<td><a href=<span style="color: #800000;">"<span style="color: #800000;">#<span style="color: #800000;">">编辑</td><span style="color: #000000;">
{% endif %<span style="color: #000000;">}
{% <span style="color: #0000ff;">if page_permission.has_del %<span style="color: #000000;">}
<td><a href=<span style="color: #800000;">"<span style="color: #800000;">#<span style="color: #800000;">">删除</td><span style="color: #000000;">
{% endif %<span style="color: #000000;">}
</tr><span style="color: #000000;">
{% endfor %<span style="color: #000000;">}
</span></table><span style="color: #000000;">
{% endblock %}
三、总结
rbac里有什么?

settings中有什么?
INSTALLED_APPS =,
<span style="color: #008000;">#<span style="color: #008000;">########加入我们自定义的中间件,使其生效########
MIDDLEWARE =<span style="color: #000000;"> [
<span style="color: #800000;">'<span style="color: #800000;">rbac.middlewares.rbac.RbacMiddleware<span style="color: #800000;">'<span style="color: #000000;">,]
<span style="color: #008000;">#<span style="color: #008000;">############CSS,JS,JQ############
STATICFILES_DIRS =<span style="color: #000000;"> (
os.path.join(BASE_DIR,<span style="color: #800000;">'<span style="color: #800000;">static<span style="color: #800000;">'<span style="color: #000000;">),)
<span style="color: #008000;">#<span style="color: #008000;">#########Session中用到的变量#############
PERMISSION_URL_DICT_KEY = <span style="color: #800000;">"<span style="color: #800000;">permission_url_dict<span style="color: #800000;">"<span style="color: #000000;">
PERMISSION_MENU_KEY = <span style="color: #800000;">"<span style="color: #800000;">permission_menu_key<span style="color: #800000;">"
<span style="color: #008000;">#<span style="color: #008000;">####白名单############
<span style="color: #000000;">
VALID_URL =<span style="color: #000000;"> [
<span style="color: #800000;">"<span style="color: #800000;">/login/<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">/admin.*<span style="color: #800000;">"<span style="color: #000000;">
]
使用方法
1.创建project
2.复制rbac文件
3.在settings中按上面的设置
4.去admin中配置文件,录入权限信息
5.在登陆逻辑中,登陆成功时,调用init_permission方法(为此要在视图函数中导入
from rbac import models
from rbac.service.init_permission import init_permission
)
6.视图函数中用来判断是否具有code操作
<span style="color: #0000ff;">class<span style="color: #000000;"> OrderPagePermission(BasePagePermission):
<span style="color: #008000;">#<span style="color: #008000;">继承基础的,方便扩展
<span style="color: #0000ff;">def<span style="color: #000000;"> has_report(self):
<span style="color: #0000ff;">if <span style="color: #800000;">'<span style="color: #800000;">report<span style="color: #800000;">' <span style="color: #0000ff;">in<span style="color: #000000;"> self.code_list:
<span style="color: #0000ff;">return<span style="color: #000000;"> True
<span style="color: #0000ff;">def<span style="color: #000000;"> order(request):
order_permission =<span style="color: #000000;"> OrderPagePermission(request.permission_code_list)
</span><span style="color: #0000ff;">return</span> render(request,<span style="color: #800000;">'</span><span style="color: #800000;">order.html</span><span style="color: #800000;">'</span>)</pre>
前端页面只需要
{% if page_permission.has_add %}
{% endif %}
7. 模板中:
{%load rbac %} 加载自定义标签
引用rbac中的CSS
{% menu_html request%} 调用自定义menu_html标签,并传入request参数
引用rbac中的JS
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!