基础视图

1.基础函数视图(@api_view)

DRF提供了一种函数基础视图来装饰Django的普通视图,我们可以使用request来接受请求和response响应。一个小例子:

from rest_framework.decorators import api_view

@api_view
def hello_world(request):
return Response({"message":"Hello world!"})

1)@api_view使用方法

这个视图将使用默认渲染器、解析器、身份验证设置中指定的类等。通常默认GET方法,我们可以手动更改方法。像这样:

@api_view(['GET', 'POST'])
def hello_world(request):
if request.method == 'POST':
return Response({'message':'Got some data', 'data':request.data})
return Response({'messsage':'Hello world!'})

2)其他装饰器

DRF提供了很多附加的装饰器,我们可以添加到@api_view()后面,例如要加入一个节流的装饰器来确保特定用户每天只能一次通过这个视图,我们就要用到@throttle_classes装饰器:

from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle class OncePerDayUserThrottle(UserRateThrottle):
rate = '1/day' @api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle])
def view(request):
return Response({'message':'Hello for to day! see you tomorrow!'})

还有:

@renderer_classes()
@parser_classes()
@authentication_classes()
@throttle_classes()
@permission_classes()

2.基础类视图(APIView)

DRF不同于Django常规的View类,它有如下几个优点:

  • 提供了更好用的request对象,不同于普通的Django HttpRequest更好用。
  • 封装了Response对象,代替了原有的Django HttpResponse,视图将管理内容协商并设置正确的渲染器的响应。
  • 任何APIException异常将会被捕捉,并做适当的响应。
  • 传入的请求将身份验证和适当的权限和节流检查将之前运行调度请求处理程序的方法。

一个小例子:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authenication, permissions class ListUser(APIView):
authentication_classes = (authentication.TokenAuthentication,)    # 认证策略属性
permission_classes = (permissions.IsAdminUser,)     # 权限策略属性
def get(self, requeset, format=None):
"""
返回一个用户列表
"""
usernames = [user.username for user in User.objects.all()]
return Response(usernames)

1)APIView属性

  • renderer_classes: 渲染器类
  • parser_classes: 解析器类
  • authentication_classes: 验证类
  • throttle_classes:限流类
  • permission_classes: 权限类
  • content_negotiation_class: 内容协商类

2)get型方法

通常不用重写。

  • get_renderers(self): 获取渲染器方法
  • get_parsers(self): 获取解释器方法
  • get_authenticators(self): 获取认证方法
  • get_throttles(self): 获取限流方法
  • get_permissions(self): 获取权限方法
  • get_content_negotiator(self): 获取内容协商方法

3)check型方法

  • check_permissions(self, request): 检查权限
  • check_throttles(self, request): 检查节流
  • check_content_negotiation(self, request, force=False): 检查内容协商

4)调度方法

  • initial(self, request, *args, **kwargs): 执行任何操作,需要发生在处理程序方法之前被调用。这个方法是用来执行权限和节流,并执行内容协商。
  • handle_exception(self, exc):抛出的任何异常处理程序方法将被传递给这个方法,而返回响应实例,或者re-raises异常。
  • initialize_request(self, request, *args, **kwargs):确保请求对象传递给处理程序方法是request的一个实例,而不是django的HttpRequest
  • finalize_response(self, request, response, *args, **kwargs):确保任何响应处理程序方法返回的对象将被呈现到正确的内容类型

通用类视图

基于类视图的主要好处之一是他们允许您编写可重用的行为。REST框架提供的通用视图允许您快速构建API观点紧密地映射到您的数据库模型。GenericAPIView继承了DRF的APIView类,为list和detail视图增加了一些一般需求行为方法。

1.基础通用类视图(GenericAPIView)

1)属性

基本属性:

  • queryset: 用于返回query对象集合,也可以使用get_queryset()方法
  • serializer_class: 序列化器类,应该用于输入进行验证和反序列化,并用于序列化输出。通常情况下,你必须设置这个属性,或重写get_serializer_class()方法
  • lookup_field: 模型的字段应该用于执行对象查找个别的模型实例
  • lookup_url_kwarg:URL配置中应该用于对象查找关键字参数

分页属性:

  • pagination_class: 用于返回一个分页列表视图的分页类,默认与settings中设置的DEFAULT_PAGINATION_CLASS 值相同,可以通过’rest_framework.pagination.PageNumberPagination’设置分页数

过滤器属性:

  • filter_backends: 过滤queryset的类列表,和在settings中设置DEFAULT_FILTER_BACKENDS一样

2)方法

基本方法:

  • get_queryset(): 返回queryset
  • get_object():获取某一个具体的model实例对象

2.Model Mixin类

mixin类用于提供基础视图的操作行为。注意,mixin类提供操作方法而不是定义处理程序方法,这允许更灵活的组合的行为。

  • ListModelMixin:提供list方法,列出queryset
  • CreateModelMixin: 提供create方法,创建和保存一个Model对象
  • RetrieveModelMixin:提供retrieve方法,检索一个存在的model对象
  • UpdateModelMixin: 提供Update方法,更改一个模型对象
  • DestroyModelMixin:提供destroy方法,删除一个模型对象

以下方法是mixins类提供,提供简单的对象保存和删除的行为重写:

  • perform_create(self, serializer): CreateModelMixin 当要保存对象时候会被调用
  • perform_update(self, serializer):UpdateModelMixin 当要更新对象时候会被调用
  • perform_destroy(self, instance): DestoryModelMixin 当药删除对象时候会被调用

3.高级通用类视图

该通用类视图提供具体操作的通用类视图,可以理解GenericAPIViewMixin类的合体,通过rest_framework.generic调用。

  • CreateAPIView

创建一个模型实例
提供post方法的处理器
继承于:GenericAPIView,CreateModelMixin

  • ListAPIView

模型实例的集合
提供get方法处理器
继承于:GenericAPIView,ListModelMixin

  • RetrieveAPIView

一个模型实例
提供get方法处理器
继承于:GenericAPIView,RetrieveModelMixin

  • DestoryAPIView

删除一个模型实例
提供delete方法处理器
继承于:GenericAPIView,DestroyModelMixin

  • UpdateAPIView

修改模型实例,
提供put和patch方法处理器
继承于:GenericAPIView,UpdateModelMixin

  • ListCreateAPIView

创建和展示一个模型实例集合
提供get和post处理器
继承于:GenericAPIView,ListModelMixin,CreateModelMixin

  • RetrieveUpdateAPIView

读和改一个模型实例
提供get,put,patch处理器
继承于:GenericAPIView,RetrieveModelMixin,UpdateModelMixin

  • RetrieveDestoryAPIView

读和删除一个模型实例
提供get和delete处理器
继承于:GenericAPIView,RetrieveModelMixin,DestroyModelMixin

  • RetrieveUpdateDestroyAPIView

读、改和删一个模型实例
get,put,patch,delete处理器
继承于:GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin

视图集合

Django REST框架允许您将一组相关的逻辑视图在一个类,ViewSet类是一个简单类型的基于类的视图,没有提供任何方法处理程序如get(),post()等,而提供代替方法比如list(),retrieve(),create(),update(),destroy()等。

1)GenericViewSet

继承了`GenericAPIView`,提供了默认的get_queryset()和get_object()等方法来获取model数据,但不提供任何请求处理方法。

2)ModelViewSet

继承了`GenericAPIView`,`ListModelMixin`、`RetrieveModelMixin`、`CreateModelMixin`、`UpdateModelMixin`、`DestroyModelMixin`等,增加了一些请求处理方法,如list(),retrieve(),create(),update(),partial_update(),destroy()等。

例子:

class SnippetViewSet(ModelViewSet):
# 继承涵盖`ListModelMixin`、`RetrieveModelMixin`、`CreateModelMixin`、`UpdateModelMixin`、`DestroyModelMixin`等;
# 按Model分别写视图集合,一个Model一个视图集合。
"""
此视图自动提供`list()`,`create()`,`retrieve()`,`update()`和`destroy()`操作。
"""
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
  def perform_create(self, serializer):
  serializer.save(owner=self.request.user)

3)ReadOnlyModelViewSet

继承了GenericAPIView,只增加了只读的请求处理方法list()和retrieve()。

例子:

class UserViewSet(ReadOnlyModelViewSet):
# 继承涵盖`ListModelMixin`、`CreateModelMixin`、`RetrieveModelMixin`、`UpdateModelMixin`、`DestroyModelMixin`等;
# 按Model分别写视图集合,一个Model一个视图集合。
"""
此视图自动提供`list()`和`retrieve()`操作。
"""
queryset = User.objects.all()
serializer_class = UserSerializer

给视图集合绑定URL

1)手动绑定

例:

# 手动配置视图集合路由:as_view({'action方法': '对象操作方法'})
path('snippets', SnippetViewSet.as_view({'get': 'list', 'post': 'create'}), name='snippets-list'),
path('snippets/<int:pk>', SnippetViewSet.as_view({'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy'}), name='snippet-detail'),

2)自动绑定(URL路由器)

通过使用Router类,把视图和资源联系起来的协议和urls会被自动处理。我们只需要使用router来注册合适的视图,剩余的交给router来做就行。

例:

# 实例化一个 router 并用它注册我们的 viewset
router = DefaultRouter()
router.register(r'snippets', SnippetViewSet) # API URLs现在由 router 自动配置
urlpatterns = [
path('', include(router.urls)),
]

至此。转载请注明出处。

Django RestFramework(DRF)类视图的更多相关文章

  1. DRF类视图让你的代码DRY起来

    刚开始写views.py模块的代码,一般都是用def定义的函数视图,不过DRF更推荐使用class定义的类视图,这能让我们的代码更符合DRY(Don't Repeat Yourself)设计原则: 使 ...

  2. django rest-framework 3.类 实现restful

    上节提到过,REST框架分别提供了对函数和类的装饰器,之前已经都是通过函数来写视图函数的,现在来尝试使用class 类来实现视图函数 使用基于类编写API视图,允许重用常用的功能,减少代码重复. 一. ...

  3. django中的类视图

    # 原创,转载请留言联系 当我们在开发一个注册模块时.浏览器会通过get请求让注册表单弹出来,然后用户输完注册信息后,通过post请求向服务端提交信息.这时候我们后端有两个视图函数,一个处理get请求 ...

  4. django framework插件类视图方法

    1.使用类视图APIView重写API 类视图APIView,取代@api_view装饰器,代码如下: from rest_framework import status from rest_fram ...

  5. django framework插件类视图分页

    分页 继承APIView类的视图中添加分页 from rest_framework.pagination import PageNumberPagination class MyPageNumberP ...

  6. django CBV基于类视图简单实例

    URLS: from django.contrib import admin from django.urls import path from cmbd import views urlpatter ...

  7. Django RestFramework (DRF)

    准备: 下载 pip install djangorestframework 一 APIView源码解析 1 预备知识 CBV(class based view)FBV(function based ...

  8. DRF之视图和router

    1. 视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 1.1. 请求与响应 1.1.1 Request RES ...

  9. 067.Python框架Django之DRF视图类

    一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...

随机推荐

  1. HDU 4729 An Easy Problem for Elfness(树链剖分边权+二分)

    题意 链接:https://cn.vjudge.net/problem/HDU-4729 给你n个点,然你求两个点s和t之间的最大流.而且你有一定的钱k,可以进行两种操作 1.在任意连个点之间建立一个 ...

  2. TCP协议如何保证可靠传输

    TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 重 流 拥) 校验和: 发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化.如果收到段的检 ...

  3. 一套从alpine基本镜像到node8.16.2的全套dockerfile

    这个花了点时间,可以正式跑起来了. 加了常用的工具及中文时区,非root帐号. 除了pm2,其它的module放到应用程序本身的node_modules目录下来实现的. 一,3rd_part/node ...

  4. (一)JVM快速回顾总结

    1,JVM内存结构(JVM体系概述,java8后的JVM) 2,GC的作用域(方法区和线程堆) 3,常见的垃圾回收算法 (1)引用计数 循环引用问题 (1) 那些对象可以作为GC_Root 虚拟机栈( ...

  5. jenkins添加TPS与服务器监控变化曲线图

    第一步,首先在测试的脚本中添加你所需要查看的曲线图的监控路径 譬如我想查看TPS变化图 添加hps监控图 添加服务器监控图 把所有jtl文件保存到/opt/workspace/B_Stress_Tes ...

  6. ora-01489 字符串连接的结果过长 解决方案

    如下代码,使用listagg进行分组拼接时,常常会报 ora-01489 错误,造成该报错的主要原因是:oracle对字符变量的长度限制,正常情况下,oracle定义的varchar2类型变量的长度不 ...

  7. 剑指Offer-16.合并两个排序的链表(C++/Java)

    题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 可以用一个新的节点,来去比较两个单调递增的链表当前节点的值,如果p1当前的值小于p2,则新 ...

  8. 【java】svn显示&#215;

    背景:将客服系统代码赋值到商户子系统中,复制过去后,所有代码svn显示×. 可能:代码直接复制过去只是表面上再maven中显示的代码复制过去,不是真的代码,所以对于svn来讲真的代码删了,又来了一堆新 ...

  9. C 函数与指针(function & pointer)

    C 函数与指针(function & pointer) /* * function.c * 函数在C中的使用 * */ #include <stdio.h> int noswap( ...

  10. SecureCRT 8.1工具下载和破解附Xshell6

    附教程:https://jingyan.baidu.com/article/eae078275917861fec548592.html 这一篇教程实际上已经说得非常明确了,只需要把注册机放在和secu ...