在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 import api_view from rest_framework.response import Response @api_view() def hello_world(request): return Response({"message": "Hello, world!"})
这个视图会使用settings中指定的默认的渲染器,解析器,认证类等等。
默认情况下,只要GET请求会被接收。其他的请求方法会得到一个”405 Method Not Allowed“的响应。但是,可以自己添加请求的方式。
from rest_framework.decorators import api_view from rest_framework.response import Response @api_view([‘GET‘, ‘POST‘]) def hello_world(request): if request.method == ‘POST‘: return Response("post方法。。。")
return Response("Hello, world!")
DRF提供了一组可以加到视图函数上的装饰器来重写一些默认设置。这些装饰器必须放在@api_view()装饰器的下面。比如,要创建一个使用限制器确保特定用户每天只能调用一次的视图,可以用 @throttle_classes 装饰器并给它传递一个限制器类的列表。
from rest_framework.response import Response 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("Hello")
这些装饰器和前文中的 APIView 的子类中设置的属性相对应。
可用的装饰器有:
这些装饰器都只接受一个参数,这个参数必须是类的列表或元组。
DRF通过多父类继承的方式,实现了各个不同的功能类。父类主要有两种,一种是mixin,一个是GenericAPIView。
属性
class PostDetail(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 属性的值。
可以被重写以提供动态的行为,例如对于读取和写入操作使用不同的序列化器,或者为不同类型的用户提供不同的序列化器。
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 导入。
原文:https://www.cnblogs.com/zouzou-busy/p/12076629.html