Django学习之DRF-03

视图集
    1.视图集介绍
    2.视图集基本使⽤
        1.需求 使⽤视图集获取列表数据和单⼀数据
        2.实现

  1. class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
  2. """使⽤视图集实现返回列表数据和单⼀数据"""
  3. queryset = BookInfo.objects.all()
  4. serializer_class = BookInfoSerializer

1.视图

2.序列化器
                可使⽤之前定义过的序列化器

  1. class BookInfoSerializer(serializers.Serializer):
  2. pass
  3. class BookInfoModelSerializer(serializers.ModelSerializer):
  4. pass

3.路由
                # 演示viewset

  1. url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
  2. url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),

3.视图集中定义附加action动作
        1.需求
            追加读取倒叙后的最新数据逻辑
            追加修改阅读量的逻辑
        2.实现
            1.视图

  1. class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
  2. """使⽤视图集实现返回列表数据和单⼀数据"""
  3. queryset = BookInfo.objects.all()
  4. serializer_class = BookInfoSerializer
  5. # 以下代码: 演示附加action逻辑
  6. def latest(self, request):
  7. """
  8. 返回最新的图书信息
  9. """
  10. book = BookInfo.objects.latest('id')
  11. serializer = self.get_serializer(book)
  12. return Response(serializer.data)
  13. def read(self, request, pk):
  14. """
  15. 修改图书的阅读量数据
  16. """
  17. book = self.get_object()
  18. book.bread = request.data.get('read')
  19. book.save()
  20. serializer = self.get_serializer(book)
  21. return Response(serializer.data)

2.路由

  1. # 演示viewset
  2. url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
  3. url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
  4. # 演示附加action
  5. url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
  6. 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配置

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_AUTHENTICATION_CLASSES': (
  3. 'rest_framework.authentication.BasicAuthentication', # 基本认证
  4. 'rest_framework.authentication.SessionAuthentication', # session认证
  5. )
  6. }

3.补充
            认证失败会有两种可能的返回值:
            • 401 Unauthorized 未认证
            • 403 Permission Denied 权限被禁⽌
            2.权限Permissions
            1.说明
                权限控制可以限制⽤户对于视图的访问和对于具体数据对象的访问。
                • 在执⾏视图的dispatch()⽅法前,会先进⾏视图访问权限的判断
                • 在通过get_object()获取具体对象时,会进⾏对象访问权限的判断
                限制⽤户的权限
                提供的权限
                • AllowAny 允许所有⽤户
                • IsAuthenticated 仅通过认证的⽤户
                • IsAdminUser 仅管理员⽤户
                • IsAuthenticatedOrReadOnly 认证的⽤户可以完全操作,否则只能get读取
    2.视图访问权限
        1.全局权限

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_PERMISSION_CLASSES': (
  3. 'rest_framework.permissions.IsAuthenticated',
  4. )
  5. }

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.实现

  1. class MyPermission(BasePermission):
  2. def has_object_permission(self, request, view, obj):
  3. """控制对obj对象的访问权限,此案例决绝所有对对象的访问"""
  4. return False
  5. class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
  6. """使⽤视图集实现返回列表数据和单⼀数据"""
  7. queryset = BookInfo.objects.all()
  8. serializer_class = BookInfoSerializer
  9. # 权限认证: 只有登录⽤户才能访问,且⽆权访问单⼀对象
  10. permission_classes = [IsAuthenticated, MyPermission]
  11. pass

3.限流Throttling
        1.说明 可以对接⼝访问的频次进⾏限制,以减轻服务器压⼒。
        2.配置

  1. DEFAULT_THROTTLE_RATES 可以使⽤ second, minute, hour day来指明周期。
  2. # DRF配置
  3. REST_FRAMEWORK = {
  4. 'DEFAULT_THROTTLE_CLASSES': (
  5. 'rest_framework.throttling.AnonRateThrottle', # 匿名⽤户限流
  6. 'rest_framework.throttling.UserRateThrottle' # 登录⽤户限流
  7. ),
  8. 'DEFAULT_THROTTLE_RATES': {
  9. 'anon': '1/minute', # 匿名⽤户限流
  10. 'user': '3/minute' # 登录⽤户限流
  11. }
  12. }

4.过滤Filtering
        1.安装过滤模块 pip install django-filter
        2.注册应⽤

  1. INSTALLED_APPS = [
  2. ' django.contrib.admin' ,
  3. ' django.contrib.auth' ,
  4. ' django.contrib.contenttypes' ,
  5. ' django.contrib.sessions' ,
  6. ' django.contrib.messages' ,
  7. ' django.contrib.staticfiles' ,
  8. 'rest_framework', # DRF
  9. ' django_filters' , # DRF过滤
  10. 'users.apps.UsersConfig', # 安装users应⽤, 演示基本使⽤
  11. 'request_response.apps.RequestResponseConfig', # 演示请求和响应
  12. ' booktest.apps.BooktestConfig' , # 图书英雄管理应⽤
  13. ]

3.配置过滤后端

  1. # DRF配置
  2. REST_FRAMEWORK = {
  3. # 过滤后端
  4. 'DEFAULT_FILTER_BACKENDS': (' django_filters.rest_framework.DjangoFilterBackend' ,)
  5. }

4.视图添加过滤字段

  1. class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
  2. """使⽤视图集实现返回列表数据和单⼀数据"""
  3. queryset = BookInfo.objects.all()
  4. serializer_class = BookInfoSerializer
  5. # 权限认证: 只有登录⽤户才能访问,且⽆权访问单⼀对象
  6. permission_classes = [IsAuthenticated, MyPermission]
  7. # 过滤字段
  8. 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 (三)的更多相关文章

  1. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  2. django 学习之DRF (二)

    Django学习之DRF02 Serializer序列化器之反序列化操作    1.调⽤序列化器进⾏验证        0.准备序列化器 class BookInfoSerializer(serial ...

  3. Django 学习笔记(三)模板导入

    本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── _ ...

  4. django 学习之DRF (一)

    Django框架基础DRF-01 前后端分离介绍 1.前后端不分离图解 2.前后端分离图解     3.为什么要学习DRF    DRF可以帮助我们开发者快速的开发⼀个依托于Django的前后后端分离 ...

  5. Django 学习笔记(三) --- HTML 模版加载 css、js、img 静态文件

    人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...

  6. Django学习笔记第三篇--关于响应返回

    一.返回简单类型: #1.返回简单字符串 #from django.http import HttpResponse return HttpResponse("return string&q ...

  7. django学习笔记(三)模型

    1.创建一个django app: python manage.py startapp books 2.validate 命令检查你的模型的语法和逻辑是否正确.一旦你觉得你的模型可能有问题,运行 py ...

  8. python Django 学习笔记(三)—— 模版的使用

    模版基本介绍 模板是一个文本,用于分离文档的表现形式和内容. 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签). 模板通常用于产生HTML,但是Django的模板也能产生任何 ...

  9. python之Django学习笔记(三)---URL调度/URL路由

    在django中,用户发起url请求消息首先到工程的urls.py中查找是否有匹配的url路径 刚创建好的工程中urls.py只有下面几行代码: from django.contrib import ...

随机推荐

  1. QString乱谈(2)

    长期以来,很多人都清楚,一旦C++源码中直接使用了中文,这样的源码想要跨平台(I18N)会非常困难. 随着: Windows下:MSVC2010成为主流 Linux下:GCC升级到4.6 C++中的中 ...

  2. windows异常演示,指定异常类型,然后生成异常

    #include "stdafx.h"#include <Windows.h>#include <float.h> DWORD Filter (LPEXCE ...

  3. C# WinForm 关闭登陆窗体后进程还再内存怎么办?

    问题:我们通常再制作WinForm应用程序的时候,运行程序的第一个窗口一般是登陆窗口.代码如下: 那么这种方式有一个弊端,这种启动方式,其实就是把登陆窗口设置为主窗体.因此,再登陆后,我们通常是调用H ...

  4. python中的整数、浮点数和布尔值

    整数和浮点数有那个四则运算: 两种类型的数可以直接进行加减,当整数和浮点数进行加减的时候,结果会自动的变为浮点数,其中除法运算是“/”来表示的, 而余数的算术符号是“%”来表示的. 在布尔值的判断中我 ...

  5. 装饰器,装饰器多参数的使用(*arg, **kwargs),装饰器的调用顺序

    一.#1.执行outer函数,并且将其下面的函数名,当作参数 #2.将outer的返回值重新赋值给f1 = outer的返回值 #3.新f1 = inner #4.func = 原f1 #!/usr/ ...

  6. ArcGIS Field Type /esriFieldTypeDate(转)

    ArcGIS Field Type   The following table outlines the equivalent field data types in ArcCatalog, ArcO ...

  7. 1.Basic Layouts

    使用过mfc编程,就知道控件需要自己拖放.当一个界面有很多小控件时,摆放这些控件特别麻烦. 但是qt编程中有布局(Layout),让系统来摆放控件.使整个控件有一致的外观和感觉,特别方便. 1.水平方 ...

  8. python3-打印一个进度条

    # Auther: Aaron Fan import sys,time for i in range(30): #打印一个#号,这种方法打印不会自动换行 sys.stdout.write('#') # ...

  9. Python程序设计7——文件读写

    1 文件读写简介 文件读写是应用程序中的常用操作.下面介绍Python中进行文件读写.Python的文件读写是非常简单的. 1.1 open函数 open函数一般有了两个必须参数,一个是文件名参数,另 ...

  10. Entity Framework Tutorial Basics(3):Entity Framework Architecture

    Entity Framework Architecture The following figure shows the overall architecture of the Entity Fram ...