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
    
  • 相关阅读:
    Python 学习日记 第七天
    Python 学习日记 第六天
    Python 学习日记 第五天
    Python 学习日记 第四天
    Redis 中的数据类型及基本操作
    Asp.net mvc 中View 的呈现(二)
    Asp.net mvc 中View的呈现(一)
    Asp.net mvc 中Action 方法的执行(三)
    Asp.net mvc 中Action 方法的执行(二)
    Asp.net mvc 中Action 方法的执行(一)
  • 原文地址:https://www.cnblogs.com/Doner/p/11039014.html
Copyright © 2011-2022 走看看