在须要认证的视图类里加上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]