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

Django权限1的更多相关文章

  1. django权限控制

    django 权限机制的实现: http://blog.igevin.info/posts/django-permission/

  2. [Python学习] Django 权限控制

    本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事. 一.主要内容 1.什么是权限管理? 2.Web 权限 3.Django 权限机制 ...

  3. Django权限机制的实现

    Django权限机制的实现 1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发 ...

  4. django权限管理(Permission)

    什么是权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自 己被授权的资源 权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个 系统有多 ...

  5. django权限之二级菜单

    遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None   反向查询,起名用的 ...

  6. 一.8.django权限管理/drf权限管理

    1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...

  7. Django 权限管理

    对于Django而言,虽然自带了一些基本的通用权限限制,但现实中,可能我们更希望自己去定义业务权限划分 Django对于权限这块的部分验证方法 user = request.user user.is_ ...

  8. 【Python】django权限管理

    参考:http://www.cnblogs.com/esperyong/ 参考:https://docs.djangoproject.com/en/1.8/topics/auth/default/#t ...

  9. Django权限管理测试

    测试内容:当我单击登录页面登录的时候页面会弹出当前用户的个人信息 当我点击提交的时候可以看到我当前用户的所有权限: 测试成功,接下来看一下后台的简单代码: class User(models.Mode ...

  10. django(权限、认证)系统——第三方组件实现Object级别权限控制

    在我的系列blog<Django中内置的权限控制>中明确提及到,Django默认并没有提供对Object级别的权限控制,而只是在架构上留了口子.在这篇blog中,我们探讨一个简单流行的Dj ...

随机推荐

  1. 霍尼韦尔1450g二维码扫码枪中文识别。

    USB接口模拟COM串口驱动程序 HSM USB Serial Driver 链接: https://pan.baidu.com/s/1aOV-Fz0OYdQGc5dMmkHzgg 提取码: fwgt ...

  2. 手机APP测试

    注:以下内容来自网络: 一.手机APP测试类型 1.1 接口协议测试 在APP客户端开发设计时,一般服务端会提供相应的接口协议文档,接口协议文档的质量,决定了APP的开发进度.此部分的测试,应首先检测 ...

  3. Glib学习笔记(一)

    你将学到什么 如何使用GObject实现一个新类 类头文件 声明一个类型的方法选择取决于类型是可被继承的还是不可被继承的. 不可被继承的类型(Final类型)使用G_DECLARE_FINAL_TYP ...

  4. Java基础之8个基本类型及基本类型间转换

    8种基本数据类型 Java语言有8种基本数据类型, 分别用于存储整数.浮点数.字符数据和布尔类型数据.需要注意的是: 现在所介绍的仅仅是基本数据类型,后续还会介绍很多非基本数据类型.基本数据类型如图 ...

  5. web flash推流h264视频取消cbr

    flash as3.0 推视频H264关于视频质量 初次设置代码如下: h264Setting.setProfileLevel(H264Profile.BASELINE, H264Level.LEVE ...

  6. POI操作Excel:cell的背景颜色类型

    POI中背景颜色设置方法如下: HSSFCellStyle style = workbook.createCellStyle(); style.setFillBackgroundColor(HSSFC ...

  7. socket套接字基本概念

    int socket()函数创建的是套接字socket,返回的是socket描述符(套接字描述符),其实就是文件描述符,socket(套接字)其实就是文件 socket()创建了套接字(文件),只是开 ...

  8. PANet训练自己的数据(VIA标注)

    当前最好的实例分割网络非PANet莫属,可是由于模型太新,网上的资料太少,最近的项目需要 实例分割,只能自己踩踩坑了,目前我还没看到一篇关于PANet训练的博客,只有几篇讲论文的. 环境:ubuntu ...

  9. C语言中typedef的解释_2

    typedef工具是一个高级数据特性.利用typedef可以为某一类型自定义一个新的名称.这样可以提高程序的可读性,可移植性,向用户表明特定用途. typedef没有创建任何新的类型,它只是为某个已存 ...

  10. P4332 [SHOI2014]三叉神经树(LCT)

    Luogu4332 LOJ2187 题解 代码-Tea 题意 : 每个点有三个儿子 , 给定叶节点的权值\(0\)或\(1\)且支持修改 , 非叶子节点的权值为当有\(>=2\)个儿子的权值为\ ...