django 学习之DRF (三)

Django学习之DRF-03

视图集
    1.视图集介绍
    2.视图集基本使⽤
        1.需求 使⽤视图集获取列表数据和单⼀数据
        2.实现
            1.视图
            class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
            """使⽤视图集实现返回列表数据和单⼀数据"""
                queryset = BookInfo.objects.all()
                serializer_class = BookInfoSerializer
            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.⾃动⽣成接⼝⽂档

猜你喜欢

转载自www.cnblogs.com/x931890193/p/9330940.html
今日推荐