django rest framework我的學習筆記(四)————Tutorial2.Request and Response

官網地址python

Request 和 Response

這一章將開始覆蓋Rest framework的核心。讓咱們來介紹一些基礎組件。web

Restquest object

Rest framework 引入了一個繼承於django HttpRequest的對象Request,並提供更靈活的解析。
Request的核心是request.data屬性,他相似於request.POST,但對web api更有用。django

request.POST #只處理form data,並且只適用於'POST'方法
request.data #處理全部數據,適用於 'POST','PUT','PATCH'

Response Object

Rest framework 也引入了Response對象,它是一個TemplateResponse類型,並根據客戶端需求正確返回須要的類型。json

return Response(data) # 根據客戶端的需求返回不一樣的類型。

Status codes

在你的views中使用HTTP狀態碼,老是不太容易閱讀的,並且稍不注意,你會返回一個錯誤的狀態碼。Rest framework爲每一個狀態碼提供了更爲明確的標識符。例如 status模塊中的 HTTP_400-BAD_REQUESTapi

裝飾API views

REST framework爲你提供了兩個裝飾器,你可以使用它們來寫你的API views。url

  1. @api_view裝飾器適用於function based views
  2. APIView裝飾器適用於 class-based views
    這些方法提供一些功能,例如確保你的view收到的請求類型是Request,並將上下文添加到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 codesorm

接下來,咱們將在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 來幫助咱們來爲不一樣的請求作出正確的響應內容。

添加url

爲咱們剛纔編寫的兩個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,可是它給咱們一個簡單,乾淨的特定格式。

相關文章
相關標籤/搜索