drf10

昨日回顾

1 基于jwt的多方式登录
	-login
	-之前写的处理逻辑都是在视图类中
    -这次把逻辑拿到序列化类中validate方法中,在视图函数中不用写逻辑,is_valide
    -重点:视图类和序列化类之间交互数据的桥梁 context={}
2 自己定义用户表,登录手动签发token,自己定义的认证类
	-认证通过,正常情况下查询得到当前登录用户(访问数据库),但是咱们出于效率的考虑没有查询数据,自己构造了一个User对象
3 jwt中重要的
	-几个函数:
        -payload = jwt_decode_handler(token)  # 解码过程
        -payload = jwt_payload_handler(user)  # 加码的过程
        -token = jwt_encode_handler(payload)  # 通过payload得到token
    -配置文件:
    	-token过期时间
 4 book的多表增删查改,群增,群删,群查,群改
	-群查,单查
    -单增,群增:  序列化类,初始化的时候,指定many=True,得到的是ListSerializer对象
    -单删,群删:合二为一
    -单改,群改:
    	两种方法:
        	-自行for循环
            -重写ListBookSerializer,重写update方法,BookSerializer要跟ListBookSerializer建立联系,list_serializer_class=ListBookSerializer

今日内容

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

RBAC :是基于角色的访问控制(Role-Based Access Control )
在 RBAC  中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
# 后台管理中(公司内部系统):使用RBAC,基于角色的访问控制
# 前台(主站)的权限管理:权限,频率,认证 控制
# rbac的表设计
# 最初3张表
用户表  角色表   权限表
# 5张表
用户表  角色表   权限表
用户表和角色表是多对多,需要建立第三张表
角色和权限是多对多,需要建立第三张表
# 6 张表
用户表  角色表   权限表
用户表和角色表是多对多,需要建立第三张表
角色和权限是多对多,需要建立第三张表
用户和权限多对多,建立第三张表

# django内置了rbac的6张表
auth_user:用户表,扩写
auth_group:角色表(组表)
auth_permission:权限表
auth_user_groups:用户对角色的中间表
auth_group_permissions:角色对权限的中间表
auth_user_user_permissions:用户对权限的中间表
# 公司内部项目,后台管理喜欢用django,内置了rbac6表

2 xadmin的使用

1 django内置了一个admin,有的人觉得丑,功能不够强大,这群人写了一个叫xadmin的,用来替换admin
2 django的一个app
3 如何使用
	-区分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
    -django2.x+xadmin 2.x 环境搭建
    	-安装
        -在app中注册
        	'xadmin',
            'crispy_forms',
            'reversion',
        -修改国际化
            # 修改使用中文界面
            LANGUAGE_CODE = 'zh-Hans'
            # 修改时区
            TIME_ZONE = 'Asia/Shanghai'
        -数据迁移
            python3 manage.py makemigrations
            python3 manage.py migrate
        -配置路由信息
        	import xadmin
            xadmin.autodiscover()
            # version模块自动注册需要版本控制的 Model
            from xadmin.plugins import xversion
            xversion.register_models()

            urlpatterns = [
                path('xadmin/', xadmin.site.urls)
            ]
		-创建超级用户
        	python manage.py createsuperuser
        -登录,访问地址,输入用户名密码进入
        	http://127.0.0.1:8000/xadmin/
4 美化
	-写一个类
    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)

3 django缓存

3.1 缓存位置

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

3.2 缓存粒度

1 三种粒度:整站缓存,单页面缓存,局部缓存
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.3 前后端分离后缓存使用

1 查出一堆json格式数据,链表查了8个表 
2 前后端分离以后,
	-只需要会如何是把字典,字符串,对象放到缓存中,
    -如何取出来
4 具体使用
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)
5 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 信号的应用场景:
		-记录日志(对象创建就写入日志)
    	-解耦合
原文地址:https://www.cnblogs.com/feiguoguobokeyuan/p/14044125.html