1. 程式人生 > >django 學習之DRF (三)

django 學習之DRF (三)

完全 字段 ali 兩個 gis 說明 技術 英雄 實現

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 (三)