99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Django drf 請(qǐng)求和響應(yīng)

2020-01-22 11:22 更新

從現(xiàn)在開始,我們將真正開始接觸REST框架的核心。 我們來介紹幾個(gè)基本的構(gòu)建模塊。

請(qǐng)求對(duì)象(Request objects)

REST框架引入了一個(gè)擴(kuò)展了常規(guī)HttpRequest的Request對(duì)象,并提供了更靈活的請(qǐng)求解析。Request對(duì)象的核心功能是request.data屬性,它與request.POST類似,但對(duì)于使用Web API更為有用。

request.POST  # 只處理表單數(shù)據(jù)  只適用于'POST'方法
request.data  # 處理任意數(shù)據(jù)  適用于'POST','PUT'和'PATCH'方法

響應(yīng)對(duì)象(Response objects)

REST框架還引入了一個(gè)Response對(duì)象,這是一種獲取未渲染(unrendered)內(nèi)容的TemplateResponse類型,并使用內(nèi)容協(xié)商來確定返回給客戶端的正確內(nèi)容類型。

return Response(data)  # 渲染成客戶端請(qǐng)求的內(nèi)容類型。

狀態(tài)碼(Status codes)

在你的視圖(views)中使用純數(shù)字的HTTP 狀態(tài)碼并不總是那么容易被理解。而且如果錯(cuò)誤代碼出錯(cuò),很容易被忽略。REST框架為status模塊中的每個(gè)狀態(tài)代碼(如HTTP_400_BAD_REQUEST)提供更明確的標(biāo)識(shí)符。使用它們來代替純數(shù)字的HTTP狀態(tài)碼是個(gè)很好的主意。

包裝(wrapping)API視圖

REST框架提供了兩個(gè)可用于編寫API視圖的包裝器(wrappers)。

  1. 用于基于函數(shù)視圖的@api_view裝飾器。
  2. 用于基于類視圖的APIView類。

這些包裝器提供了一些功能,例如確保你在視圖中接收到Request實(shí)例,并將上下文添加到Response,以便可以執(zhí)行內(nèi)容協(xié)商。

包裝器還提供了諸如在適當(dāng)時(shí)候返回405 Method Not Allowed響應(yīng),并處理在使用格式錯(cuò)誤的輸入來訪問request.data時(shí)發(fā)生的任何ParseError異常。

組合在一起

好的,我們開始使用這些新的組件來寫幾個(gè)視圖。

我們?cè)趘iews.py中不再需要JSONResponse類了,所以把它刪除掉。刪除之后,我們就可以開始重構(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,或者創(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)。它稍微簡(jiǎn)潔一點(diǎn),現(xiàn)在的代碼與我們使用Forms API時(shí)非常相似。我們還使用了命名狀態(tài)代碼,這使得響應(yīng)意義更加明顯。

以下是views.py模塊中單個(gè)snippet的視圖。

@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
    """
    獲取,更新或刪除一個(gè)snippet實(shí)例。
    """
    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)

這對(duì)我們來說應(yīng)該都是非常熟悉的,-它和正常Django視圖并沒有什么不同。

注意,我們不再顯式地將請(qǐng)求或響應(yīng)綁定到給定的內(nèi)容類型。request.data可以處理傳入的json請(qǐng)求,但它也可以處理其他格式。同樣,我們返回帶有數(shù)據(jù)的響應(yīng)對(duì)象,但允許REST框架將響應(yīng)給我們渲染成正確的內(nèi)容類型。

給我們的網(wǎng)址添加可選的格式后綴

為了充分利用我們的響應(yīng)不再與單一內(nèi)容類型連接,我們可以為API路徑添加對(duì)格式后綴的支持。使用格式后綴給我們明確指定了給定格式的URL,這意味著我們的API將能夠處理諸如http://example.com/api/items/4.json之類的URL。

像下面這樣在這兩個(gè)視圖中添加一個(gè)format關(guān)鍵字參數(shù)。

def snippet_list(request, format=None):

def snippet_detail(request, pk, format=None):

現(xiàn)在更新urls.py文件,給現(xiàn)有的URL后面添加一組format_suffix_patterns。

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模式,但它給了我們一個(gè)簡(jiǎn)單,清晰的方式來引用特定的格式。

怎么查看結(jié)果?

從命令行開始測(cè)試API,就像我們?cè)诮坛痰谝徊糠种兴龅哪菢?。一切操作都很相似,盡管我們發(fā)送無(wú)效的請(qǐng)求也會(huì)有一些更好的錯(cuò)誤處理了。

我們可以像以前一樣獲取所有snippet的列表。

http http://127.0.0.1:8000/snippets/

HTTP/1.1 200 OK
...
[
  {
    "id": 1,
    "title": "",
    "code": "foo = \"bar\"\n",
    "linenos": false,
    "language": "python",
    "style": "friendly"
  },
  {
    "id": 2,
    "title": "",
    "code": "print \"hello, world\"\n",
    "linenos": false,
    "language": "python",
    "style": "friendly"
  }
]

我們可以通過使用Accept標(biāo)頭來控制我們回復(fù)的響應(yīng)格式:

http http://127.0.0.1:8000/snippets/ Accept:application/json  # 請(qǐng)求JSON
http http://127.0.0.1:8000/snippets/ Accept:text/html         # 請(qǐng)求HTML

或者通過附加格式后綴:

http http://127.0.0.1:8000/snippets.json  # JSON后綴
http http://127.0.0.1:8000/snippets.api   # 瀏覽器可瀏覽API后綴

類似地,我們可以使用Content-Type頭控制我們發(fā)送的請(qǐng)求的格式。

# POST表單數(shù)據(jù)
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 JSON數(shù)據(jù)
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"
}

如果你向上述http請(qǐng)求添加了--debug,則可以在請(qǐng)求標(biāo)頭中查看請(qǐng)求類型。

現(xiàn)在可以在瀏覽器中訪問http://127.0.0.1:8000/snippets/查看API。

瀏覽功能

由于API根據(jù)客戶端請(qǐng)求選擇響應(yīng)的內(nèi)容類型,因此默認(rèn)情況下,當(dāng)Web瀏覽器請(qǐng)求該資源時(shí),它將返回資源的HTML格式表示。這允許API返回完全瀏覽器可瀏覽(web-browsable)的HTML表示。

擁有支持瀏覽器可瀏覽的API在可用性方面完勝并使開發(fā)和使用你的API更容易。它也大大降低了其他開發(fā)人員要檢查和使用API??的障礙。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)