Loading

8.DRF请求响应和api_view

一、请求对象(Request objects)
 
DRF引入了一个扩展Django常规HttpRequest对象的Request对象,并提供了更灵活的请求解析能力
Request对象的核心功能是request.data属性,它与request.POST类似,但对于WebApi更为有用
request.POST #只处理表单数据,只适用于post方法
request.data  #处理任意数据 post、put和patch等方法
request.data可以是任意类型的数据,最终都会被处理正确响应给客户端

 

 
二、响应对象(Response objects)
DRF同时还引入了一个Response对象,这是一种尚未对内容进行渲染的TemplateResponse类型,并使用协商的结果来确定返回给客户端正确的内容类型
return Response(data) # 渲染成客户端请求的内容类型

 

 
三、状态码 (status codes)
在前后端分离的RESTful模式中,我们不能简单、随意的返回响应,而是需要使用http规定的,大家都认可的状态码形式
在视图中使用纯数字的http状态码不是很容易被理解,很容易被忽悠,rest框架为status模块中的每个状态代码 (如 http_400_BAD_REQUEST )提供了更明确的标识符,使用它们来代替纯数字的http状态码
 
四、封装API视图
rest框架提供了三种可用于编写API视图的包装饰器(wrappers)
1.基于函数视图的@api_view装饰器
2.基于类视图的APIView类系列
3.基于viewset视图集的类系列
这些包装饰器提供了一些功能,例如确保你在视图中接收到Request实例,并将上下文添加到Response,以便可以执行内容协商的约定
包装饰器还提供了诸如在适当时候返回 405 Method Not Allowed之类的响应,并处理在使用格式错误的输入来访问request.data时发生的任何ParseError异常
 
五、@api_view使用
from rest_framework import status  # rest框架提供的状态码模块
from rest_framework.decorators import api_view # api_view装饰器
from rest_framework.response import Response    # drf response对象
from snippets.models import Snippet
from snippets.serializers import SnippetSerizlizer

# 应用api_view装饰器声明该视图是drf视图,而不是原生视图
# 装饰器列表传参 声明该视图处理哪种类型的请求
@api_view(['GET', 'POST'])
def snippet_list(request):
    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serizlizer = SnippetSerizlizer(snippets, many=True)
        return Response(serizlizer.data)

    if request.method == 'POST':
        # request.data用默认的解析器已经将数据解析称json,就不用再专门解析一次
        # 因为request.data可以是任意类型的数据,最终都会被处理正确响应给客户端
        serializer = SnippetSerizlizer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED) 
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

 

 
posted @ 2022-04-29 19:27  木子七  阅读(86)  评论(0编辑  收藏  举报