zoukankan      html  css  js  c++  java
  • day74 jicheng

    day74

    1 封装成组件

    1 新建一个app abcv
    2 建一个middleware.py (中间件)  和 p_input.py imp models 
    	def i_p(re,usr):权限   
    	view里 i_P(request,user)  传过来
    3 setting引入abcv.middl	
    
    
    
    
    
    
    # 左侧菜单
    {%menu request%}  自定义标签   inclusion_tag('rbac/menu.html')  #村长写
    

    admin

    list_editable = ['url', ]  #可以编辑
    list_display = ['url',] 	bool是x
    

    layout.html

    layout是模板
    class ='fa {{ foo.icon }}' 引进的图标
    {% include 'result.html'}  页面引入
    

    menu.html

    标签处于选中状态   前端可以
    在后端给他加 class: active  
    
    #这个 写活的  中间件 装饰器 和自定义标签 都行。 写死 customer
    for item in request.session['permisson_menu_list']
    	#if request.url == item['url']:
    	if re.match('^{}$'.format(item['url']),request.url)	# 添加/d的更好 
    		item['class'] = 'active'
    
    

    下午

    rbac权限

    1准备表

    class User(models.Model):
    class Role(models.Model):
    class Permission(models.Model):   给角色以权限 给用户以角色
    

    2 用户登陆 , 登陆成功之后,将用户的信息和用户的权限信息都注入到了session中

    perssions = mod.Per.ob.filter(role__user__name=user__obj.name).distinct()
    permission_list = [i.url for i in permissions]
    request.session['permission_list'] = permission_list
    

    3 中间件 权限认证

    白名单放行
    for i in ['/login/','/admin/.*'] : ret = re.search(i,req.pa)
    if ret : return None (放行)
    登陆认证
    user = request.sesion.get('user')  if not user: return red()
    权限认证
    for item in request.session['permission_list']: reg = '^%s$'%item 		ret = re.search(reg,requst.path)  if ret:rN
    

    权限

    左边菜单 : 登陆的身份不同,显示的菜单(操作)不同

    tools--run manage.py --startapp rbac 创建一个app

    新建一个serveice 文件夹

    把中间件程序写入文件夹(并且改setting的路径) 
    新建permission_inpu.py文件 
    在rabc.serveice.per_input 里引入models 写权限函数i_p
    
    view 里引入 rbac.serveice.permission_input.initial_session
    注入封装的  传过去 initial_session(request,user_obj)
    	
    	
    

    分成了两个app,第一个app是功能菜单,第二个app是权限注入

    url'r^" 都过来 include 路由分发 发到web.urls里

    layout.html 所有的html文件都是集成的这个html文件

    1. 怎么区别那个是左侧的
    Permission表里字段  is_menu 是否是菜单
    
    2. admin 里 
    list_editable = ['url','is_menu','icon(图标)']  
    list_display = ['url','is_menu','icon(图标)']  可以修改
    
    list_display = ['url','is_menu','icon(图标)']  只是展示
    
    fa-code-fork 图标fa开头fontawesome 阿里的
    
    3 两个static 
    不是一个同级的外部文件(各用个的吗 )
    要上线外部文件不是放在Django,有专门的静态文件返回的服务器
    或者是'/templates/login.html' 
    
    

    1 自己写

    permission_input.py  de 
    def initial_session(request,user):   
    		展示不同——改。分左侧右侧了  重新取is_menu(标志)
    	
    	permission = m.P.o.f(role__user__name=user_obj).distinct(	 for item in permission:
    		permission_list.append(item.url)
    		if item.is_menu:
    			per_menu_list.append({
    			title:item.title,
    			'url':item.url,
    			'icon':item.icon,
    			})
    	request.session['permission_list'] = permission_list
    	request.session['permission_menu_list'] = permission_menu_list
         
        生成menu的时候和验证的时候组成一套
        
    	
    

    layout.html

    ...
    {% for foo in request.session.permission_menu_list}
    	div	a {{foo.url}}				#万能的句点号
    	a href == '{foo.url}' >{{foo.title}}<  
    {%endfor}
    

    2 老村长做的

    rbac.py

    自定义标签
    
    from django.conf import settings
    import re
    
    @register.inclusion_tag('rbac/menu.html')
    def menu(request):
    	menu_list = request.session['permission_menu_list'] 
    	for item in menu_list:
    		url = item['url']
    		if re.match('^{}$'.format(url),request.path_info):
    			item['class'] = 'active'
    			break
    	return {'menu_list':menu_list}
    	
    	# 等于  render{'menu.thml',{'date':date} }
    	# 等于 include 'menu.html'  =组件引入 引入之前把数据给返过去了
    	
    
    
    2.1 插曲 自定义过滤器 标签

    过滤器存在的意义: 复用

    多了就好用了 ,逻辑多了不用重复写

    from django.utils.safestring import mark_safe
    return mark_safe('<h1>自定义标签</h1>')   这种格式才能保存h1的功能			not    # return '<h1>自定义标签</h1>'
    
    定义
    @register.filter
    def ff(v1,v2 = None):
        # return '<h1>自定义标签</h1>'
        return mark_safe('<h1>自定义标签</h1>')
    
    调用
    {% load xx %}
    {{ num|ff:'2'}}
    
    def tag(num):
    	return 
    	
    自定义标签
    @register.simple_tag
    def ftag(num):
        return '自定义标签'
    
    {% ftag num %}		调用顺序相反 + {% %}
    
    
    
    自定义标签
    @register.inclusion_tag('result.html')
    def intag(num):
        return {'data':[11,22,33]}
    
    result.html
    {% for i in data %}
        {{ i }}
    {% endfor %}
    
    test.html
    {% load xx %}
    {% intag num%}
    

    3 给点击的标签加样式

    1 自己写的模式

    单个函数写添加 
    缺点:每个函数都写一遍 多则不行 少也代码多
    def customer_lis(request):
        data_list = models.Customer.objects.all()
        for item in request.session['permission_menu_list']:
            if item['url'] == request.path:
                item['class'] = 'active'
    return render(request,'custom.html',{'data_list':data_list}) 
    
    menu.html
    {%for item in menu_list   
    a href = url   'class' = ‘{{item.class}}’
    
    
    写在中间件里:大材小用

    写装饰器也可以

    2 村长的模式

    自定义标签也可以 inclusion_tag()

    @register.inclusion_tag('rbac/menu.html')
    def menu(request):
    	menu_list = request.session.get('permission_menu_list')
    		# 左侧菜单栏的列表里面
    	for item in menu_list:
    		if re.match('^{}$'.format(item['url']),reqeust.path):
    			item['class'] = 'active'
    			break
    	return {'menu_list':menu_list}   
    

    自定义标签的使用

    user_obj - -
    permission_list = ['/customer/list','/customer/add/'...]
    permission_menu_list = [
    {'title':客户列表,‘url’:'/customer/list/'},
    {'title':缴费列表,‘url’:'/payment/list/'},]
    
    @inclusion_tag('menu.html') 
    def menu(request):
    	menu_list = request.session['perssion_menu_list']
    	return {'menu_list':menu_list}
    	
    menu.html
    {%for item in menu_list%}
    
    custmoer.html 
    {%extends 'layout.html'%}
    {%menu request%}
    
    

    重写一遍

    models.py

    from django.db import models
    class User(models.Model):
    	name = models.Ch(32)   pwd也是
    	roles = models.ManyToManyField('Role') 
        def_str_(self) : re self.name
    class Role() title 32 Permissions = MTM('Permission') str:tit
    class Permission() title  url 32   str_ : title 
    

    admin.py

    admin 只有一张表 
    为了操作 models   添加models,  引入为
    admin.site.register(models.Role)	
    

    自定义一下,加样式

    class PermissionAdmin(admin.ModelAdmin):
    	list_display = ['pk','title','url']   显示
    	list_editable = ['title','url']	可以编辑   ‘pk’不可编辑
        ordering = ['-pk']		倒叙
    
    admin.site.register(models.Permission,PermissionAdmin)	
    

    admin自定义类编辑展示页面

    view.py

    def login(request):
    	    user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            user_obj  =models.User.objects.filter(name=user,pwd=pwd).first()
            if user_obj:
            #登录成功,保存登录状态	
                request.session['user'] = user_obj.name
            #查询权限,保存到session	
                permissions = models.Permission.objects.filter(role__user__name=user_obj.name).distinct()
                permission_list = [i.url for i in permissions]
                request.session['permission_list'] = permission_list
    			
    

    middleware.py (权限认证)

    白名单放行
    if request.path in ['/login/']:
    return None
    if re.search('/admin/',request.path):
    return None
    
    
    登录认证
    user = request.session.get('user')
            if not user:
                return redirect('login')
    
    权限认证
    for item in request.session['permisson_list']:
                reg = '%s$'%item
                ret = re.search(reg,request.path)
                if ret:
                    return None
            else:
                return HttpResponse('不好意思,权限不够!!无权访问')
    
    

    错误

    1 白名单放行

         if request.path in ['/login/']:
                return None
    

    不是

         if request.path in ['login']:
                return None
    
  • 相关阅读:
    线性代数复习向量空间线性相关向量组的秩
    证明:将n(n为2的幂)个点的位反转环划分为长为j(2的幂)的连续片段,这些片段都是次序等价的(分布式算法)
    vim命令小合集
    poj2240floyd算法
    visual studio打开文件所在目录
    5个0,4个1组成的字符串中,出现01或10的次数为4的不同字符串个数
    max spacing kclustering(类似kruskal最小生成树)并查集Debuging
    算法导论16.35huffman树的表示
    最优二叉查找树optimalBSTC++实现2
    算法导论16.37
  • 原文地址:https://www.cnblogs.com/Doner/p/11039014.html
Copyright © 2011-2022 走看看