前言:在上一篇文章,已經實現了訪問指定URL就返回了指定的數據,這也體現了RESTful API的一個理念,每一個URL代表著一個資源。當然我們還知道RESTful API的另一個特性就是,發送不同的請求動作,會返還不同的響應,這篇文章就講一下django-rest-framework這個工具在這方面給我們帶來的便捷操作。
一、Request對象
平時我們在寫Django的視圖函數的時候,都會帶上一個request參數,這樣就能處理平時搭建網站時,瀏覽器訪問網頁時發出的常規的HttpRequest。但是現在我們導入了django-rest-framework,它能夠對request進行拓展,并且提供更靈活的請求解析。這個特性體現在哪呢?請看下面這個例子:
<SPAN style="FONT-SIZE: 13px">request.POST # Only handles <SPAN style="COLOR: #ff0000">form data</SPAN>. Only works for '<SPAN style="COLOR: #ff0000">POST</SPAN>' method. request.data # Handles <SPAN style="COLOR: #ff0000">arbitrary(任意的) data</SPAN>. Works for '<SPAN style="COLOR: #ff0000">POST', 'PUT' and 'PATCH</SPAN>' methods. </SPAN>
request.POST只能處理前端發起的POST請求,只能處理表單提交的數據。而request.data可以處理任意數據,而不單單是前端提交的表單數據,可用于post, put, patch請求。
二、Response對象
和request對象一樣,django-rest-framework也對其進行了很實用的拓展,在我上一篇文章的snippets/views.py中,我們導入了JsonResponse用于返回json格式的響應,在視圖函數中是這樣的:
@csrf_exemptdef snippet_list(request): """ because we want to be able to POST to this view from clients that won't have a CSRF token we need to mark the view as csrf_exempt List all code snippets, or create a new snippet. """ if request.method == "GET": snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return JsonResponse(serializer.data, safe=False) elif request.method == "POST": data = JSONParser().parse(request) serializer = SnippetSerializer(data=data) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data, status=201) return JsonResponse(serializer.errors, status=400)
也就是說,在return的時候就需要指明json格式,這樣顯得很不實用而且很單一,所以經過拓展后的Reponse對象就很方便了,它會根據客戶端的請求頭部信息來確定正確的內容類型以返回給客戶端。只需如下代碼:
<SPAN style="FONT-SIZE: 13px">return Response(data) # <SPAN style="COLOR: #ff0000">Renders to content type as requested by the client. </SPAN></SPAN>
三、狀態碼
我們知道發送http請求時會返回各種各樣的狀態嗎,但是都是簡單的數字,比如200、404等,這些純數字標識符有時候可能不夠明確或者客戶端在使用的時候不清楚錯誤信息甚至是沒注意看不到,所以django-rest-framework也對此進行了優化,狀態碼會是HTTP_400_BAD_REQUEST、HTTP_404_NOT_FOUND這種,極大的提高可讀性
新聞熱點
疑難解答