Django权限1
1.权限,说白了就是你有资格访问这个网址,而别人每一资格;你有资格进行增删改查,而别人只有查的权限
2.新建是3张表:
#用户表 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField(max_length=32) #和Role(角色表)建立多对多的关系 role = models.ManyToManyField('Role') def __str__(self): return self.name #角色表 class Role(models.Model): title = models.CharField(max_length=32) #和Permission(权限表)建立多对多的关系 permission=models.ManyToManyField('Permission') def __str__(self): return self.title class Permission(models.Model): title = models.CharField(max_length=32) #不同的角色的人有不同的访问网址 url = models.CharField(max_length=32) def __str__(self): return self.title
3.进行数据的迁移
makemigrations
migrate
4.表的关系已经生成,可是表里现在没有数据,也就是没有我们现在测试不出来效果,不多说,直接登录后台录入数据
admin.py from django.contrib import admin #把表引过来 #from app01.models import User #from app01.models import Role #from app01.models import Permission admin.site.register(User)admin.site.register(Role)admin.site.register(Permission) #以上三种情况也可以进行插入数据,但是显示出来的是一个个的对象,建议使用下面的代码: admin.site.register(User) class RoleConfig(admin.ModelAdmin): # 按照指定的字段 显示 list_display=["title"] admin.site.register(Role,RoleConfig) #自定义的类,让它按照我想要的字段进行展示,啥名字都可以,但是一定要记得继承ModelAdmin这个类 class PermissionConfig(admin.ModelAdmin): list_display=["pk","title","url"] ordering = ["pk"] admin.site.register(Permission,PermissionConfig)
5.好,现在创建一个超级管理,然后登陆admin后台进行插入数据
6.创建之后直接跑项目,进入后台
######http://127.0.0.1:8000/admin/####### #http://127.0.0.1:8000这是我的本地的ip和端口号 #/admin/就是后台管理系统,回车之后就会有登录窗口,用创建的超级用户进行登录,插入数据
7.
权限,用户,角色就是我们刚刚创建的3张表
8.对应的权限,也就是哪个角色有什么网址现在都已处理好,剩下的都类似哈
9.创建对应的路由
urlpatterns = [ path('admin/', admin.site.urls), path('login/',views.login), path('orders/', views.order), path('orders/add/', views.addorder), re_path('orders/edit/(\d+)/', views.editorder), re_path('orders/delete/(\d+)/', views.deleteorder), path('customers/', views.customers), path('customers/add/', views.addcustomers), re_path('customers/edit/(\d+)/', views.editcustomers), re_path('customers/delete/(\d+)/', views.deletecustomers), ]
10.对应的函数,简写了就
from django.shortcuts import render,HttpResponse,redirect from app01.models import User,Role # Create your views here. def order(request): return HttpResponse("order...") def addorder(request): return HttpResponse("addorder...") def editorder(request,id): return HttpResponse("editorder...") def deleteorder(request,id): return HttpResponse("deleteorder...") def customers(request): return HttpResponse("customers...") def addcustomers(request): return HttpResponse("addcustomers...") def editcustomers(request,id): return HttpResponse("editcustomers...") def deletecustomers(request,id): return HttpResponse("deletecustomers...")
11.ok,现在开始我们的测试内容
创建用户登录
#urls.py path('login/',views.login), #views.py def login(request): if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') user = User.objects.filter(name=user,pwd=pwd).first() if user: #把用户的信息保存在session中 request.session['user_id']=user.pk #查看当前等路人的权限 ,distinct()去重 permission=Role.objects.filter(user=user).values('permission__url').distinct() print(permission) #新建列表把权限进行循环,取到里面的每一个url permission_list = [] for item in permisssion: permission_list .append(item['permission__url']) # 把当前登录人的全县列表加入到列表中 request.session['permission_list']=permissions_list return HttpResponse('ok') return render(request,'login.html') #templates新建一个HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {#form自带提交功能,不用写什么Ajax,还有,必须有name字段,没有name字段前段接收不到#} <form action="" method="post"> {% csrf_token %} 用户名<input type="text" name="user"> 密码<input type="text" name="pwd"> <input type="submit"> </form> </body> </html>
12.重头器,现在我们访问哪个页面都可以,因为我们还没有进行校验,现在的情况下就是没有权限,而我们现在就需要中间件,因为不管啥时候,都必须要走中间件,在中间件进行判断
12.1创建一个py文件-----
#middlewares.py from django.utils.deprecation import MiddlewareMixin import re class PermissionMiddleWare(MiddlewareMixin): def process_request(self,request): current_path = request.path #社会白名单 for reg in ['/login/','/admin/*'] #search 用法:在整个current_path中查询reg ret = re.search(reg,current_path) if ret: return None #直接判断有没有登录 user_id = request.session.get('user_id') if not user_id: return redirect('/login/') #j校验数据 permission_list = reuqest.session.get('permission_list') for reg in permission_list: reg = '^%s$'%reg ret = re.search(reg,current_path) if ret: return None return HttpResponse('无权访问')
ok,现在就可以了 大功告成