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)