摘要:請(qǐng)注意,我們不再明確地將我們的請(qǐng)求或響應(yīng)明確綁定到給定的內(nèi)容類型。這允許返回完全可瀏覽網(wǎng)頁的表示。中文文檔目錄中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫
從這一點(diǎn)開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個(gè)基本的構(gòu)建塊。
請(qǐng)求對(duì)象
REST框架引入了Request擴(kuò)展常規(guī)的對(duì)象HttpRequest,并提供更靈活的請(qǐng)求解析。Request對(duì)象的核心功能是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)對(duì)象
REST框架還引入了一個(gè)Response對(duì)象,它是一種類型的對(duì)象,它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)代碼并不總是用于明顯的閱讀,如果錯(cuò)誤代碼錯(cuò)誤,很容易就不會(huì)注意到。REST框架為每一個(gè)狀態(tài)碼更明確的標(biāo)識(shí)符,如HTTP_400_BAD_REQUEST所述的status模塊。相對(duì)于使用數(shù)字標(biāo)識(shí)符更好。
包裝API視圖
REST框架提供了兩個(gè)可用于編寫API視圖的包裝器。
@api_view用于使用基于功能的視圖的裝飾器。
該APIView班與基于類的視圖工作。
這些包裝器提供了一些功能,例如確保您Request在視圖中接收實(shí)例,并將上下文添加到Response對(duì)象,以便可以執(zhí)行內(nèi)容協(xié)商。
包裝器還提供405 Method Not Allowed適當(dāng)?shù)姆祷仨憫?yīng)等行為,以及處理使用格式不正確的輸入ParseError訪問時(shí)發(fā)生的任何異常request.data。
把它拉在一起
好的,讓我們開始使用這些新的組件來寫幾個(gè)視圖。
我們不再需要我們的JSONResponse課views.py,所以繼續(xù)刪除。一旦完成,我們可以稍微開始重構(gòu)我們的觀點(diǎn)。
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)建一個(gè)新的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)
我們的實(shí)例視圖比以前的例子有所改進(jìn)。這有點(diǎn)簡(jiǎn)明扼要,現(xiàn)在的代碼與我們使用Forms API非常相似。我們還使用命名狀態(tài)代碼,這使得響應(yīng)意義更加明顯。
以下是views.py模塊中單個(gè)代碼段的視圖。
@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視圖沒有什么不同。
請(qǐng)注意,我們不再明確地將我們的請(qǐng)求或響應(yīng)明確綁定到給定的內(nèi)容類型。 request.data可以處理傳入的json請(qǐng)求,但它也可以處理其他格式。類似地,我們使用數(shù)據(jù)返回響應(yīng)對(duì)象,但允許REST框架將響應(yīng)呈現(xiàn)給正確的內(nèi)容類型。
向我們的網(wǎng)址添加可選的格式后綴
為了充分利用我們的響應(yīng)不再單一的內(nèi)容類型,我們可以為API端點(diǎn)添加對(duì)格式后綴的支持。使用格式后綴給我們明確指定給定格式的URL,這意味著我們的API將能夠處理諸如http://example.com/api/items/...之類的 URL 。
首先format在兩個(gè)視圖中添加一個(gè)關(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模式,但它給了我們一個(gè)簡(jiǎn)單,干凈的方式來引用特定的格式。
怎么看?
從命令行開始測(cè)試API,就像我們?cè)诘?部分中所做的那樣。一切工作都非常相似,盡管如果發(fā)送無效請(qǐng)求,我們有更好的錯(cuò)誤處理。
我們可以像以前一樣獲取所有片段的列表。
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ā)送的請(qǐng)求的格式。
# 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請(qǐng)求添加切換器,則可以在請(qǐng)求標(biāo)頭中查看請(qǐng)求類型。
現(xiàn)在,在Web瀏覽器中打開API,訪問http://127.0.0.1:8000/snippets/。
瀏覽功能
由于API根據(jù)客戶端請(qǐng)求選擇響應(yīng)的內(nèi)容類型,因此默認(rèn)情況下,當(dāng)Web瀏覽器請(qǐng)求該資源時(shí),它將返回資源的HTML格式表示。這允許API返回完全可瀏覽網(wǎng)頁的HTML表示。
擁有可瀏覽網(wǎng)頁的API是一個(gè)巨大的可用性勝利,并使開發(fā)和使用您的API更容易。它也大大降低了其他開發(fā)人員要檢查和使用API的障礙。
有關(guān)可瀏覽的API功能以及如何自定義API的更多信息,請(qǐng)參閱可瀏覽的api主題。
下一步是什么?
在第3部分的教程中,我們將開始使用基于類的視圖,并查看通用視圖如何減少需要編寫的代碼量。
Django REST FrameWork中文文檔目錄:
Django REST FrameWork 中文教程1:序列化
Django REST FrameWork 中文教程2:請(qǐng)求和響應(yīng)
Django REST FrameWork 中文教程3:基于類的視圖
Django REST FrameWork 中文教程4:驗(yàn)證和權(quán)限
Django REST FrameWork 中文教程5:關(guān)系和超鏈接API
Django REST FrameWork 中文教程6: ViewSets&Routers
Django REST FrameWork 中文教程7:模式和客戶端庫
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/40917.html
摘要:請(qǐng)注意,我們不再明確地將我們的請(qǐng)求或響應(yīng)明確綁定到給定的內(nèi)容類型。這允許返回完全可瀏覽網(wǎng)頁的表示。中文文檔目錄中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 從這一點(diǎn)開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個(gè)基本的構(gòu)建塊。 請(qǐng)求對(duì)象REST框架引入了Request擴(kuò)展常規(guī)的對(duì)象HttpReques...
摘要:請(qǐng)注意,我們不再明確地將我們的請(qǐng)求或響應(yīng)明確綁定到給定的內(nèi)容類型。這允許返回完全可瀏覽網(wǎng)頁的表示。中文文檔目錄中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 從這一點(diǎn)開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個(gè)基本的構(gòu)建塊。 請(qǐng)求對(duì)象REST框架引入了Request擴(kuò)展常規(guī)的對(duì)象HttpReques...
摘要:未經(jīng)身份驗(yàn)證的請(qǐng)求應(yīng)具有完全只讀訪問權(quán)限。其中一個(gè)字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對(duì)誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級(jí)的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗(yàn)證的用戶可以創(chuàng)建...
摘要:未經(jīng)身份驗(yàn)證的請(qǐng)求應(yīng)具有完全只讀訪問權(quán)限。其中一個(gè)字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對(duì)誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級(jí)的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗(yàn)證的用戶可以創(chuàng)建...
摘要:未經(jīng)身份驗(yàn)證的請(qǐng)求應(yīng)具有完全只讀訪問權(quán)限。其中一個(gè)字段將用于表示創(chuàng)建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請(qǐng)求和響應(yīng)中文教程基于類的視圖中文教程驗(yàn)證和權(quán)限中文教程關(guān)系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對(duì)誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級(jí)的行為,以確保: 代碼段始終與創(chuàng)建者相關(guān)聯(lián)。 只有身份驗(yàn)證的用戶可以創(chuàng)建...
閱讀 2680·2019-08-30 15:55
閱讀 1811·2019-08-30 15:53
閱讀 2661·2019-08-29 18:38
閱讀 934·2019-08-26 13:49
閱讀 507·2019-08-23 15:42
閱讀 3133·2019-08-22 16:33
閱讀 1009·2019-08-21 17:59
閱讀 1088·2019-08-21 17:11