Django web框架之权限管理二

摘要:
1.登录deflogin(request):ifrequest。method==“GET”:returnrender(request,'login.html')else:username=request。帖子。get('user')password=请求。帖子。get('pwd')user=模型。使用者物体。筛选器(用户名=用户

1. login登录

def login(request):
    if request.method=="GET":
        return render(request,'login.html')
    else:
        username=request.POST.get('user')
        password=request.POST.get('pwd')
        user=models.User.objects.filter(username=username,password=password).first()
        if user:
            init_permission(user,request)
            return redirect('/index/')
        else:
            return redirect('/login/')

2. init_permission(user,request)定制Session

from django.conf import settings

def init_permission(user,request):
  # 取数据 permission_list = user.roles.values( 'permission__id', 'permission__title', 'permission__url', 'permission__code', 'permission__menu_group', 'permission__group_id', 'permission__group__caption', 'permission__group__menu_id', 'permission__group__menu__title', ).distinct() current_url = request.path_info # 过滤权限相关的 result = {} # 用户所有的操作代码和可访问的url地址——权限相关 for item in permission_list: group_id=item['permission__group_id'] code = item['permission__code'] url=item['permission__url'] if group_id in result: result[group_id]['codes'].append(code) result[group_id]['urls'].append(url) else: result[group_id]={ 'codes':[code,], 'urls':[url,], }    # Session中添加字典 request.session[settings.PERMISSION_URL_DICT_KEY] = result # 过滤菜单相关的 menu_list = [] for item in permission_list: msg = { 'id': item['permission__id'], 'title': item['permission__title'], 'url': item['permission__url'], 'menu_gp_id': item['permission__menu_group'], 'menu_id': item['permission__group__menu_id'], 'menu_title': item['permission__group__menu__title'], } menu_list.append(msg)    # Session中添加字典  request.session[settings.PERMISSION_MENU_KEY]=menu_list

3. setting配置

PERMISSION_URL_DICT_KEY='permission_url_dict'   # 权限url数据
PERMISSION_MENU_KEY='permission_menu_dict'      # 菜单字典数据

4. 创建中间件

路径:E:permission80 bacmiddleware bac.py  

import re
from django.conf import settings
from django.shortcuts import redirect,render,HttpResponse

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
# 继承父类MiddlewareMixin方法
class RbacMiddleware(MiddlewareMixin):
    def process_request(self,request):
        current_url=request.path_info  # 取到用户方法的路径信息:譬如 /index/,/userinfo/
     # 判断用户访问的路径是否在白名单中
        for url in settings.VALID_URL:
            regax="^{0}$".format(url)
       # 如果匹配成功停止匹配,None继续往后面执行其他中间件,如果没有则直接到url路由规则中匹配,(/index/ ,views.index) if re.match(regax,current_url): return None      # 从Session中取到权限数据,用户权限下的路径 permission_dict=request.session.get(settings.PERMISSION_URL_DICT_KEY)
     # 如果没有则跳转到登录路径 if not permission_dict: return redirect('/login/') flag=False for group_id,code_url_dic in permission_dict.items(): for db_url in code_url_dic['urls']: regax="^{0}$".format(db_url)
          # 匹配当前用户权限的路径是哪一个路径 if re.match(regax,current_url):
            # 给request中添加一个字典,values对应用户访问的权限下的codes代码:譬如 add list edit request.permission_code_list=code_url_dic['codes'] flag=True break if flag: break if not flag: return HttpResponse('无权访问')

5. setting配置中间件

# 白名单
VALID_URL=[
    '/login/',
    '/logoff/',
    '/index/',
    '/test/',
    '/admin.*',
]

# 加入中间件列表中
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.rbac.RbacMiddleware',
]

6. 自定义模板

路径:E:permission80 bac emplatetags bactag.py

a. 首先创建模板目录templatetags,名称必须一样

import re

from django.conf import settings
from django.template import Library

register = Library()

# 引用html文件tag.html
@register.inclusion_tag('tag.html')
def menu_html(request):
    # 通过request取到定制session中的菜单数据
    permission_menu = request.session[settings.PERMISSION_MENU_KEY]
    current_url = request.path_info
    menu_dict = {}
    for item in permission_menu:
       # 判断组内菜单是否在menu_dict中
        if not item['menu_gp_id']:
            menu_dict[item['menu_id']] = item

    for item in permission_menu:
        regax = "^{0}$".format(item['url'])
       # 匹配用户访问的路径是menu_dict中哪一个,给访问的路径添加一条actvie活动匹配
        if re.match(regax, current_url):
            menu_gp_id = item['menu_id']
            if menu_gp_id:
               # 菜单组添加active
                menu_dict[menu_gp_id]['active'] = True
            else:
                # 组内菜单列表添加
                menu_dict[item['id']]['active'] = True

    result = {}
    for item in menu_dict.values():
        active = item.get('active')
        menu_id = item['menu_id']
        if menu_id in result:
            result[menu_id]['children'].append({'title': item['title'], 'url': item['url'], 'active': active})
            if active:
                result[menu_id]['active'] = True
        else:
            result[menu_id] = {
                'menu_id': item['menu_id'],
                'menu_title': item['menu_title'],
                'active': active,
                'children': [
                    {'title': item['title'], 'url': item['url'], 'active': active}
                ]
            }

    return {'menu_dict': result}
    

  

  

  

 

  

免责声明:文章转载自《Django web框架之权限管理二》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一个操作系统的实现(1)NGINX反向代理,header丢失的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django登录与注销

一:Django中自带着登录,验证功能不用自己再去写登录功能。 1、从相应模块导入组件功能 from django.contrib.auth import authenticate,login 2、从request中拿到用户名密码,验证,验证通过获取到用户对象,不通过为None。 username = request.POST.get("u...

Django第四章、 url配置

目录 一 URL配置 基本格式 参数说明 二 正则表达式详解 基本配置 注意事项 补充说明 三 分组命名匹配 URLconf匹配的位置 捕获的参数永远都是字符串 视图函数中指定默认值 include其他的URLconfs(也叫URL分发) 一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Djang...

Channels集成到Django消息实时推送

channel架构图 InterFace Server:负责对协议进行解析,将不同的协议分发到不同的Channel Channel Layer:频道层,可以是一个FIFO队列,通常使用Redis Django中配置Channel: CHANNEL_LAYERS的配置: CHANNEL_LAYERS = { "default": {...

Django文档——Model中的ForeignKey,ManyToManyField与OneToOneField

关联关系字段 (Relationship fields) ForeignKey,ManyToManyField与OneToOneField分别在Model中定义多对一,多对多,一对一关系。 例如,一本书由一家出版社出版,一家出版社可以出版很多书。一本书由多个作者合写,一个作者可以写很多书。 class Author(models.Model):...

django集成ansibe实现自动化

动态生成主机列表和相关参数 def create_admin_domain(admin_node): workpath = BASE_DIR + '/tools/ansible/script' hosts_file = BASE_DIR + '/tools/ansible/host/' + createhostfile() yml...

Django中的Model模型

Model模型 模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。 通常,每个模型对应数据库中唯一的一张表。 每个模型都是django.db.models.Model的一个Python 子类。 模型的每个属性都表示为数据库中的一个字段。 Django 提供一套自动生成的用于数据库访问的API; 这极大的减轻了开发人员的工作量,不...