請求對象:
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代碼,方便調試接口。
# 個人理解,有誤請指正 #