摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫
從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。
請求對象
REST框架引入了Request擴展常規的對象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.
響應對象
REST框架還引入了一個Response對象,它是一種類型的對象,它TemplateResponse采用未呈現的內容,并使用內容協商來確定正確的內容類型以返回給客戶端。
return Response(data) # Renders to content type as requested by the client.
狀態碼
在您的視圖中使用數字HTTP狀態代碼并不總是用于明顯的閱讀,如果錯誤代碼錯誤,很容易就不會注意到。REST框架為每一個狀態碼更明確的標識符,如HTTP_400_BAD_REQUEST所述的status模塊。相對于使用數字標識符更好。
包裝API視圖
REST框架提供了兩個可用于編寫API視圖的包裝器。
@api_view用于使用基于功能的視圖的裝飾器。
該APIView班與基于類的視圖工作。
這些包裝器提供了一些功能,例如確保您Request在視圖中接收實例,并將上下文添加到Response對象,以便可以執行內容協商。
包裝器還提供405 Method Not Allowed適當的返回響應等行為,以及處理使用格式不正確的輸入ParseError訪問時發生的任何異常request.data。
把它拉在一起
好的,讓我們開始使用這些新的組件來寫幾個視圖。
我們不再需要我們的JSONResponse課views.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): """ 顯示snippets所有數據,后者創建一個新的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)
我們的實例視圖比以前的例子有所改進。這有點簡明扼要,現在的代碼與我們使用Forms API非常相似。我們還使用命名狀態代碼,這使得響應意義更加明顯。
以下是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)
這應該都是非常熟悉的 - 它與使用常規Django視圖沒有什么不同。
請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。 request.data可以處理傳入的json請求,但它也可以處理其他格式。類似地,我們使用數據返回響應對象,但允許REST框架將響應呈現給正確的內容類型。
向我們的網址添加可選的格式后綴
為了充分利用我們的響應不再單一的內容類型,我們可以為API端點添加對格式后綴的支持。使用格式后綴給我們明確指定給定格式的URL,這意味著我們的API將能夠處理諸如http://example.com/api/items/...之類的 URL 。
首先format在兩個視圖中添加一個關鍵字參數,就像這樣。
def snippet_list(request, format=None):
和
def snippet_detail(request, pk, format=None):
現在urls.py稍稍更新文件,format_suffix_patterns除了現有的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部分中所做的那樣。一切工作都非常相似,盡管如果發送無效請求,我們有更好的錯誤處理。
我們可以像以前一樣獲取所有片段的列表。
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頭來控制回復的格式:
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頭來控制我們發送的請求的格式。
# 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請求添加切換器,則可以在請求標頭中查看請求類型。
現在,在Web瀏覽器中打開API,訪問http://127.0.0.1:8000/snippets/。
瀏覽功能
由于API根據客戶端請求選擇響應的內容類型,因此默認情況下,當Web瀏覽器請求該資源時,它將返回資源的HTML格式表示。這允許API返回完全可瀏覽網頁的HTML表示。
擁有可瀏覽網頁的API是一個巨大的可用性勝利,并使開發和使用您的API更容易。它也大大降低了其他開發人員要檢查和使用API的障礙。
有關可瀏覽的API功能以及如何自定義API的更多信息,請參閱可瀏覽的api主題。
下一步是什么?
在第3部分的教程中,我們將開始使用基于類的視圖,并查看通用視圖如何減少需要編寫的代碼量。
Django REST FrameWork中文文檔目錄:
Django REST FrameWork 中文教程1:序列化
Django REST FrameWork 中文教程2:請求和響應
Django REST FrameWork 中文教程3:基于類的視圖
Django REST FrameWork 中文教程4:驗證和權限
Django REST FrameWork 中文教程5:關系和超鏈接API
Django REST FrameWork 中文教程6: ViewSets&Routers
Django REST FrameWork 中文教程7:模式和客戶端庫
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44460.html
摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。 請求對象REST框架引入了Request擴展常規的對象HttpReques...
摘要:請注意,我們不再明確地將我們的請求或響應明確綁定到給定的內容類型。這允許返回完全可瀏覽網頁的表示。中文文檔目錄中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 從這一點開始,我們將真正開始覆蓋REST框架的核心。我們來介紹幾個基本的構建塊。 請求對象REST框架引入了Request擴展常規的對象HttpReques...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
摘要:未經身份驗證的請求應具有完全只讀訪問權限。其中一個字段將用于表示創建代碼段的用戶。唯一的限制是所包含的必須使用命名空間。中文教程序列化中文教程請求和響應中文教程基于類的視圖中文教程驗證和權限中文教程關系和超鏈接中文教程中文教程模式和客戶端庫 目前,我們的API對誰可以編輯或刪除代碼段沒有任何限制。我們想要一些更高級的行為,以確保: 代碼段始終與創建者相關聯。 只有身份驗證的用戶可以創建...
閱讀 2825·2023-04-25 20:06
閱讀 1446·2021-08-26 14:15
閱讀 2234·2021-08-12 13:27
閱讀 1772·2019-08-30 15:55
閱讀 3469·2019-08-30 13:20
閱讀 2826·2019-08-29 15:12
閱讀 3330·2019-08-29 15:06
閱讀 2858·2019-08-29 14:13