• 认证组件权限组件与频率组件


    认证组件

    认证简介

    只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件

    组件的使用

    1)models层:
    class User(models.Model):
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=32)
        user_type=models.IntegerField(choices=((1,'超级用户'),(2,'普通用户'),(3,'二笔用户')))
    
    class UserToken(models.Model):
        user=models.OneToOneField(to='User')
        token=models.CharField(max_length=64)
        
        
    2)新建认证类(验证通过return两个参数)
    from rest_framework.authentication import BaseAuthentication
    class TokenAuth():
        def authenticate(self, request):
            token = request.GET.get('token')
            token_obj = models.UserToken.objects.filter(token=token).first()
            if token_obj:
                return
            else:
                raise AuthenticationFailed('认证失败')
        def authenticate_header(self,request):
            pass
            
    
    3)viewdef get_random(name):
        import hashlib
        import time
        md=hashlib.md5()
        md.update(bytes(str(time.time()),encoding='utf-8'))
        md.update(bytes(name,encoding='utf-8'))
        return md.hexdigest()
    class Login(APIView):
        def post(self,reuquest):
            back_msg={'status':1001,'msg':None}
            try:
                name=reuquest.data.get('name')
                pwd=reuquest.data.get('pwd')
                user=models.User.objects.filter(username=name,password=pwd).first()
                if user:
                    token=get_random(name)
                    models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
                    back_msg['status']='1000'
                    back_msg['msg']='登录成功'
                    back_msg['token']=token
                else:
                    back_msg['msg'] = '用户名或密码错误'
            except Exception as e:
                back_msg['msg']=str(e)
            return Response(back_msg)
    
    
    
    class Course(APIView):
        authentication_classes = [TokenAuth, ]
    
        def get(self, request):
            return HttpResponse('get')
    
        def post(self, request):
            return HttpResponse('post')
    

    全局使用

    在setting中

    REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
    }
    

    局部使用

    在views需要认证的类中
    authentication_classes = [TokenAuth, ]
    

    权限组件

    与认证类似

    1 写一个类
    		class MyPermission():
    			def has_permission(self,request,view):
    				token=request.query_params.get('token')
    				ret=models.UserToken.objects.filter(token=token).first()
    				if ret.user.type==2:
    				# 超级用户可以访问
    					return True
    				else:
    					return False
    	2 局部使用:
    		permission_classes=[MyPermission,]
    	3 全局使用:
    			REST_FRAMEWORK={
    			'DEFAULT_PERMISSION_CLASSES':['utils.common.MyPermission',]
    		}
    

    频率组件

    与认证类似

    1 写一个类:
    		from rest_framework.throttling import SimpleRateThrottle
    		class VisitThrottle(SimpleRateThrottle):
    			scope = 'xxx'
    			def get_cache_key(self, request, view):
    				return self.get_ident(request)
    2 在setting里配置:
    		'DEFAULT_THROTTLE_RATES':{
    			'xxx':'5/h',
    		}
    3 局部使用
    		throttle_classes=[VisitThrottle,]
    4 全局使用
    		REST_FRAMEWORK={
    			'DEFAULT_THROTTLE_CLASSES':['utils.common.MyPermission',]
    		}
  • 相关阅读:
    Maven:mvn 命令的基本使用
    Java:SPI机制
    Bootstrap3 排版-内联文本元素
    Bootstrap3 排版-页面主体
    Bootstrap3 排版-标题
    Bootstrap3 栅格系统-Less mixin 和变量
    Bootstrap3 栅格系统-列排序
    Bootstrap3 栅格系统-嵌套列
    Bootstrap3 栅格系统-列偏移
    Bootstrap3 栅格系统-实例:响应列重置(Responsive column resets)
  • 原文地址:https://www.cnblogs.com/luck-L/p/9839409.html
Copyright © 2020-2023  润新知