摘要:請注意,我們不再明確地將我們的請求或響應(yīng)明確綁定到給定的內(nèi)容類型。這允許返回完全可瀏覽網(wǎng)頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫
從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構(gòu)建塊。
請求對象
REST框架引入了Request擴(kuò)展常規(guī)的對象HttpRequest,并提供更靈活的請求解析。Request對象的核心功能是request.data屬性,這與request.POST使用Web API 相似但更有用。
request.POST # Only handles form data. Only works for "POST" method. request.data # Handles arbitrary data. Works for "POST", "PUT" and "PATCH" methods.
響應(yīng)對象
REST框架還引入了一個Response對象,它是一種類型的對象,它TemplateResponse采用未呈現(xiàn)的內(nèi)容,并使用內(nèi)容協(xié)商來確定正確的內(nèi)容類型以返回給客戶端。
return Response(data) # Renders to content type as requested by the client.
狀態(tài)碼
在您的視圖中使用數(shù)字HTTP狀態(tài)代碼并不總是用于明顯的閱讀,如果錯誤代碼錯誤,很容易就不會注意到。REST框架為每一個狀態(tài)碼更明確的標(biāo)識符,如HTTP_400_BAD_REQUEST所述的status模塊。相對于使用數(shù)字標(biāo)識符更好。
包裝API視圖
REST框架提供了兩個可用于編寫API視圖的包裝器。
@api_view用于使用基于功能的視圖的裝飾器。
該APIView班與基于類的視圖工作。
這些包裝器提供了一些功能,例如確保您Request在視圖中接收實例,并將上下文添加到Response對象,以便可以執(zhí)行內(nèi)容協(xié)商。
包裝器還提供405 Method Not Allowed適當(dāng)?shù)姆祷仨憫?yīng)等行為,以及處理使用格式不正確的輸入ParseError訪問時發(fā)生的任何異常request.data。
把它拉在一起
好的,讓我們開始使用這些新的組件來寫幾個視圖。
我們不再需要我們的JSONResponse課views.py,所以繼續(xù)刪除。一旦完成,我們可以稍微開始重構(gòu)我們的觀點。
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所有數(shù)據(jù),后者創(chuàng)建一個新的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)
我們的實例視圖比以前的例子有所改進(jìn)。這有點簡明扼要,現(xiàn)在的代碼與我們使用Forms API非常相似。我們還使用命名狀態(tài)代碼,這使得響應(yīng)意義更加明顯。
以下是views.py模塊中單個代碼段的視圖。
@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.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)
這應(yīng)該都是非常熟悉的 - 它與使用常規(guī)Django視圖沒有什么不同。
請注意,我們不再明確地將我們的請求或響應(yīng)明確綁定到給定的內(nèi)容類型。 request.data可以處理傳入的json請求,但它也可以處理其他格式。類似地,我們使用數(shù)據(jù)返回響應(yīng)對象,但允許REST框架將響應(yīng)呈現(xiàn)給正確的內(nèi)容類型。
向我們的網(wǎng)址添加可選的格式后綴
為了充分利用我們的響應(yīng)不再單一的內(nèi)容類型,我們可以為API端點添加對格式后綴的支持。使用格式后綴給我們明確指定給定格式的URL,這意味著我們的API將能夠處理諸如http://example.com/api/items/...之類的 URL 。
首先format在兩個視圖中添加一個關(guān)鍵字參數(shù),就像這樣。
def snippet_list(request, format=None):
和
def snippet_detail(request, pk, format=None):
現(xiàn)在urls.py稍稍更新文件,format_suffix_patterns除了現(xiàn)有的URL之外還附加一組。
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[0-9]+)$", views.snippet_detail), ] urlpatterns = format_suffix_patterns(urlpatterns)
我們不一定需要添加這些額外的url模式,但它給了我們一個簡單,干凈的方式來引用特定的格式。
怎么看?
從命令行開始測試API,就像我們在第1部分中所做的那樣。一切工作都非常相似,盡管如果發(fā)送無效請求,我們有更好的錯誤處理。
我們可以像以前一樣獲取所有片段的列表。
http http://127.0.0.1:8000/snippets/ HTTP/1.1 200 OK ... [ { "id": 1, "title": "", "code": "foo = "bar" ", "linenos": false, "language": "python", "style": "friendly" }, { "id": 2, "title": "", "code": "print "hello, world" ", "linenos": false, "language": "python", "style": "friendly" } ]
我們可以通過使用Accept頭來控制回復(fù)的格式:
http http://127.0.0.1:8000/snippets/ Accept:application/json # Request JSON http http://127.0.0.1:8000/snippets/ Accept:text/html # Request HTML
或通過附加格式后綴:
http http://127.0.0.1:8000/snippets.json # JSON suffixhttp http://127.0.0.1:8000/snippets.api # Browsable API suffix
類似地,我們可以使用Content-Type頭來控制我們發(fā)送的請求的格式。
# POST using form data http --form POST http://127.0.0.1:8000/snippets/ code="print 123" { "id": 3, "title": "", "code": "print 123", "linenos": false, "language": "python", "style": "friendly" } # POST using JSON http --json POST http://127.0.0.1:8000/snippets/ code="print 456" { "id": 4, "title": "", "code": "print 456", "linenos": false, "language": "python", "style": "friendly" }
如果您--debug向上述http請求添加切換器,則可以在請求標(biāo)頭中查看請求類型。
現(xiàn)在,在Web瀏覽器中打開API,訪問http://127.0.0.1:8000/snippets/。
瀏覽功能
由于API根據(jù)客戶端請求選擇響應(yīng)的內(nèi)容類型,因此默認(rèn)情況下,當(dāng)Web瀏覽器請求該資源時,它將返回資源的HTML格式表示。這允許API返回完全可瀏覽網(wǎng)頁的HTML表示。
擁有可瀏覽網(wǎng)頁的API是一個巨大的可用性勝利,并使開發(fā)和使用您的API更容易。它也大大降低了其他開發(fā)人員要檢查和使用API的障礙。
有關(guān)可瀏覽的API功能以及如何自定義API的更多信息,請參閱可瀏覽的api主題。
下一步是什么?
在第3部分的教程中,我們將開始使用基于類的視圖,并查看通用視圖如何減少需要編寫的代碼量。
Django REST FrameWork中文文檔目錄:
Django REST FrameWork 中文教程1:序列化
Django REST FrameWork 中文教程2:請求和響應(yīng)
Django REST FrameWork 中文教程3:基于類的視圖
Django REST FrameWork 中文教程4:驗證和權(quán)限
Django REST FrameWork 中文教程5:關(guān)系和超鏈接API
Django REST FrameWork 中文教程6: ViewSets&Routers
Django REST FrameWork 中文教程7:模式和客戶端庫
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44460.html
摘要:請注意,我們不再明確地將我們的請求或響應(yīng)明確綁定到給定的內(nèi)容類型。這允許返回完全可瀏覽網(wǎng)頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構(gòu)建塊。 請求對象REST框架引入了Request擴(kuò)展常規(guī)的對象HttpReques...
摘要:請注意,我們不再明確地將我們的請求或響應(yīng)明確綁定到給定的內(nèi)容類型。這允許返回完全可瀏覽網(wǎng)頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構(gòu)建塊。 請求對象REST框架引入了Request擴(kuò)展常規(guī)的對象HttpReques...
摘要:未經(jīng)身份驗證的請求應(yīng)具有完全只讀訪問權(quán)限。其中一個字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗證的用戶可以創(chuàng)建...
摘要:未經(jīng)身份驗證的請求應(yīng)具有完全只讀訪問權(quán)限。其中一個字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗證的用戶可以創(chuàng)建...
摘要:未經(jīng)身份驗證的請求應(yīng)具有完全只讀訪問權(quán)限。其中一個字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應(yīng)中文教程基于類的視圖中文教程驗證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗證的用戶可以創(chuàng)建...
閱讀 2839·2023-04-25 20:06
閱讀 1454·2021-08-26 14:15
閱讀 2244·2021-08-12 13:27
閱讀 1782·2019-08-30 15:55
閱讀 3480·2019-08-30 13:20
閱讀 2836·2019-08-29 15:12
閱讀 3340·2019-08-29 15:06
閱讀 2871·2019-08-29 14:13