django 學習之DRF (三)
Django學習之DRF-03
視圖集
1.視圖集介紹
2.視圖集基本使?
1.需求 使?視圖集獲取列表數據和單?數據
2.實現
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): """使?視圖集實現返回列表數據和單?數據""" queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer
1.視圖
2.序列化器
可使?之前定義過的序列化器
class BookInfoSerializer(serializers.Serializer): pass class BookInfoModelSerializer(serializers.ModelSerializer): pass
3.路由
# 演示viewset
url(r‘^books/$‘, views.BookInfoViewSet.as_view({‘get‘: ‘list‘})), url(r‘^books/(?P<pk>\d+)/$‘, views.BookInfoViewSet.as_view({‘get‘: ‘retrieve‘})),
3.視圖集中定義附加action動作
1.需求
追加讀取倒敘後的最新數據邏輯
追加修改閱讀量的邏輯
2.實現
1.視圖
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): """使?視圖集實現返回列表數據和單?數據""" queryset = BookInfo.objects.all() serializer_class= BookInfoSerializer # 以下代碼: 演示附加action邏輯 def latest(self, request): """ 返回最新的圖書信息 """ book = BookInfo.objects.latest(‘id‘) serializer = self.get_serializer(book) return Response(serializer.data) def read(self, request, pk): """ 修改圖書的閱讀量數據 """ book = self.get_object() book.bread = request.data.get(‘read‘) book.save() serializer = self.get_serializer(book) return Response(serializer.data)
2.路由
# 演示viewset url(r‘^books/$‘, views.BookInfoViewSet.as_view({‘get‘: ‘list‘})), url(r‘^books/(?P<pk>\d+)/$‘, views.BookInfoViewSet.as_view({‘get‘: ‘retrieve‘})), # 演示附加action url(r‘^books/latest/$‘, views.BookInfoViewSet.as_view({‘get‘: ‘latest‘})), url(r‘^books/(?P<pk>\d+)/read/$‘, views.BookInfoViewSet.as_view({‘put‘: ‘read‘})),
4.路由Routers
1.介紹
REST framework提供了兩個router
? SimpleRouter
? DefaultRouter
2.需求 使?DefaultRouter定義路由
3.實現
1.原有路由
# 演示viewset
url(r‘^books/$‘, views.BookInfoViewSet.as_view({‘get‘: ‘list‘})),
url(r‘^books/(?P<pk>\d+)/$‘, views.BookInfoViewSet.as_view({‘get‘: ‘retrieve‘})),
# 演示附加action
url(r‘^books/latest/$‘, views.BookInfoViewSet.as_view({‘get‘: ‘latest‘})),
url(r‘^books/(?P<pk>\d+)/read/$‘, views.BookInfoViewSet.as_view({‘put‘: ‘read‘})),
2.視圖集中附加action的聲明
3.DefaultRouter定義路由
# 創建路由對象
router = DefaultRouter()
# 將視圖集註冊到路由
router.register(r‘books‘, views.BookInfoViewSet, base_name= ‘book‘)
# 視圖集路由添加到urlpatterns
urlpatterns += router.urls
視圖?級?法
1.認證Authentication
1.說明 識別登錄?戶是誰
2.配置
# DRF配置
REST_FRAMEWORK = { ‘DEFAULT_AUTHENTICATION_CLASSES‘: ( ‘rest_framework.authentication.BasicAuthentication‘, # 基本認證 ‘rest_framework.authentication.SessionAuthentication‘, # session認證 ) }
3.補充
認證失敗會有兩種可能的返回值:
? 401 Unauthorized 未認證
? 403 Permission Denied 權限被禁?
2.權限Permissions
1.說明
權限控制可以限制?戶對於視圖的訪問和對於具體數據對象的訪問。
? 在執?視圖的dispatch()?法前,會先進?視圖訪問權限的判斷
? 在通過get_object()獲取具體對象時,會進?對象訪問權限的判斷
限制?戶的權限
提供的權限
? AllowAny 允許所有?戶
? IsAuthenticated 僅通過認證的?戶
? IsAdminUser 僅管理員?戶
? IsAuthenticatedOrReadOnly 認證的?戶可以完全操作,否則只能get讀取
2.視圖訪問權限
1.全局權限
REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES‘: ( ‘rest_framework.permissions.IsAuthenticated‘, ) }
2.局部權限
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
"""使?視圖集實現返回列表數據和單?數據"""
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# 權限認證: 只有登錄?戶才能訪問
permission_classes = [IsAuthenticated]
pass
3.?定義權限
1.說明
如需?定義權限,需繼承rest_framework.permissions.BasePermission?類,並實現以下兩個任何?個?法或全部
? .has_permission(self, request, view)
是否可以訪問視圖, view表示當前視圖對象
? .has_object_permission(self, request, view, obj)
是否可以訪問數據對象, view表示當前視圖, obj為數據對象
2.實現
class MyPermission(BasePermission): def has_object_permission(self, request, view, obj): """控制對obj對象的訪問權限,此案例決絕所有對對象的訪問""" return False class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): """使?視圖集實現返回列表數據和單?數據""" queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer # 權限認證: 只有登錄?戶才能訪問,且?權訪問單?對象 permission_classes = [IsAuthenticated, MyPermission] pass
3.限流Throttling
1.說明 可以對接?訪問的頻次進?限制,以減輕服務器壓?。
2.配置
DEFAULT_THROTTLE_RATES 可以使? second, minute, hour 或 day來指明周期。 # DRF配置 REST_FRAMEWORK = { ‘DEFAULT_THROTTLE_CLASSES‘: ( ‘rest_framework.throttling.AnonRateThrottle‘, # 匿名?戶限流 ‘rest_framework.throttling.UserRateThrottle‘ # 登錄?戶限流 ), ‘DEFAULT_THROTTLE_RATES‘: { ‘anon‘: ‘1/minute‘, # 匿名?戶限流 ‘user‘: ‘3/minute‘ # 登錄?戶限流 } }
4.過濾Filtering
1.安裝過濾模塊 pip install django-filter
2.註冊應?
INSTALLED_APPS = [ ‘ django.contrib.admin‘ , ‘ django.contrib.auth‘ , ‘ django.contrib.contenttypes‘ , ‘ django.contrib.sessions‘ , ‘ django.contrib.messages‘ , ‘ django.contrib.staticfiles‘ , ‘rest_framework‘, # DRF ‘ django_filters‘ , # DRF過濾 ‘users.apps.UsersConfig‘, # 安裝users應?, 演示基本使? ‘request_response.apps.RequestResponseConfig‘, # 演示請求和響應 ‘ booktest.apps.BooktestConfig‘ , # 圖書英雄管理應? ]
3.配置過濾後端
# DRF配置 REST_FRAMEWORK = { # 過濾後端 ‘DEFAULT_FILTER_BACKENDS‘: (‘ django_filters.rest_framework.DjangoFilterBackend‘ ,) }
4.視圖添加過濾字段
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): """使?視圖集實現返回列表數據和單?數據""" queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer # 權限認證: 只有登錄?戶才能訪問,且?權訪問單?對象 permission_classes = [IsAuthenticated, MyPermission] # 過濾字段 filter_fields = (‘ btitle‘ , ‘bread‘)
5.測試 http://127.0.0.1:8000/books/?btitle= ?遊記
http://127.0.0.1:8000/books/?bread=10
5.排序OrderingFilter
6.分?Pagination
7.版本Versioning
8.異常處理 Exceptions
9.?動?成接??檔
相關源碼連接:
github,技術交流,歡迎指教
django 學習之DRF (三)