zoukankan      html  css  js  c++  java
  • 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,现在就可以了  大功告成

  • 相关阅读:
    从0开始学习C#第三天
    金盾视频加密器V2014视频加密原理分析
    从0开始学习C#第二天
    从0开始学习C#第一天
    hook NtTerminateProcess进行应用的保护
    Wireshark简单使用教程3——附视频
    Wireshark简单使用教程2——附视频
    Wireshark简单使用教程1——附视频
    一个bat病毒分析(part1)
    社团的CTF逆向题WriteUp
  • 原文地址:https://www.cnblogs.com/lzqrkn/p/9956462.html
Copyright © 2011-2022 走看看