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)
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