(一)、认证

  • 全局配置:在settings.py文件中

    1. REST_FRAMEWORK = {
    2. 'DEFAULT_AUTHENTICATION_CLASSES': [
    3. # 此身份认证方案使用HTTP基本身份认证,验证请求是否是HTTP方式过来的
    4. 'rest_framework.authentication.BasicAuthentication',
    5. # 自己服务器用户认证,即通过session来判断用户是否是自己服务器的
    6. 'rest_framework.authentication.SessionAuthentication'
    7. ]
    8. }
  • 局部配置:在视图中

    1. class UserExtraActionViewSet(ModelViewSet):
    2. ''' 视图集额外的动作 '''
    3. queryset = UserProfile.objects.all()
    4. serializer_class = UserProfileSerializers
    5. lookup_url_kwarg = 'id'
    6. # 局部认证
    7. authentication_classes = [SessionAuthentication]
    8. # 通过创建时间来查询用户信息
    9. @action(methods=["GET"], detail=False)
    10. def createTiem(self, request):
    11. starttime = datetime.date(2020, 11, 11)
    12. endtime = datetime.date(2020, 11, 13)
    13. user = UserProfile.objects.filter(
    14. date_joined__range=[starttime, endtime])
    15. serializer = self.get_serializer(instance=user, many=True)
    16. return Response(serializer.data)
  • 当全局配置和局部配置都设置的时候,视图默认使用局部认证

    二、权限

  • 权限分类:

    • AllowAny:允许任何人访问
    • IsAuthenticated:允许被认证的用户访问,没有认证的拒绝访问
    • IsAdminUser:允许管理员用户访问
    • IsAuthenticatedOrReadOnly:允许被认证的用户访问任何请求,但是没有被认证的用户只能访问get请求获取部分查询
  • 全局设置:在settings.py文件中设置

    1. REST_FRAMEWORK = {
    2. 'DEFAULT_PERMISSION_CLASSES': [
    3. # 'rest_framework.permissions.AllowAny', # 所有用户
    4. # 'rest_framework.permissions.IsAuthenticated', # 普通用户
    5. 'rest_framework.permissions.IsAdminUser', # 管理员用户
    6. ]
    7. }
  • 局部设置:在视图中设置

    1. class UserExtraActionViewSet(ModelViewSet):
    2. ''' 视图集额外的动作 '''
    3. queryset = UserProfile.objects.all()
    4. serializer_class = UserProfileSerializers
    5. lookup_url_kwarg = 'id'
    6. # 局部认证
    7. authentication_classes = [SessionAuthentication]
    8. # 局部权限设置
    9. permission_classes = [AllowAny]
    10. # 通过创建时间来查询用户信息
    11. @action(methods=["GET"], detail=False)
    12. def createTiem(self, request):
    13. starttime = datetime.date(2020, 11, 11)
    14. endtime = datetime.date(2020, 11, 13)
    15. user = UserProfile.objects.filter(
    16. date_joined__range=[starttime, endtime])
    17. serializer = self.get_serializer(instance=user, many=True)
    18. return Response(serializer.data)
  • 局部设置和全局设置都有的情况下,视图默认使用局部权限设置

    (三)、限流

    (一)、基础设置

  • drf只是提供了基础的限流设置,如果需要复杂的或者具体业务场景的限流则需要自定义限流中间件了

  • 分类:
    • UserRateThrottle:针对认证用户进行限流
    • AnonRateThrottle:对非认证用户限流
  • 全局设置:可以设置天、时、分、秒 ```python REST_FRAMEWORK = { ‘DEFAULT_THROTTLE_CLASSES’: [
    1. 'rest_framework.throttling.AnonRateThrottle',
    2. 'rest_framework.throttling.UserRateThrottle'
    ], ‘DEFAULT_THROTTLE_RATES’: {
    1. 'anon': '4/minute',
    2. 'user': '10/minute'
    } }
  1. - 局部设置:在视图中设置
  2. ```python
  3. class UserExtraActionViewSet(ModelViewSet):
  4. ''' 视图集额外的动作 '''
  5. queryset = UserProfile.objects.all()
  6. serializer_class = UserProfileSerializers
  7. lookup_url_kwarg = 'id'
  8. # 局部认证
  9. authentication_classes = [SessionAuthentication]
  10. # 权限设置
  11. permission_classes = [AllowAny]
  12. # 限流设置
  13. throttle_classes = [AnonRateThrottle]
  14. # 通过创建时间来查询用户信息
  15. @action(methods=["GET"], detail=False)
  16. def createTiem(self, request):
  17. starttime = datetime.date(2020, 11, 11)
  18. endtime = datetime.date(2020, 11, 13)
  19. user = UserProfile.objects.filter(
  20. date_joined__range=[starttime, endtime])
  21. serializer = self.get_serializer(instance=user, many=True)
  22. return Response(serializer.data)

(二)、可选限流

可选限流相对与基础限流稍加灵活一点,可以做部分自定义限流

  • 操作:
    • 模块是rest_framework.throttling.ScopedRateThrottle
    • 可以限流的种类不在局限于anon和user,而是可以自定义不定数量的限流种类
  • 全局设置

    1. REST_FRAMEWORK = {
    2. 'DEFAULT_THROTTLE_CLASSES': [
    3. 'rest_framework.throttling.ScopedRateThrottle',
    4. ],
    5. 'DEFAULT_THROTTLE_RATES': {
    6. 'contacts': '1000/day',
    7. 'uploads': '20/day',
    8. 'downloads': '3/minute',
    9. ......
    10. }
    11. }
  • 局部设置:在视图中使用,throttle_scopes对应的值是settings.py中自定义的限流的名字 ```python from rest_framework.throttling import ScopedRateThrottle

class UserExtraActionViewSet(ModelViewSet): ‘’’ 视图集额外的动作 ‘’’ queryset = UserProfile.objects.all() serializer_class = UserProfileSerializers lookup_url_kwarg = ‘id’

  1. # 限流设置
  2. throttle_scopes = 'downloads'

```