答:API是接口,提供url.
接口有兩個用途:
爲別人提供服務,先後端分離。
答:主要爲了數據的解耦,提升開發效率。
若是更新了數據,web頁面須要更改,並且網站的前端頁面變更很大,後端也可能更改,會很是麻煩。
使用前端框架VUE.js,能快速搭建前端項目,不須要依賴後端。
後端只需作序列化,返回json數據便可,並不涉及更多操做。
答:以前咱們是沒有用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,
用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中實現。
TTP請求 —> wsgi —> 中間件 —> 路由分發 —> 執行對應類的dispatch方法 —> 視圖函數 —>返回
採用CBV的請求方式。
通過「中間件」時,依次執行中間件內部的 process_request--->process_view--->process_template_response
---->process_exception---->process_response
答:有版本,認證,權限,訪問頻率的限制,路由系統,視圖,渲染器,序列化,分頁,解析器。
答:執行認證功能,確認進行後續操做的用戶是被容許的,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: 請求數據驗證: