一:导入一个新应用文件夹并进行配置.
1,创建一个新的应用文件夹:取名rbac django-admin createapp rbac 2,然后要在settings里面apps下面添加rbac INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', 'rbac.apps.RbacConfig' ] 最后一行就是引入Rbac,如果不知道可以看上面一条app01
二.开始创建程序:
开始之前,要确定好我们要写的是一个封装组件,后期可以直接拿出来用.
你打算做成组件,就必须封装好,等以后直接调用就行.
1,首先创建url文件,并创建html文件,并在视图函数里面写代码.

def login(request): if request.method=='GET': #创建html文件 return render(request,'login.html') else: name=request.POST.get('name') pwd=request.POST.get('pwd') user=models.User.objects.get(name=name,password=pwd) #取出客户端输入的内容对象. if not user: #进行判断 return redirect('/login/') #如果匹配不到,就返回login页面. else: #加上session 路径判断, 吧路径权限放在session里面 #在外面创建文件夹是因为以后可以再利用 permission(user,request) #这是调用其他页面的函数(给session里面加上值,该user的所有权限路径.) return redirect('/index/')
下面代码是上面permission(user,request)的详细代码
这是一个给session加上权限路径的代码,并且是一个可以给后面其他应用调用组件.

from django.conf import settings def permission(user,request): #利用user连表查询他的角色,并且利用角色查到该角色的权限路径,并最后在去重 all_permission=user.role.values('permission__url').distinct() #再把结果添加到settings文件里面去, request.session[settings.PERMISSION_URLS]=[ url['permission__url'] for url in all_permission]
2,配置中间件,为后面做准备
第一,要给login和admin等不需要权限命令的页面,做一个中间件,让login和admin页面可以直接用过.

1,中间件必须要继承类 class MiddlewareMixin(object): def __init__(self, get_response=None): self.get_response = get_response super(MiddlewareMixin, self).__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) if not response: response = self.get_response(request) if hasattr(self, 'process_response'): response = self.process_response(request, response) return response 每一个版本的,中间件类不一定是一样的.自己注意
在中间件类下面,自己定义类,继承上面的类.
这里要注意配置中间件的格式,

MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'rbac.middleware.PermissionMiddleware', # 文件夹 ---中间件文件--中间件的类 ] 这里是根据的是路径分配,以manage.py文件为起点.

import re class permission(MiddlewareMixin): #继承上面的类 def process_request(self,request): request_url=request.path_info for url in settings.MYINFO: if re.match(url,request_url): return None per_url =request.session.get(settings.PERMISSION_URLS) if not per_url: #如果里面没有session return redirest('/login/') tag=False for new_url in per_url: #把里面所有的权限路径拿出来遍历 if re.match(new_url,request_url): #如果匹配到了 tag=True break #这里不用return是因为,项目可能不止这些中间件,如果return的话,后面所有的中间件就不执行. if not tag: return redirest('/login/') 因为没有匹配到,就直接返回