DRF之认证

步骤

  • 写一个类,继承BaseAuthentication
  • 重写authenticate方法
  • 编写认证类,认证通过后返回两个值
  • 认证失败,则抛出异常APIException或者AuthenticationFailed,会自动捕获并返回

使用

auth.py(自建)

  1. from .models import Token
  2. from rest_framework.exceptions import AuthenticationFailed
  3. from rest_framework.authentication import BaseAuthentication
  4. class LoginAuth(BaseAuthentication):
  5. def authenticate(self, request):
  6. token = request.query_params.get('token')
  7. user_token = Token.objects.filter(token=token).first()
  8. if user_token:
  9. return user_token.user, token
  10. else:
  11. raise AuthenticationFailed('请先进行登录')

全局认证

settings.py

  1. REST_FRAMEWORK = {
  2. # 全局使用认证类
  3. 'DEFAULT_AUTHENTICATION_CLASSES':['app01.auth.LoginAuth',]
  4. }

局部认证

  1. class BookView(APIView):
  2. # 在局部视图类添加
  3. authentication_classes = [LoginAuth, ]

局部禁用

  1. class BookView(APIView):
  2. # 在局部视图类设置为空
  3. authentication_classes = []

自定义认证

DRF之权限

步骤

  • 写一个类,继承BasePermission
  • 重写has_permission方法
  • has_permission中,进行权限的判断,如果有权限,返回True,如果没有权限,返回False,返回的中文提示信息,使用message字段标识

使用

  1. class PermissionAuth(BasePermission):
  2. # message = '你不是超级用户,不能访问'
  3. def has_permission(self, request, view):
  4. # 判断权限,由于权限的执行在认证后执行,到这说明已经认证通过了,认证通过了request.user就是当前登录用户
  5. if request.user.user_type == 1:
  6. return True
  7. else:
  8. self.message = '你是%s,无法访问' % request.user.get_user_type_display()
  9. return False

全局认证

setting.py

  1. REST_FRAMEWORK = {
  2. # 全局使用认证类
  3. 'DEFAULT_PERMISSION_CLASSES':['app01.auth.PermissionAuth',]
  4. }

局部认证

  1. class BookView(APIView):
  2. permission_classes = [PermissionAuth,]

局部禁用

  1. class BookView(APIView):
  2. permission_classes = []

DRF之频率

步骤

  • 写一个类,继承SimpleRateThrottle
  • 重写get_cache_key方法
  • 返回什么,就以什么做限制
  • 写一个类属性 scope='别名'
  • 配置文件中配置REST_FRAMEWORK = {'别名':'3/m'}(s是秒,m是分,h是小时,d是天)

使用

throttling.py

  1. class IPThrottle(SimpleRateThrottle):
  2. scope = 'user'
  3. def get_cache_key(self, request, view):
  4. # return 什么就限制s, 返回ip 返回用户id
  5. if request.user.username:
  6. return request.META.get('REMOTE_ADDR')

setting.py

  1. REST_FRAMEWORK = {
  2. "DEFAULT_THROTTLE_RATES": {
  3. # 频率类中scope对应的值
  4. 'user': '3/m',
  5. },
  6. }

views.py

  1. class BookView(APIView):
  2. throttle_classes = [IPThrottle, ]
  3. def get(self, request):
  4. return Response('ok')
  5. def throttled(self, request, wait):
  6. from rest_framework.exceptions import Throttled
  7. class MyThrottled(Throttled):
  8. default_detail = '超限限制'
  9. extra_detail_singular = '需要等待 {wait} 秒'
  10. extra_detail_plural = '需要等待 {wait} 秒'
  11. raise MyThrottled(wait)

全局认证

setting.py

  1. REST_FRAMEWORK = {
  2. "DEFAULT_THROTTLE_RATES": {
  3. # 频率类中scope对应的值
  4. 'anon':'4/h',
  5. 'user':'5/m'
  6. },
  7. 'DEFAULT_THROTTLE_CLASSES':['app01.throttling.IPThrottle',]
  8. }

局部认证

  1. class BookView(ListAPIView):
  2. throttle_classes = [MyThrottle, ]

局部禁用

  1. class BookView(APIView):
  2. throttle_classes = []