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,现在就可以了  大功告成

原文地址:https://www.cnblogs.com/lzqrkn/p/9956462.html