Django_rest framework 框架介紹

restful介紹 

restful協議

  一切皆是資源,操做只是請求方式html

URL 設計 

原先的URL設計方式 

在url 中體現出操做行爲數據庫

    /books/ books
    /books/add/ addbook
    /books/(\d+)/change/ changebook
    /books/(\d+)/delete/ delbook

restful 風格的URL 設計

不在url中體現操做行爲,在視圖函數區分,(提交,查看)django

對於須要令傳入參數的url 在作區分 (編輯,刪除)編程

    /books/ -----get books ----- 返回當前全部數據
    /books/ -----post books ----- 返回提交數據 

    /books/(\d+)-----get bookdetail ----- 返回當前查看的單條數據 
    /books/(\d+)-----put bookdetail ----- 返回更新數據 
    /books/(\d+)-----delete bookdetail ----- 返回空

resful 協議規範

1 根據method 不一樣,進行不一樣的操做

即 URL 設計區別json

原來都是在 url 中設置。這樣能夠大大減小 url 的數量api

GET / POST / PUT / DELETE / PATCH

2 面向資源編程

視 URL 爲資源緩存

http://www.yangtuo.com

3 體現版本

http://v1.yangtuo.com
http://v2.yangtuo.com

4 體現是 API

不單單侷限於 URL 中,也能夠經過請求頭之類的其餘方法進行加入版本字段安全

http://api.yangtuo.com
http://yangtuo.com/api/salary    

5 建議使用 https 更安全

https://www.yangtuo.com    

6 響應式設置狀態碼

core: 200 300 400 500 
return HttpResponse("text_data",status=300)    

常見狀態碼服務器

OK - [GET]:服務器成功返回用戶請求的數據,該操做是冪等的(Idempotent)。
CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
Accepted - [*]:表示一個請求已經進入後臺排隊(異步任務)
NO CONTENT - [DELETE]:用戶刪除數據成功。
INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操做,該操做是冪等的。
Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
Forbidden - [*] 表示用戶獲得受權(與401錯誤相對),可是訪問是被禁止的。
NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操做,該操做是冪等的。
Not Acceptable - [GET]:用戶請求的格式不可得(好比用戶請求JSON格式,可是隻有XML格式)。
Gone -[GET]:用戶請求的資源被永久刪除,且不會再獲得的。
Unprocesable entity - [POST/PUT/PATCH] 當建立一個對象時,發生一個驗證錯誤。
INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。

 

7 過濾條件

http://yangtuo.com/v2/api/salary?page=1&size=10    

8 返回值

不一樣視圖都要返回具備標識意義的返回值restful

http://yangtuo.com/v2/api/salary
      

GET: 返回全部的列表         
  [{
"id":1,"title":"lala"},         
  {
"id":2,"title":"wawa"},         
  {
"id":3,"title":"kaka"},]       
POST: 返回新增的數據         
  {
"id":1,"title":"tuotuo"}       
PUT: 更新所有的數據 返回更新數據       
PATCH: 更新少許數據 返回更新數據       
DELETE: 刪除數據 返回空

9 返回錯誤處理信息

若是存在異常要基於錯誤碼返回錯誤信息

{
  code:10000,   error:"xxx錯了"
}

10 Hypermedia API

返回信息的時候加上 api ,即返回的數據最好加上 URL 信息這樣方便下面操做 

{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}

 

ps:

  記憶方式

URL 5個 
  https(推薦用https)://v2(版本)/yangtuo.com(域名爲資源)/api(體現api)/salary?page=1&size=10(有條件)
    
請求 1 個    
  根據method 不一樣,進行不一樣的操做

返回 4個
  返回值 響應式設置狀態碼 返回錯誤信息 返回信息的時候加上api

rest framework 框架

存在乎義: 

  幫助咱們快速開發基於 restful 規範的接口 

核心組件介紹

- 路由

  - 能夠經過as_view傳參數,根據請求方式不一樣執行相應的方法

  - 能夠在url中設置一個結尾,相似於: .json

- 視圖

  - 幫助開發者提供了一些類,並在類中提供了多個方法以供咱們使用。

- 版本

  - 在url中設置version參數,用戶請求時候傳入參數。在request.version中獲取版本,根據版本不一樣作不一樣處理

- 認證

  - 寫一個類並註冊到認證類,在類的的authticate方法中編寫認證邏輯。

    - 認證成功(user,auth)

    - raise AuthticateFaild(....)

    - None

- 權限

  - 寫一個類並註冊到權限類,在類的的has_permission方法中編寫認證邏輯。
    - True 

    - False

- 頻率限制

  - 寫一個類並註冊到頻率類,在類的的 allow_request/wait 方法中編寫認證邏輯。

  allow_request

    - True

    - False 若是返回False,那麼就要執行wait

- 解析器

  - 根據ContentType請求頭,選擇不一樣解析器對 請求體中的數據進行解析。

POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:url-formendo.... \r\n\r\nuser=alex&age=123
POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:application/json\r\n\r\n{....}

- 分頁 

  - 對從數據庫中獲取到的數據進行分頁處理: SQL -> limit offset

     - 根據頁碼

http://www.luffycity.com/api/v1/student/?page=1&size=10

    - 根據索引

http://www.luffycity.com/api/v1/student/?offset=60&limit=10

    - 根據加密

http://www.luffycity.com/api/v1/student/?page=erd6ops5

- 序列化

  - 對queryset序列化以及對請求數據格式校驗。

- 渲染器

  - 根據URL中傳入的後綴,決定在數據如何渲染到到頁面上。

- 響應器

  - 基於序列化組件完成序列化後的 data 進行 Response

ps:

頁碼越大速度越慢,爲何以及如何解決?

  緣由:

    頁碼越大向後須要掃描的行數越多,由於每次都是從0開始掃描。
  解決:
    - 限制顯示的頁數

    - 記錄當前頁數據ID最大值和最小值,再次分頁時,根據ID現行篩選,而後再分頁。

 源碼流程圖 

於原生的 View 對比

  • 重寫了 dispatch 方法 
  • 重構了一個 request 
    • 原生的 request 能夠用 request._request 調出來 

 

  • 新增了 系列的方法和數據
  • 新增數據 request.data 用於取 post 數據

 

  • View方式 對於 非urlencoded 的數據是沒法解析序列化成字典的
  • APIView方式 request.data 能夠作到自動序列化並解析成字典

 

 

  • 覆蓋原生的 get 數據請求方式
    • request.get APIView方式 獲取get 數據
    • request._request.get View方式獲取get 數據

django rest framework生命週期

發送請求-->
Django的wsgi-->
中間件-->
路由系統_執行CBV的as_view(),就是執行內部的dispath方法-->
在執行dispath以前,有版本分析 和 渲染器-->
在dispath內,對request封裝-->
版本-->
認證-->
權限-->
限流-->
視圖-->
若是視圖用到緩存( request.data or   request.query_params )就用到了 解析器-->
視圖處理數據,用到了序列化(對數據進行序列化或驗證) -->
視圖返回數據能夠用到分頁
相關文章
相關標籤/搜索