django--权限管理day1

一:导入一个新应用文件夹并进行配置.

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/')    
views代码

 

下面代码是上面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]
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/') 因为没有匹配到,就直接返回



   
中间件-判断路径以及权限

 

posted @ 2017-11-07 22:03  forjie  阅读(251)  评论(0编辑  收藏  举报