1. 程式人生 > >rest_framwork之認證元件,許可權元件,頻率元件

rest_framwork之認證元件,許可權元件,頻率元件

1 認證元件
2 許可權元件
3 頻率元件


1 認證元件
 (1) 定義一個認證類
   class UserAuth():
     def authenticate_header(self,reuqest):
       pass
     def authenticate(self,reuqest):
       user_token = request.query_params.get("token")
        try:
            token = UserToken.objects.get(token=user_token)
            # 後面許可權會用到
            return token.user, token.token
        except Exception:
            raise APIException("沒有認證")
            
            
(2) 在需要認證的資料介面裡面指定認證類
 class BookView(ModelViewSet):
   authentication_classes=[UserAuth]
   queryset=Book.object.all()
   serializer_class=BookSerializer
   
   
   
2 許可權元件
 (1)定義一個許可權類
   class UserPerm():
     def has_permission(self,reuqest,view):
       return None
  (2)指定許可權驗證類
   class BookView(APIView):
     authentication_classes=[UserAuth]
     permission_class=[UserPerm]
    
     queryset=Book.objects.all()
     serialize_class=BookSerializer
    

3 頻率元件

(1) 定義一個頻率元件
class RateThrottle():
  def allow_request(request,self):
      if 沒有超過限制:
            return True
      else:
           return False

  def wait(self):
        return 10
        
        
(2)指定頻率類
class BookView(APIView):
  throttle_classes=[RateThrottle]
 


使用簡單的頻率控制來控制訪問頻率(全域性)
(1)匯入模組
 from rest_framework.throttling import SimpleRateThrottle

(2)定義一個類並繼承SimpleRateThrottle
    class RateThrottle(SimpleRateThrottle):
            # 指定訪問頻率
            scope = 'visit_rate'
            
            # 指定通過什麼方式來區分使用者
            def get_cache_key(self, request, view):
                return self.get_ident(request)

(3)在setting裡面指定頻率類和訪問頻率
    REST_FRAMEWORK = {
                        "DEFAULT_THROTTLE_CLASSES": ('serializer.utils.app_throttles.RateThrottle',),
                        "DEFAULT_THROTTLE_RATES": {
                            "visit_rate": "5/m"
                        }
                    }

                    

4 url 註冊器
(1)匯入
    from django.urls import re_path,include
    from .serializer import views
    from rest_framework import routers
    
 (2)生成一個註冊器例項物件
   router = routers.DefaultRouter()
   
 (3)將自動生成的url註冊
  router.register(r"books", views.BookView)
 
 (4)開始自動生成url
  urlpatterns=[
   re_path('^', include(router.urls)),  
  ]
 
 
 
(5)響應器元件
(1)匯入
  from rest_framework.renderers import JsonRender

 
 (2) 指定返回類
  class BookView(APIView):
    render_classes=[JsonRender]
    
    
(6)分頁器元件
  (1) 匯入
    from rest_framework.pagination import PageNumberPerination
    
 (2)獲取資料
   books=Book.object.all()
 
  (3)建立一個分頁器物件
   paginater=PageNumberPerination()
 
  (4) 開始分頁
    paged_books = paginater.paginate_queryset(books, request)
    
  (5) 開始序列化
   serialized_books = BookSerializer(paged_books, many=True)
   
- 返回資料
        return Response(serialized_books.data)
    
    
(7)分頁器元件區域性實現
    - 匯入模組
        from rest_framework.pagination import PageNumberPagination

    - 自定義一個分頁類繼承PageNumberPagination
        class MyPagination(PageNumberPagination):
            page_size = 2
            page_query_param = 'p'
            page_size_query_param = 'size'
            max_page_size = 5

    - 例項化一個分頁類物件
        paginater = MyPagination()

    - 開始分頁
        paged_books = paginater.paginate_queryset(books, request)

    - 開始序列化
        serialized_books = BookSerializer(paged_books, many=True)

    - 返回資料
        return Response(serialized_books.data)