Django Rest Framework(DRF)类视图
正文前先了解一个额外知识:POST、PUT、PATCH三者之间的区别。
POST:新增
PUT:更新(若不存在,则新增)
PATCH:局部更新
基础视图
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实例对象
- get_serializer: 获取一个序列化实例对象
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.高级通用类视图
该通用类视图提供具体操作的通用类视图,可以理解GenericAPIView和Mixin类的合体,通过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)), ]
附:模型混入类方法使用:https://blog.csdn.net/bbwangj/article/details/88777913
至此。转载请注明出处。