• 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/') 因为没有匹配到,就直接返回
    
    
    
       
    中间件-判断路径以及权限
  • 相关阅读:
    JS设置Cookie过期时间
    linq to xml
    ToDictionary的用法
    为程序使用内存缓存(MemoryCache)
    NuGet的几个小技巧
    IIS 的几个小技巧
    在Visual Studio中使用NuGet管理项目库
    在ASP.NET MVC中,使用Bundle来打包压缩js和css
    在C#中使用WMI查询进程的用户信息
    WMI测试器
  • 原文地址:https://www.cnblogs.com/52forjie/p/7801370.html
Copyright © 2020-2023  润新知