官網地址python
這一章將開始覆蓋Rest framework的核心。讓咱們來介紹一些基礎組件。web
Rest framework 引入了一個繼承於django HttpRequest
的對象Request
,並提供更靈活的解析。Request
的核心是request.data
屬性,他相似於request.POST
,但對web api更有用。django
request.POST #只處理form data,並且只適用於'POST'方法 request.data #處理全部數據,適用於 'POST','PUT','PATCH'
Rest framework 也引入了Response
對象,它是一個TemplateResponse
類型,並根據客戶端需求正確返回須要的類型。json
return Response(data) # 根據客戶端的需求返回不一樣的類型。
在你的views
中使用HTTP狀態碼,老是不太容易閱讀的,並且稍不注意,你會返回一個錯誤的狀態碼。Rest framework爲每一個狀態碼提供了更爲明確的標識符。例如 status
模塊中的 HTTP_400-BAD_REQUEST
。api
REST framework爲你提供了兩個裝飾器,你可以使用它們來寫你的API views。url
@api_view
裝飾器適用於function based viewsAPIView
裝飾器適用於 class-based viewsRequest
,並將上下文添加到Response
當中,這樣就能根據客戶端的須要返回。裝飾器還提供行爲,例如適當的時候返回405 Method Not Allowed
和當訪問request.data或者輸入錯誤時,處理全部的'ParseError'異常。rest
好,來開始使用新的組件來寫咱們的views。
咱們不再須要在views.py
中使用JSONResonse
了。咱們來開始重構咱們的views.code
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 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)
咱們所展現的示例view和以前相比,有了至關大的進展。它更小更簡潔,若是咱們正在使用Form API,會發現這個代碼很是的類似。咱們也可以使用 named status codes
。orm
接下來,咱們將在views.py
模塊中展現一個snippet的詳情。對象
@api_view(['GET','PUT','DELETE']) def snippet_detail(request,pk) ''' 檢索,更新或者刪除一個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.date) 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.HTPP_400_BAD_REQUEST) elif request.method == "DELETE": snippe.delete() return Response(status.status.HTTP_204_NO_CONTENT)
這一切都應該感受特別熟悉-它和標準的Django views沒多少不一樣。
注意:咱們再也不明確指定 request和response的響應類型。request.data
可以處理全部進來的json
請求,但他也可以處理其餘的格式。一樣,咱們在response中返回咱們的數據,可是由REST framework 來幫助咱們來爲不一樣的請求作出正確的響應內容。
爲咱們剛纔編寫的兩個view添加url.
def snippet_list(request,format=None)
def snippet_detail(request,pk,format=None)
如今,咱們稍微修改一下咱們的urls.py
文件。
from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patterns from snippets import views urlpatterns = [ url(r'^snippets/$',views.snippet_list), url(r'^snippets/(?P<pk>[0-9]+)$',views.snippet_detail), ] urlpatterns = format_suffix_patterns(urlpatterns)
咱們不是必需要添加這些額外的url patterns,可是它給咱們一個簡單,乾淨的特定格式。