RESTful-rest_framework认证组件、权限组件、频率组件-第五篇

认证组件格式:

1 写一个认证类
        from rest_framework.authentication import BaseAuthentication
        class MyAuth(BaseAuthentication):
            def authenticate(self,request):
        #         request  是封装后的
                token = request.query_params.get('token')
                ret = models.UserToken.objects.filter(token=token).first()
                if ret:
        #             认证通过
                    return
                else:
                    raise AuthenticationFailed('认证失败')
            #可以不写了
            def authenticate_header(self,ss):
                pass
    2 局部使用
        authentication_classes=[MyAuth,MyAuth2]
    3 全局使用
        查找顺序:自定义的APIView里找---》项目settings里找---》内置默认的
        REST_FRAMEWORK={
            'DEFAULT_AUTHENTICATION_CLASSES':['utils.common.MyAuth',]

        }

权限组件格式:

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',]
        }

实例

实例简介:

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

1.mode层

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)
    ss=((1,'超级用户'),(2,'普通用户'),(3,'二逼用户'))
    type=models.IntegerField(choices=ss,null=True)

class UserToken(models.Model):
    user=models.OneToOneField(to='UserInfo')
    token=models.CharField(max_length=64)

2.views层

from django.shortcuts import render,HttpResponse

# Create your views here.

import json
from rest_framework.views import APIView
from app01 import models
from utils.common import *
from rest_framework.response import Response

#登录类
class Login(APIView):
    def post(self,request,*args,**kwargs):

        #实例化响应状态函数(添加登录成功后的状态信息)
        response=MyResponse()

        #判断用户名、密码是否正确
        name=request.data.get('name')
        pwd=request.data.get('pwd')
        user=models.UserInfo.objects.filter(name=name,pwd=pwd).first()

        #如果登录成功生成一个随机字符串
        if user:
            #生成一个随机字符串
            token=get_token(name)
            #token表里面的信息,如果不存在,会创建,如果存在会更新token值(因为进行了随机时间加盐),使用的是update_or_create
            ret=models.UserToken.objects.update_or_create(user=user,defaults={'token':token})
            # ret=models.UserInfo.objects.update_or_create(id=1,defaults={'token':token}) 不是只能写user或者可以写id

            response.status=100
            response.msg='登录成功'
            response.token=token
            print(response.get_dic())
        else:
            response.msg="用户名密码错误"
            # response.data='ddd'  最后response.get_dic(),都可以把这些信息返回

        #里面需要传入个字典
        return Response(response.get_dic())


#查看课程类
class Course(APIView):
    #局部登录认证
    authentication_classes = [MyAuth,]
    #局部权限认证
    permission_classes = [Mypermission,]
    #局部频率认证
    throttle_classes = [VisitThrottle,]
    def get(self,request):
        print(request.user)
        print(request.auth)
        return HttpResponse(json.dumps({'name':'python'}))

2.新建认证类

from rest_framework.exceptions import APIException,AuthenticationFailed
class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        #拿到的是随机token的值
        token = request.query_params.get('token')
        ret = models.UserToken.objects.filter(token=token).first()
        if ret:
            #认证通过
            return ret.user,ret
        else:
            #认证失败
            raise AuthenticationFailed('认证失败')

猜你喜欢

转载自www.cnblogs.com/yangzhizong/p/9833245.html