1. 程式人生 > >Django REST framework(官方教程)

Django REST framework(官方教程)

翻譯如下:

教程 2: Requests and Responses

從這個角度我們將真正開始覆蓋其他框架的核心。讓我們介紹幾個基本構建塊。

1. Request Object  ——Request物件

rest framework 引入了一個繼承自HttpRequest的Request物件,該物件提供了對請求的更靈活解析。request物件的核心部分是request.data屬性,類似於request.post, 但在使用WEB API時,request.data更有效。

request.POST  # Only handles form data.  Only works for 'POST' method.
request.DATA # Handles arbitrary data. Works any HTTP request with content.
2. Response Object ——Response物件

rest framework引入了一個Response 物件,它繼承自TemplateResponse物件。它獲得未渲染的內容並通過內容協商content negotiation 來決定正確的content type返回給client。

returnResponse(data)# Renders to content type as requested by the client.
3. Status Codes

在views當中使用數字化的HTTP狀態碼,會使你的程式碼不宜閱讀,且不容易發現程式碼中的錯誤。rest framework為每個狀態碼提供了更明確的標識。例如HTTP_400_BAD_REQUEST。相比於使用數字,在整個views中使用這類識別符號將更好。

4. 封裝API views

在編寫API views時,REST Framework提供了兩種wrappers:

1).  @api_viwe 裝飾器 ——函式級別

2). APIView 類——類級別

這兩種封裝器提供了許多功能,例如,確保在view當中能夠接收到Request例項;往Response中增加內容以便內容協商content negotiation 

機制能夠執行。

封裝器也提供一些行為,例如在適當的時候返回405 Methord Not Allowed響應;在訪問多型別的輸入request.DATA時,處理任何的ParseError異常。

5. 彙總

我們開始用這些新的元件來寫一些views。

我們不在需要JESONResponse 類(在前一篇中建立),將它刪除。刪除後我們開始稍微重構下我們的view

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response importResponsefrom snippets.models importSnippetfrom snippets.serializers importSnippetSerializer@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)returnResponse(serializer.data)elif request.method =='POST':
        serializer =SnippetSerializer(data=request.DATA)if serializer.is_valid():
            serializer.save()returnResponse(serializer.data, status=status.HTTP_201_CREATED)else:returnResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
上面的程式碼是對我們之前程式碼的改進。看上去更簡潔,也更類似於django的forms api形式。我們也採用了狀態碼,使返回值更加明確。

下面是對單個snippet操作的view更新:

@api_view(['GET','PUT','DELETE'])def snippet_detail(request, pk):"""
    Retrieve, update or delete a snippet instance.
    """try:
        snippet =Snippet.objects.get(pk=pk)exceptSnippet.DoesNotExist:returnResponse(status=status.HTTP_404_NOT_FOUND)if request.method =='GET':
        serializer =SnippetSerializer(snippet)returnResponse(serializer.data)elif request.method =='PUT':
        serializer =SnippetSerializer(snippet, data=request.DATA)if serializer.is_valid():
            serializer.save()returnResponse(serializer.data)else:returnResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)elif request.method =='DELETE':
        snippet.delete()returnResponse(status=status.HTTP_204_NO_CONTENT)
注意,我們並沒有明確的要求requests或者responses給出content type。request.DATA可以處理輸入的json請求,也可以輸入yaml和其他格式。類似的在response返回資料時,REST Framework返回正確的content type給client。

6. 給URLs增加可選的格式字尾

利用在response時不需要指定content type這一事實,我們在API端增加格式的字尾。使用格式字尾,可以明確的指出使用某種格式,意味著我們的API可以處理類似http://example.com/api/items/4.json.的URL。

增加format引數在views中,如:

def snippet_list(request, format=None):

and

def snippet_detail(request, pk, format=None):
現在稍微改動urls.py檔案,在現有的URLs中新增一個格式字尾pattterns (format_suffix_patterns):
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = patterns('snippets.views',
    url(r'^snippets/$','snippet_list'),
    url(r'^snippets/(?P<pk>[0-9]+)$','snippet_detail'),)

urlpatterns = format_suffix_patterns(urlpatterns)

這些額外的url patterns並不是必須的。

Browsability

Because the API chooses the content type of the response based on the client request, it will, by default, return an HTML-formatted representation of the resource when that resource is requested by a web browser. This allows for the API to return a fully web-browsable HTML representation.

Having a web-browsable API is a huge usability win, and makes developing and using your API much easier. It also dramatically lowers the barrier-to-entry for other developers wanting to inspect and work with your API.

See the browsable api topic for more information about the browsable API feature and how to customize it.

What's next?

In tutorial part 3, we'll start using class based views, and see how generic views reduce the amount of code we need to write.


相關推薦

Django REST framework(官方教程)

翻譯如下: 教程 2: Requests and Responses 從這個角度我們將真正開始覆蓋其他框架的核心。讓我們介紹幾個基本構建塊。 1. Request Object  ——Request物件 rest framework 引入了一個繼承自HttpR

Django REST FrameWork中文教程4:驗證和許可權

目前,我們的API對誰可以編輯或刪除程式碼段沒有任何限制。我們想要一些更高階的行為,以確保: 程式碼段始終與建立者相關聯。 只有身份驗證的使用者可以建立片段。 只有片段的建立者可以更新或刪除它。 未經身份驗證的請求應具有完全只讀訪問許可權。 將資訊新增到

Django REST framework 的快速入門教程

ret turn ads 使用 blog 所有 定義 想去 cti CRM-API項目搭建 序列器(Serializers) 首先,我們來定義一些序列器。我們來創建一個新的模塊(module)叫做 crm/rest_searializer.py ,這是我們用來描述數據是如何

Django REST framework教程二: 請求和響應

教程索引目錄 Django REST framework的系列教程 對於需要通篇瞭解的同學,可以點選教程索引目錄。 從現在開始,我們要開始,真正接觸到REST framework的核心部分了。當然,我們需要先認識一些重要的基本元素。 請求物件(R

Django Rest Framework--oauth實驗筆記--參考官方文件

Getting started Django OAuth Toolkit provide a support layer for Django REST Framework. This tutorial is based on the Django RES

Django REST framework教程三: 基於類的檢視

教程索引目錄 Django REST framework的系列教程 對於需要通篇瞭解的同學,可以點選教程索引目錄。 其實,與其使用基於方法(function based)的檢視,我們更加傾向使用基於類(class based)的檢視。接下來,你將看到這

Django rest framework 自定義Exception

return cep 格式 message throttle back per ack logs   使用Dango rest framework時,有時需要raise APIException到前端,為了統一錯誤返回格式,我們需要對exception的格式進行調整。 方法

[Django rest-framework] 1-Serialization

www. spa key blog urn allow max pytho led 個人粗淺的理解,歡迎批評指正 什麽是序列化?   後端任務無非對數據庫的增查刪改,操作數據庫無非操作字段,序列化可以讓我們輕松的對數據庫增(serializer.create)改(seril

Django——REST framework

errors self hat 發的 jsonp arc pip url 數據 1. 什麽是REST REST與技術無關,代表的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表征狀態轉移” REST從資源的

django-rest-framework筆記-請求與響應篇

python ica ror nic patch cnblogs coo fix ria 一、請求對象 request.POST # 處理表單數據. 限於POST請求. request.data # 處理任意數據. 對 ‘POST‘, ‘PUT‘ and ‘

django-rest-framework筆記-類視圖篇

object span pos all stc cnblogs man ews rom snippet/url.py from django.conf.urls import url from rest_framework.urlpatterns import

django rest-framework 2.請求和響應

str val cor 之前 man .post 狀態碼 del exc 一、請求對象 REST 框架引入Request來擴展常規的HttpRequest,並提供了更靈活的請求解析。Request對象的核心功能是request.data屬性。 導入方式: from rest

初次就這麽給了你(Django-rest-framework)

ace space .com 我們 http ram 安裝 bsp php Django-Rest-Framework Django-Rest框架是構建Web API強大而靈活的工具包。 簡單粗暴,直奔主題。 pip安裝好需要的工具包之後,我們就開始創建一個框架。 工程已經

Django REST Framework extensions

pre sets time install response hub pps ros href GitHub:https://github.com/chibisov/drf-extensions 官方文檔:http://chibisov.github.io/drf-exte

django-rest-framework快速入門

1-1 finally erl his 常見 router ger pla har 前言:第一次接觸django-rest-framework是在實習的時候。當時也不懂,看到視圖用類方法寫的感覺很牛逼的樣子。因為官網是英文的,這對我的學習還是有一點的阻力的,所以當時也沒怎麽

Django rest framework:__str__ returned non-string (type NoneType) 真正原因

問題 field __str__ span 是我 字段 max 一個 self. 出錯原因:   用戶表是Django中核心的表,當這個表類字段中有一個這樣的函數 def __str__(self): return self.name   在Django用戶表設

Django REST framework 中 3 種類視圖的對比

互聯網 運維 web開發 python相較於使用基於方法(function based)的視圖,我們更加傾向使用基於類(class based)的視圖。接下來,你將看到這是一個強大的模式,是我們能夠重用公共的功能,並且,幫我們減少重復的造輪子。 我們現在開始了。首先,重寫根視圖(root view),變

Django REST framework反向生成url

turn something ren rest 基於 mine repl djang sage Django REST framework是一個基於Django的框架,REST framework又是怎麽反向生成url的呢?? 在前面的例子中,知道在REST framewo

DjangoDjango-REST-Framework

success image restfu n) efi png 16px one isa 【創建簡單的API】 1. cmd.exe >django-admin startproject django_rest>cd django_rest\django

Vue + Django REST framework 打造生鮮電商項目

lam -c com get .com djang 項目 mooc big Vue + Django REST framework 打造生鮮電商項目 需要的聯系QQ:996072671Vue + Django REST framework 打造生鮮電商項目