请求对象:
REST框架引入了一个Request
扩展常规的对象HttpRequest
,并提供更灵活的请求解析。Request
对象的核心功能是request.data
属性,它类似于request.POST
,但对于使用Web API更有用。
request.POST # 仅仅处理表单数据,仅用于POST方法
request.data # 处理任意的数据,用于POST,PUT,PATCH
响应对象:
REST框架还引入了一个Response
对象,该对象TemplateResponse
采用未呈现的内容并使用内容协商来确定要返回给客户端的正确内容类型。
return Response(data) # 换回响应内容
代码状态:
我们不再使用例如400,这样的数字表示请求状态,而是统一采用了status模块中的HTTP_400_BAD_REQUEST代替,能够更好的理解错误。
包装API视图
REST框架提供了两个可用于编写API视图的包装器。
1.@api_view用于处理基于函数的视图的装饰器。
2.和基类视图协作的APIView
类
这些包装器提供了一些功能,例如确保Request在视图中接收实例,以及向Response对象添加上下文以便可以执行内容协商。
包装器还提供行为,例如405 Method Not Allowed在适当时返回响应,以及处理使用格式错误的输入进行ParseError访问时发生的任何异常request.data。
基于以上的方法,重新修改我们的view.py 为:
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):
"""
List all code snippets, or create a new 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)
@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""
Retrieve, update or delete a code snippet.
"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = SnippetSerializer(snippet, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
URL中添加可选的格式后缀
提供更多样的响应格式
# view.py
def snippet_list(request, format=None):
# urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views
urlpatterns = [
path('snippets/', views.snippet_list),
path('snippets/<int:pk>', views.snippet_detail),
]
urlpatterns = format_suffix_patterns(urlpatterns) # 这里对urlpatterns 进行加内容类型
至此,我们得到了更便捷的请求和响应,响应内容中有正确的状态码提示,API接口换回内容,以级内容格式更多样。直接访问能得到http代码,方便调试接口。
# 个人理解,有误请指正 #