1. 程式人生 > >CHENGDU3-Restful API 介面規範、django-rest-framework框架

CHENGDU3-Restful API 介面規範、django-rest-framework框架

 

Restful API 介面規範、django-rest-framework框架

問題:什麼是API?

答:API是介面,提供url.
介面有兩個用途:
為別人提供服務,前後端分離。

為什麼使用前後端分離?

答:主要為了資料的解耦,提高開發效率。
如果更新了資料,web頁面需要更改,而且網站的前端頁面變動很大,後端也可能更改,會非常麻煩。
使用前端框架VUE.js,能快速搭建前端專案,不需要依賴後端。
後端只需做序列化,返回json資料即可,並不涉及更多操作。

Restful API規範?

 

答:之前我們是沒有用rest api規範的,都是通過django的url自己來做的,後來我們選擇用了rest api。
(
1):API與使用者的通訊協議,使用的是http協議 (2):域名儘量部署在專有域名之下,若API很簡單,不會進一步擴充套件,可以考慮放在主域名下。 (3):應將api的版本號放入url,還可以將版本號放入Http請求頭資訊中,但不如放在url中方便。 也可以放在子域名上(放在子域名上會存在跨域的問題,) (4):在RESTful架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞, 而且所用的名詞往往與資料庫的表格名對應。一般來說, 資料庫中的表都是同種記錄的"集合",所以API中的名詞也應該使用複數。 (5):如果記錄數量很多,伺服器不可能都將它們返回給使用者。API應該提供引數,過濾返回結果。 (
6)根據請求方式的不同,來區分不同的行為。post----get----put----patch----delete。 (7):伺服器向用戶返回的狀態碼和提示資訊。 (8):返回json資料。

常用的請求方式有那些?

 

答:Get :獲取資料,Post:建立資料,Patch:部分修改
Put :全部修改,DELETE:刪除資料,
Options:如果有跨域,會先發一個option請求,先做預檢,完了在執行自己發的請求

 

常見的狀態碼有那些?

答:200:響應成功,302:重定向,403:Forbidden
404:找不到頁面,500:服務端程式碼有誤

談談你對restful framework的認識?

答:我們一開始是沒有用restful framework,
用django寫一些裝飾器或中介軟體也能實現。
但是它為我們事先提供了一部分介面,
常用的有:獲取版本,認證,許可權,分流 ,
我們只需要按照restful的規範,只需要寫幾個類就好了,或者在配置檔案裡面配置一下就可以使用。
尤其是在使用者訪問頻率限制的時候,restful裡面都已經封裝好了,我們直接呼叫它的方法就行了。
我們寫的時候是基於CBV模式寫的,這個和django中的CBV是一樣的, 請求先進來會走dispatch方法,根據請求方法不同反射執行不同的方法。 我們寫的類是繼承APIView的View,去執行它的dispatch先找自己的,自己沒有就找父類的。
restful framework執行流程? restful framework請求進來到達路由.as_view(),在as_view裡面return了一個view函式,請求進來先執行一個view函式。 as_views呼叫了dispath方法根據請求方式的不同,觸發不同的方法。 initialize_request這個方法接收客戶端的request請求,再重新封裝成新的request。請求一些相關的東西放到request中 然後進行初始化,獲取版本,認證呼叫request.user方法,檢查許可權,檢查限制訪問。 執行對應檢視函式。 對返回結果再次進行加工。重要的功能在APIviews的dispath中實現。

 

Django Rest Framework 的的請求生命週期

 

TTP請求 —> wsgi —> 中介軟體 —> 路由分發 —> 執行對應類的dispatch方法 —> 檢視函式 —>返回 
採用CBV的請求方式。

經過“中介軟體”時,依次執行中介軟體內部的 process_request--->process_view--->process_template_response
---->process_exception---->process_response

 

 

restful framework中包括那些?

答:有版本,認證,許可權,訪問頻率的限制,路由系統,檢視,渲染器,序列化,分頁,解析器。

 

認證?

答:執行認證功能,確認進行後續操作的使用者是被允許的,perform_authentication方法返回經過認證的使用者物件,
傳入的request是重新封裝過的。

版本?

功能的更新迭代。
可以放在url,也可以放在請求頭,但不是很方便,也可以放在子域名上,但存在跨域的問題。
可以用三種方法實現:get傳參方式,基於url正則傳參
如果url中有版本資訊,就獲取傳送到服務端的版本,返回一個元組.

 

許可權?

答:如果使用者通過認證,檢查使用者是否有許可權訪問url中所傳的路徑,如用使用者訪問的是沒有沒有許可權的路徑,則會丟擲異常。

 

訪問頻率的限制?

答:作用是檢查使用者是否被限制了訪問主機的次數。

 

解析器

答:對請求資料進行解析,對請求體進行解析。

 


如何進行序列化的?

答:有兩種方法實現
一:從資料去取出資料,return response
二:從資料庫求出資料,賦值給instance,設定是否是單物件,再進行賦值,然後return response(.data)返回。
ser = UsersSerializer(instance=user_list,many=True)
return Response(ser.data)

 

序列化?

答:解決QuerySet序列化問題。
序列化:
基本序列化:單物件,多物件。instance=user_list,many=True
跨表序列化:
複雜序列化:
基於Model實現序列化:
生成url:
全部生成url:
請求資料驗證: