DRF的Request对象和Response对象
一旦使用了DRF的视图,那么传入视图的Request对象不在是Django的Request对象,而是DRF封装过后的Request对象。同样,DRF建议使用封装过的Response来返回HTTP响应,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
Request对象
REST framework 的Request类扩展了标准HttpRequest,增加了对 REST framework 灵活的请求解析和请求身份验证的支持。由于实现原因,Request类不是从HttpRequest类继承,而是使用组合扩展该类。 因此,HttpRequest类的方法和属性依旧是可以使用的。
Request.data
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。这样后端使用统一的方式来获取数据,无论前端传递的是表单,json还是其它格式。后端使用统一的方式接受数据即可。
代码语言:javascript复制@api_view(['POST'])
def post(request):
data = request.data # 获取请求体数据
return Response(data)
包含了对POST、PUT、PATCH请求方式解析后的数据; 利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据。
如果需要上传文件,请阅读DRF上传文件
注意
代码语言:javascript复制在开发客户端应用程序时,请始终记住确保Content-Type在 HTTP 请求中发送数据时设置标头。
如果您不设置内容类型,大多数客户端将默认使用'application/x-www-form-urlencoded',这可能不是您想要的。
例如,如果您json使用带有.ajax() 方法的jQuery发送编码数据,则应确保包含该contentType: 'application/json'设置。
如果服务器和客户端之间约定好了使用json来传递信息,此时可以对默认解析器进行设置,在settings.py中加入下面的内容即可。
代码语言:javascript复制REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
]
}
也可以使用基于APIView类的视图设置用于单个视图或视图集的解析器。例如:
代码语言:javascript复制# 视图集
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIView
class ExampleView(APIView):
"""
A view that can accept POST requests with JSON content.
"""
parser_classes = [JSONParser]
def post(self, request, format=None):
return Response({'received data': request.data})
# 单个视图
from rest_framework.decorators import api_view
from rest_framework.decorators import parser_classes
from rest_framework.parsers import JSONParser
@api_view(['POST'])
@parser_classes([JSONParser])
def example_view(request, format=None):
"""
A view that can accept POST requests with JSON content.
"""
return Response({'received data': request.data})
Request.query_params
request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已。 无论请求方式是什么,URL中的参数,我们在DRF中总是使用request.query_params来获取。例如:
代码语言:javascript复制@api_view(['GET'])
def geta(request):
data = request.query_params
print(data)
return Response(data)
我们发起的请求可以如下所示:
http://127.0.0.1:8888/people?username=123&email=123@123.com
返回的结果如下:
代码语言:javascript复制{
"username": "123",
"email": "123@123.com"
}
Response对象
REST Framework的Response继承自Django的SimpleTemplateResponse类。使用Response类只是为返回内容协商的 Web API 响应提供了一个更好的接口,可以呈现为多种格式。你也可以选择Django的HttpResponse或StreamingHttpResponse,都是可以的。不过DRF官方还是建议我们对继承自APIView类或使用@api_view进行装饰的函数,都返回Response对象。
使用了Response对象返回,默认会带有一定的样式。例如:
参考资料: https://www.django-rest-framework.org/api-guide/requests/ https://www.django-rest-framework.org/api-guide/responses/