DRF--视图集

摘要:
@api_View()在DRF中,您还可以使用常规的基于函数的视图。DRF提供了一组简单的装饰器来包装视图函数,以确保视图函数接收请求对象。它还允许您设置此请求的处理方法@api_View()decorator语法:@api_ viewapi_viewdecorator的主要参数是响应的HTTP方法列表。例如,您可以编写一个非常简单的视图,返回一些类似这样的数据。“})此视图将使用设置中指定的默认呈现器、解析器、身份验证类等。默认情况下,将接收任何GET请求。

@api_view()

在DRF中,也可以使用常规的基于函数的视图,DRF提供了一组简单的装饰器,用来包装你的视图函数,以确保视图函数会收到Request(而不是Django原始的HttpRequest)对象。并且返回Response(而不是Django中的HttpResponse)对象。同时允许你设置这个请求的处理方式。

@api_view()装饰器

语法:@api_view(http_method_names=['GET'], exclude_from_schema=False)

api_view()装饰器的主要参数是响应的HTTP方法的列表。比如,你可以像这样写一个返回一些数据的非常简单的视图。

from rest_framework.decorators importapi_view
from rest_framework.response importResponse


@api_view()
defhello_world(request):
    return Response({"message": "Hello, world!"})

这个视图会使用settings中指定的默认的渲染器,解析器,认证类等等。

默认情况下,只要GET请求会被接收。其他的请求方法会得到一个”405MethodNotAllowed“的响应。但是,可以自己添加请求的方式。

from rest_framework.decorators importapi_view
from rest_framework.response importResponse


@api_view(['GET', 'POST'])
defhello_world(request):
    if request.method == 'POST':
        return Response("post方法。。。")
return Response("Hello, world!")

DRF提供了一组可以加到视图函数上的装饰器来重写一些默认设置。这些装饰器必须放在@api_view()装饰器的下面。比如,要创建一个使用限制器确保特定用户每天只能调用一次的视图,可以用@throttle_classes 装饰器并给它传递一个限制器类的列表。

from rest_framework.response importResponse
from rest_framework.decorators importapi_view, throttle_classes
from rest_framework.throttling importUserRateThrottle


classOncePerDayUserThrottle(UserRateThrottle):
    rate = '1/day'
    @api_view(['GET'])
    @throttle_classes([OncePerDayUserThrottle])
    defview(request):
        return Response("Hello")

这些装饰器和前文中的 APIView 的子类中设置的属性相对应。

可用的装饰器有:

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

这些装饰器都只接受一个参数,这个参数必须是类的列表或元组。

GenericAPIView

DRF通过多父类继承的方式,实现了各个不同的功能类。父类主要有两种,一种是mixin,一个是GenericAPIView。

属性

  • queryset - 必须指定!用于从视图返回对象的查询结果集。通常,你必须设置此属性或者重写 get_queryset() 方法。如果你重写了一个视图的方法,你应该调用get_queryset() 方法而不是直接访问该属性,因为 queryset 将被计算一次,这些结果将为后续请求缓存起来。
  • serializer_class - 用于验证和反序列化输入以及用于序列化输出的Serializer类。 通常,你必须设置此属性或者重写 get_serializer_class() 方法。
  • lookup_field - 用于执行各个model实例的对象查找的model字段。默认为 'pk' 。 请注意,在使用超链接API时,如果需要使用自定义的值,你需要确保在API视图和序列化类中都设置查找字段。
  • pagination_class - 使用的分页类。默认值为 DEFAULT_PAGINATION_CLASS 设置的值,即 'rest_framework.pagination.PageNumberPagination' 。
  • filter_backends - 用于过滤查询集的过滤器后端类的列表。默认值为DEFAULT_FILTER_BACKENDS 设置的值。
  • lookup_url_kwarg - 应用于对象查找的URL关键字参数。它的 URL conf 应该包括一个与这个值相对应的关键字参数。如果取消设置,默认情况下使用与 lookup_field 相同的值。
classPostDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset
=Post.objects.all() serializer_class =PostSerializer lookup_url_kwarg = 'sn' #看这里 def get(self, request, *args, **kwargs): return self.retrieve(request, *args, **kwargs) #urls.py path('posts/<int:sn>/', views.PostDetail.as_view()), #注意其中的参数名

方法

get_queryset(self)

返回list视图中使用的查询集,该查询集还用作detail视图中的查找基础。默认返回由 queryset 属性指定的查询集。 平时我们应该多使用这个方法,而不是直接访问(self.queryset ,因为 self.queryset 只会被提交一次(Django的ORM的缓存特性),然后这些结果将为后续的请求缓存起来。 该方法可能会被重写以提供动态行为。

get_object(self)

返回用于detail视图的对象实例。默认使用 lookup_field 参数过滤基本的查询集。该方法可以被重写以提供更复杂的行为,例如基于多个 URL 参数的对象查找。

get_serializer_class(self)

选择你想要使用的序列化类。默认返回 serializer_class 属性的值。

可以被重写以提供动态的行为,例如对于读取和写入操作使用不同的序列化器,或者为不同类型的用户提供不同的序列化器。

Mixins

Mixin 类用于提供视图的基本操作行为。注意mixin类提供动作方法,而不是直接定义处理程序方法,例如 .get() 和 .post() , 这允许更灵活的自定义。

Mixin 类可以从 rest_framework.mixins 导入。

下面我们看一下具体的mixin类:

ListModelMixin

提供一个 .list(request, *args, **kwargs) 方法,返回查询结果的列表。

如果查询集被填充了数据,则返回 200 OK 响应,将查询集的序列化表示作为响应的主体。相应数据可以任意分页。

CreateModelMixin

提供 .create(request, *args, **kwargs) 方法,实现创建和保存一个新model实例的功能。

如果创建了一个对象,这将返回一个 201 Created 响应,将该对象的序列化表示作为响应的主体。如果序列化的表示中包含名为 url 的键,则响应的 Location 头将填充该值。

如果为创建对象提供的请求数据无效,将返回 400 Bad Request ,其中错误详细信息作为响应的正文。

RetrieveModelMixin

提供一个 .retrieve(request, *args, **kwargs) 方法,返回响应中现有模型的实例。

如果可以检索对象,则返回 200 OK 响应,将该对象的序列化表示作为响应的主体。否则将返回 404 Not Found 。

UpdateModelMixin

提供 .update(request, *args, **kwargs) 方法,实现更新和保存现有模型实例的功能。

同时还提供了一个 .partial_update(request, *args, **kwargs) 方法,这个方法和 update 方法类似,但更新的所有字段都是可选的。这允许支持 HTTP PATCH 请求。

如果一个对象被更新,这将返回一个 200 OK 响应,并将对象的序列化表示作为响应的主体。如果为更新对象提供的请求数据无效,将返回一个 400 Bad Request 响应,错误详细信息作为响应的正文

DestroyModelMixin

提供一个 .destroy(request, *args, **kwargs) 方法,实现删除现有模型实例的功能。如果成功删除对象,则返回 204 No Content 响应,否则返回 404 Not Found 。

通用类视图

以下类是具体的通用视图,也是我们平时真正使用的类,除非你需要深度定制,否则不要直接使用上面的父类。这些视图类可以从 rest_framework.generics 导入。

  • CreateAPIView:仅用于创建功能的视图。提供 post 方法。
  • ListAPIView:以只读的方式列出某些查询对象的集合。提供 get 方法。
  • RetrieveAPIView:以只读的形式获取某个对象。提供 get 方法。
  • DestroyAPIView:删除单个模型实例。提供 delete 方法。
  • UpdateAPIView:更新单个模型实例。提供 put 和 patch 方法。
  • ListCreateAPIView:创建或者列出模型实例的集合。提供 get 和 post 方法。同时继承了ListModelMixin和CreateModelMixin两个mixin类,以及基类GenericAPIView。
  • RetrieveUpdateAPIView:读取或更新单个模型实例。提供 get , put 和 patch 方法的占坑。
  • RetrieveDestroyAPIView:读取或删除单个模型实例。提供 get 和 delete 方法。
  • RetrieveUpdateDestroyAPIView:读写删除单个模型实例。提供 get , put , patch 和 delete 方法。

免责声明:文章转载自《DRF--视图集》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇umilit 修改 linux 最多可打开文件数Django Admin Cookbook-9如何启用对计算字段的排序下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何调整cookie的生命周期

一、什么是cookie 形象比喻成“网络身份证” 指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。 (1)记录信息的盒子(2)识别每一个网络用户的证件 (3)12个月的存活期(4)每当用户访问了一个带有AdMaster代码的页面,cookie就会自动更新浏览信息 二、使用和禁用cookie 可以在浏览器的设置...

vue springboot利用easypoi实现简单导出

vue springboot利用easypoi实现简单导出 前言 一、easypoi是什么? 二、使用步骤 1.传送门 2.前端vue 3.后端springboot 3.1编写实体类(我这里是dto,也一样) 3.2控制层 结尾 前言 今天玩了一下vue springboot利用easypoi实现excel的导出,以前没玩过导入导出,...

vue+axois 封装请求+拦截器(请求锁+统一处理错误码)

 需求  封装常用请求  拦截器-请求锁  统一处理错误码 一、封装常用的请求   解决痛点:不要每一个模块的api都还要写get,post,patch请求方法。直接将这些常用的方法封装好。   解决方案:写一个类,封装好常用的请求   部分源码如下 export default class PublicAPI { constructor(ur...

drf—— drf的请求与响应

一、Request#常用属性 -data :前端以post请求提交的数据都在它中 -FILES :前端提交的文件 -query_params:就是原来的request.GET -重写了 __getattr__ -使用新的request.method其实取得就是原生request.method(通过反射实现)...

web优化之js动态合并 动态压缩 去掉js重复引用 js缓存 js延迟加载

做web前段也有一段时间了,对于web中js文件的加载有些体会想跟大家一起分享一下。 1.首先说说js文件的合并和压缩吧 为了便于集中式管理js的合并和压缩我们创建一个Js.ashx文件来专门处理合并压缩,这里我们借用Yahoo.Yui.Compressor工具来压缩我们的js文件 代码如下: public classJs : IHttpHandler...

Dubbo封装rest服务返回结果

由于Dubbo服务考虑到一个是给其他系统通过RPC调用,另外一个是提供HTTP协议本身系统的后台管理页面,因此Dubbo返回参数在rest返回的时候配置拦截器进行处理。 在拦截器中,对返回参数封装成如下对象,并统一输出到前端。 1 packagecom.wjs.common.web; 2 3 importorg.apache.commons.lang....