05 请求与响应

REST框架的核心包括几个基本的构建模块

  • Request objects:扩展了常规HttpRequestRequest对象提供了更灵活的请求解析。Request对象的核心功能是request.data属性,它与request.POST类似,但对于使用 Web API更为有用。

  • request.POST 只处理表单数据,只适用于POST方法

  • request.data 片任意数据 适用于POST/PUT/PATCH方法

Response objects:这是一种获取未渲染内容的TemplateResponse类型,并使用内容协商来确定返回给客户端的正确内容类型

  • Status codes:在视图中使用纯数字的HTTP code难以理解。而且如果错误代码出错,很容易被忽略。REST框架为status模块中的每个状态代码提供了更明确的标识符。推荐替换django原生的状态代码。

wrapping APIView:REST框架提供了两个可用于编写API视图的包装器(wrappers)

  • @api_view:用于FBV
  • APIVIEW:用于CBV

Request``Response
使用以上组件,定义视图

  1. from rest_framework import status
  2. from rest_framework.decorators import api_view
  3. from rest_framework.response import Response
  4. from snippets.models import Snippet
  5. from snippets.serializers import SnippetSerializer
  6. @api_view(['GET', 'POST'])
  7. def snippet_list(request):
  8. """
  9. 列出所有的snippets,或者创建一个新的snippet。
  10. """
  11. if request.method == 'GET':
  12. snippets = Snippet.objects.all()
  13. serializer = SnippetSerializer(snippets, many=True)
  14. return Response(serializer.data)
  15. elif request.method == 'POST':
  16. serializer = SnippetSerializer(data=request.data)
  17. if serializer.is_valid():
  18. serializer.save()
  19. return Response(serializer.data, status=status.HTTP_201_CREATED)
  20. return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Request

如果你正在做基于REST的web服务…你最好忽略 request.POST

— Malcom Tredinnick, Django developers group

REST framework的Request类扩展了标准的HttpRequest,添加对REST framework的灵活请求解析和请求身份验证的支持。

REST framework的 Request 提供灵活的请求解析,允许你以与通常处理表单数据相同的方式使用JSON数据或者其他媒体类型处理请求。

request.data返回请求正文的解析内容。与原始的request.POSTrequest.FILES类似,并增加了以下特性:

  • 它包括所有解析的崆,包括文件或者非文件输入
  • 支持解析除POST之外的HTTP方法的内容,这意味着你可以访问PUT/PATCH请求的内容。
  • 支持REST framework灵活的请求解析,而不仅仅是表单数据。如,你可以心与处理传入表单数据相同的方式处理传入的JSON数据。

request.query_paramsrequest.GET的一个更准确的同义词