drf认证组件

昨日回顾:
    -HyperlinkedIdentityField(用来生成url),传三个参数
        -实例化序列化类的时候,BookSerializer(ret, many=True, context={'request': request})
    -序列化组件的数据校验
        -类比forms组件
        -局部(value是该字段的值)
            -validate_字段名(self,value)
        -全局钩子函数(通过校验值的字典)
            -validate(self,value)
            
    -认证
        -写一个类:
            class LoginAuth():
                # 函数名一定要叫authenticate,接收必须两个参数,第二个参数是request对象
                def authenticate(self, request):
                    # 从request对象中取出token(也可以从其它地方取)
                    token = request.query_params.get('token')
                    # 去数据库过滤,查询
                    ret = models.UserToken.objects.filter(token=token)
                    if ret:
                        # 能查到,说明认证通过,返回空
                        # ret.user就是当前登录用户对象,一旦retrun了,后面的认证类都不执行了
                        return ret.user,ret
                    # 如果查不到,抛异常
                    raise exceptions.APIException('您认证失败')
        
        -局部使用:
            -在视图类中加一行:
            -authentication_classes = [LoginAuth, ]
        -全局使用
            -在setting中配置:
                REST_FRAMEWORK={
                    'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.LoginAuth',]
                }
            -局部禁用:                
                -在视图类中加一行:
                    -authentication_classes = []
        
    -token表设置超时时间字段
    -token原理
        -'adfasdfasd'
        -'sdafasdfasf|{id:1,'name':}'
        -'asdfasdasd|2'
        
        
    -权限
        权限是什么?
        -写一个类
            class UserPermission():
                # message是出错显示的中文
                message='您没有权限查看'
                def has_permission(self, request, view):
                    user_type = request.user.user_type
                    # 取出用户类型对应的文字
                    # 固定用法:get_字段名字_display()
                    user_type_name = request.user.get_user_type_display()
                    print(user_type_name)
                    if user_type == 2:
                        return True
                    else:
                        return False
        -使用
            -局部使用
                -在视图类中加一行:
                -permission_classes = [LoginAuth, ]
                
            -全局使用
                -在setting中配置
                    REST_FRAMEWORK={
                        'DEFAULT_PERMISSION_CLASSES':['app01.MyAuth.UserPermission',]
                    }
                -局部禁用
                    -在视图类中加一行:
                    -permission_classes = [ ]
    
        

    
    

 

posted @ 2020-07-28 23:58  xuqidong  阅读(105)  评论(0编辑  收藏  举报