rest_framework组件

认证组件

局部认证

在须要认证的视图类里加上authentication_classes = [认证组件1类名,认证组件2类名....]python

示例以下:app

seralizers.py函数

from rest_framework import serializers
from app01 import models

class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Publish
        fields = '__all__'

auth.pythis

from rest_framework.authentication import BaseAuthentication
from rest_framework import exceptions
from app01 import models

class TokenAuth(BaseAuthentication):
    def authenticate(self,request):
        '''函数名必须叫authenticate'''
        # 验证条件根据需求设置(此示例为须要有token值)
        token = request.GET.get('token')
        token_obj = models.Token.objects.filter(token=token).first()
        if not token_obj:
            # 若是验证失败,须要跑出AuthenticationFailed错误
            raise exceptions.AuthenticationFailed("验证失败!")
        else:
            user = token_obj.user
            # 若是验证成功,须要返回一个元组,分别是用户以及验证类的实例对象,而后内部会赋值给request.user和request.auth
            return user.username,token_obj

views.pyrest

from rest_framework import viewsets
from app01.auth import TokenAuth

class PublishViewSet(viewsets.ModelViewSet):
    # 在这里配置authentication_classes
    # 注意,值为一个列表,能够放多个认证组件类名   
    authentication_classes = [TokenAuth]

    queryset = models.Publish.objects.all()
    serializer_class = serializer.PublishSerializers

全局认证

在setting.py里配置以下:orm

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

  这样配置以后,每一个视图类都要通过认证成功以后才能执行下一步,对象

若是有某些方法不须要认证,如login函数,则须要在login函数中单独加入一个配置属性:blog

authentication_classes = [] #本身的类里有的话就调用此类的配置,为空既什么都不作

权限认证

局部认证

permission.pytoken

from app01 import models
class VipPermission():

    def has_permission(self,request,view):
        # 通过认证组件以后将用户名赋值给了request.user
        # 这里能够直接取到
        username = request.user
        user = models.User.objects.filter(username=username).first()
        # 若是用户的vip值为1,即为True,则经过认证,不然return False
        if user.vip:
            return True
        else:
            return False

views.pyip

from rest_framework import viewsets
from app01.auth import TokenAuth
from app01.permission import VipPermission
class PublishViewSet(viewsets.ModelViewSet):
    authentication_classes = [TokenAuth]
    permission_classes = [VipPermission]

    queryset = models.Publish.objects.all()
    serializer_class = serializer.PublishSerializers

  这个时候若是登陆用户是vip,则会继续执行下一步,若是是普通用户,则会返回错误信息,以下:

{"detail":"You do not have permission to perform this action."}

  若是须要自定义错误信息,只须要在类里定义一个message属性便可,以下:

message="只有超级用户才能访问"

全局认证

REST_FRAMEWORK = {
    # 认证组件
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.auth.TokenAuth",],
    # 权限组件
    "DEFAULT_PERMISSION_CLASSES": ["app01.permission.VipPermission",],
}

频率认证

局部认证

格式以下:

class VisitRateThrottle(object):
    def allow_request(self,request,view):
        # 要求访问站点的频率不能超过每分钟20次等等
        if 1:
            # 若是在限制以内,则返回True

            return True
        else:
            return False

  而后在须要进行限制的视图类中加入以下配置:

throttle_classes = [VisitRateThrottle] 

全局认证

相关文章
相关标签/搜索