05 请求与响应
REST框架的核心包括几个基本的构建模块
Request objects:扩展了常规
HttpRequest
的Request
对象提供了更灵活的请求解析。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
:用于FBVAPIVIEW
:用于CBV
Request``Response
使用以上组件,定义视图
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
@api_view(['GET', 'POST'])
def snippet_list(request):
"""
列出所有的snippets,或者创建一个新的snippet。
"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = SnippetSerializer(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)
Request
如果你正在做基于REST的web服务…你最好忽略
request.POST
— Malcom Tredinnick, Django developers group
REST framework的Request
类扩展了标准的HttpRequest
,添加对REST framework的灵活请求解析和请求身份验证的支持。
REST framework的 Request
提供灵活的请求解析,允许你以与通常处理表单数据相同的方式使用JSON数据或者其他媒体类型处理请求。
request.data
返回请求正文的解析内容。与原始的request.POST
和request.FILES
类似,并增加了以下特性:
- 它包括所有解析的崆,包括文件或者非文件输入
- 支持解析除
POST
之外的HTTP方法的内容,这意味着你可以访问PUT/PATCH
请求的内容。 - 支持REST framework灵活的请求解析,而不仅仅是表单数据。如,你可以心与处理传入表单数据相同的方式处理传入的JSON数据。
request.query_params
是request.GET
的一个更准确的同义词