python-DRF_RBAC-基于角色的访问控制_xadmin的使用_django缓存_django信号

9 篇文章 1 订阅

DRF-Django rest framework

1. RBAC-基于角色的访问控制

1. 什么是RBAC

# 概念
	RBAC 是基于角色的访问控制(Role-Based Access Control )
    在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。
    
# 应用
RBAC - Role-Based Access Control

# Django的Auth组件采用的认证规则就是RBAC
	1. 像专门做人员权限管理的系统(CRM系统)都是公司内部使用,所以数据量都在10w一下,一般效率要求也不是很高
	2. 用户量极大的常规项目,会分两种用户:前台用户(三大认证) 和 后台用户(BRAC来管理)   
    
# 结论
	没有特殊要求的Django项目可以直接采用Auth组件的权限六表,不需要自定义六个表,也不需要断开表关系,单可能需要自定义User表
    
# 前后台权限控制 
	# 后台管理中(公司内部系统):使用RBAC,基于角色的访问控制
	1. 后台用户对各表操作,是后台项目完成的,我们可以直接借助admin后台项目(Django自带的)
	2. 后期也可以用xadmin框架来做后台用户权限管理
    # 前台(主站)的权限管理:权限,频率,认证 控制
	3. 前台用户的权限管理如何处理
        定义了一堆数据接口的视图类,不同的登录用户是否能访问这些视图类
        能就代表有权限,不能就代表无权限
        前台用户权限用drf框架的 三大认证

2. Django的内置RBAC(六表)

权限三表

在这里插入图片描述

权限六表

在这里插入图片描述

RBAC的表设计
# rbac的表设计

1. 最初3张表
	用户表  角色表   权限表
    
2. 5张表
	用户表  角色表   权限表
	用户表和角色表是多对多,需要建立第三张表
	角色和权限是多对多,需要建立第三张表
    
3. 6张表
    用户表  角色表   权限表
    用户表和角色表是多对多,需要建立第三张表
    角色和权限是多对多,需要建立第三张表
    用户和权限多对多,建立第三张表

# django内置了rbac的6张表 (公司常用)
    auth_user:                 用户表,扩写
    auth_group:                角色表(组表)
    auth_permission:           权限表
    auth_user_groups:          用户对角色的中间表
    auth_group_permissions:    角色对权限的中间表
    auth_user_user_permissions:用户对权限的中间表

3. RBAC示例

1. models.py
from django.db import models

from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
    mobile = models.CharField(max_length=11, unique=True)

    def __str__(self):
        return self.username


class Book(models.Model):
    name = models.CharField(max_length=64)

    def __str__(self):
        return self.name


class Car(models.Model):
    name = models.CharField(max_length=64)

    def __str__(self):
        return self.name
2. admin.py
from . import models

from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin

# 自定义User表后,admin界面管理User类
class UserAdmin(DjangoUserAdmin):
    # 添加用户课操作字段
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2', 'is_staff', 'mobile', 'groups', 'user_permissions'),
        }),
    )
    # 展示用户呈现的字段
    list_display = ('username', 'mobile', 'is_staff', 'is_active', 'is_superuser')


admin.site.register(models.User, UserAdmin)
admin.site.register(models.Book)
admin.site.register(models.Car)

2. Xadmin的使用

​ xadmin是Django的第三方扩展,可是使Django的admin站点使用更方便,就是Django的一个app。

​ 文档:https://xadmin.readthedocs.io/en/latest/index.html

1. 安装

区分1.x和2.x (安装方法)

    1.x  pip3 install xadmin
    
    2.x  pip3 install git+git://github.com/sshwsfc/xadmin.git@django2
         pip3 install https://codeload.github.com/sshwsfc/xadmin/zip/django2

2. 环境搭建

django2.x + xadmin 2.x 环境搭建

	1. 安装
    	pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2

    2. 在app中注册
        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
		# 把apps目录设置环境变量中的导包路径
		sys.path.append( os.path.join(BASE_DIR,"luffy/apps") )
        
        INSTALLED_APPS = [
            ...
            'xadmin',
            'crispy_forms',
            'reversion',
            ...
        ]
     3. 修改国际化
            # 修改使用中文界面
            LANGUAGE_CODE = 'zh-Hans'
            # 修改时区
            TIME_ZONE = 'Asia/Shanghai'
            
     4. 数据迁移
            python3 manage.py makemigrations
            python3 manage.py migrate
            
     5. 配置路由信息
        	import xadmin
            xadmin.autodiscover()
            # version模块自动注册需要版本控制的 Model
            from xadmin.plugins import xversion
            xversion.register_models()

            urlpatterns = [
                path('xadmin/', xadmin.site.urls)
            ]
            
	 6. 创建超级用户
        	python manage.py createsuperuser
        
     7. 登录,访问地址,输入用户名密码进入
        	http://127.0.0.1:8000/xadmin/

3. 使用及美化

  • xadmin不再使用Django的admin.py,而是需要编写代码在adminx.py文件中。
  • xadmin的站点管理类不用继承admin.ModelAdmin,而是直接继承object即可。
1. 站点的全局配置
import xadmin
from xadmin import views

class BaseSetting(object):
    """xadmin的基本配置"""
    enable_themes = True  # 开启主题切换功能
    use_bootswatch = True

xadmin.site.register(views.BaseAdminView, BaseSetting)

class GlobalSettings(object):
    """xadmin的全局配置"""
    site_title = "路飞学城"          # 设置站点标题
    site_footer = "路飞学城有限公司"  # 设置站点的页脚
    menu_style = "accordion"       # 设置菜单折叠

xadmin.site.register(views.CommAdminView, GlobalSettings) 
2. 站点Model管理
# 示例 (写一个类)
    class BookClass():
        # 该表展示的字段
        list_display = ['id', 'name', 'price','publish']
        # 按照这些字段搜索
        search_fields = ['id','name']
        # 按哪些字段过滤
        list_filter = ['is_delete']
        # 可以把数据导出成excel,json,xml格式
        list_export = ('xls', 'xml', 'json')
        # list_export设置为None来禁用数据导出功能
        list_export_fields = ('id', 'name', 'price')
        data_charts = {
            "order_amount": {
                'title': '随便写',
                "x-field": "price",
                "y-field": ('publish',),
                "order": ('id',)
            },
        }
        
    # 注册
    xadmin.site.register(models.Book,BookClass)

# xadmin页面样式控制属性 
    list_display       控制列表展示的字段 
    search_fields      控制可以通过搜索框搜索的字段名称,xadmin使用的是模糊查询
    list_filter        可以进行过滤操作的列,对于分类、性别、状态
    ordering           默认排序的字段
	readonly_fields    在编辑页面的只读字段
	exclude            在编辑页面隐藏的字段
	list_editable      在列表页可以快速直接编辑的字段
	show_detail_fields 在列表页提供快速显示详情信息
    
	refresh_times      指定列表页的定时刷新
		refresh_times = [5, 10,30,60]  # 设置允许后端管理人员按多长时间(秒)刷新页面
        
	list_export    控制列表页导出数据的可选格式
		list_export = ('xls', 'xml', 'json')  # list_export设置为None来禁用数据导出功能
		list_export_fields = ('id', 'btitle', 'bpub_date')
        
	show_bookmarks 控制是否显示书签功能
    	show_bookmarks = True

    data_charts 控制显示图表的样式
		data_charts = {
            "order_amount": {
              'title': '图书发布日期表', 
              "x-field": "bpub_date", 
              "y-field": ('btitle',),
              "order": ('id',)
            },
            
        #    支持生成多个不同的图表
        #    "order_amount": {
        #      'title': '图书发布日期表', 
        #      "x-field": "bpub_date", 
        #      "y-field": ('btitle',),
        #      "order": ('id',)
        #    },
        }	   
        
        title   控制图标名称
        x-field 控制x轴字段
        y-field 控制y轴字段,可以是多个值
        order   控制默认排序
        
	model_icon  控制菜单的图标
    	class BookInfoAdmin(object):
   			model_icon = 'fa fa-gift'
		# 注册
		xadmin.site.register(models.BookInfo, BookInfodmin)	

3. django缓存

1. 缓存位置

# 缓存位置
    1 内存中
    2 文件中(硬盘上)
    3 数据库缓存
    4 redis中(后期都用它)

# 通过配置,设置缓存位置
# 以文件缓存为例
CACHES = {
	'default': {
        # 指定缓存使用的引擎   
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 
        # 指定缓存的路径
        'LOCATION': '/var/tmp/django_cache',
        # 缓存超时时间(默认为300秒,None表示永不过期)
        'TIMEOUT':300,              
        'OPTIONS':{
            # 最大缓存记录的数量(默认300)
            'MAX_ENTRIES': 300,  
            # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)
            'CULL_FREQUENCY': 3,          
        }
    }   
}

2. 缓存粒度

1. 三种粒度
	1. 整站缓存 
    2. 单页面缓存 
    3. 局部缓存

2. 单页面缓存
	from django.views.decorators.cache import cache_page
    @cache_page(5)
    def index(request):
        import time
        ctime=time.time()
        return render(request,'index.html',context={'ctime':ctime})
    
3. 页面中某个位置缓存(局部缓存)
	# 缓存3s钟。xxx唯一key,唯一的
	{% load cache %}
    {% cache 3 'xxx'%}
    这一部分用缓存
    时间为:{{ ctime }}
    {% endcache %}
    
4. 整站缓存(两个中间件)
	# 在setting中配置
	‘django.middleware.cache.UpdateCacheMiddleware’, #第一,重写了process_response
    '......',
    ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后,重写了process_requset
    # 缓存过期时间
    CACHE_MIDDLEWARE_SECONDS=5

3. 前后端分离后缓存使用

1. 查出一堆json格式数据,链表查了8个表 

2. 前后端分离以后需要知道
	1. 如何把字典,字符串,对象放到缓存中
    2. 如何取出来
    
3. 具体使用
from django.core.cache import cache
class BookView(APIView):
    def get(self, request):
        res_data = cache.get('book_list_dix',)
        # 有缓存,直接返回
        if res_data: 
            print('走了缓存')
            return Response(res_data)
        # 没有缓存,再走数据库
        else:  
            book_list = models.Book.objects.all()
            ser = serializer.BookSer(book_list, many=True)
            # 想把ser.data缓存起来
            cache.set('book_list_dix', ser.data,100)
            print('没走缓存')
            return Response(ser.data)
        
4. cache可以缓存所有数据类型,包括自定义的类(pickle)

4. django信号

1. Django提供一种信号机制
	当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行

2. Django内置信号
Model signals
    pre_init                    # django的modal执行其构造方法前,自动触发
    post_init                   # django的modal执行其构造方法后,自动触发
    pre_save                    # django的modal对象保存前,自动触发
    post_save                   # django的modal对象保存后,自动触发
    pre_delete                  # django的modal对象删除前,自动触发
    post_delete                 # django的modal对象删除后,自动触发
    m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
    
Management signals
    pre_migrate                 # 执行migrate命令前,自动触发
    post_migrate                # 执行migrate命令后,自动触发
    
Request/response signals
    request_started             # 请求到来前,自动触发
    request_finished            # 请求结束后,自动触发
    got_request_exception       # 请求异常后,自动触发
    
Test signals
    setting_changed             # 使用test测试修改配置文件时,自动触发
    template_rendered           # 使用test测试渲染模板时,自动触发
    
Database Wrappers
    connection_created          # 创建数据库连接时,自动触发
    
3. 内置信号的使用(两种方式)
		# 1 导入内置信号
        	from django.core.signals import request_started
        
        # 2 写一个函数
            def aa(sender, **kwargs):
                 print(sender)
                 print(kwargs)
                 print('请求来了,我写日志了。。。')
      
        # 3 跟内置信号绑定
        	request_started.connect(aa)

            # 方式二
            from django.core.signals import request_started,request_finished
            from django.dispatch import receiver
            @receiver(request_finished)  # 内置信号pre_save和my_callback函数绑定了
            def my_callback(sender, **kwargs):
                print("请zzou了,走了我")
                
4. 信号的应用场景
    记录日志(对象创建就写入日志)
    解耦合 

环境变量相关

1. 环境变量类型
	1. 用户环境变量
    2. 系统环境变量
    
2. 环境变量作用
	在任意目录下敲命令能不能找得到想要执行的应用程序
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I believe I can fly~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值