接口能夠理解爲url就是接口.面試
那麼在其餘語言裏面接口也能夠是約束類redis
RESTful是目前最流行的一種互聯網軟件架構。它結構清晰、符合標準、易於理解、擴展方便,因此正獲得愈來愈多網站的採用。數據庫
URL:django
1.url體現版本編程
2.url體現是APIjson
3.用HTTPSapi
4.條件緩存
5.面向資源編程服務器
6.根據method的不用進行不一樣的操做restful
7.響應時添加狀態碼
常見的狀態碼
200 OK - [GET]:服務器成功返回用戶請求的數據,該操做是冪等的(Idempotent)。 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。 202 Accepted - [*]:表示一個請求已經進入後臺排隊(異步任務) 204 NO CONTENT - [DELETE]:用戶刪除數據成功。 400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操做,該操做是冪等的。 401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。 403 Forbidden - [*] 表示用戶獲得受權(與401錯誤相對),可是訪問是被禁止的。 404 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操做,該操做是冪等的。 406 Not Acceptable - [GET]:用戶請求的格式不可得(好比用戶請求JSON格式,可是隻有XML格式)。 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再獲得的。 422 Unprocesable entity - [POST/PUT/PATCH] 當建立一個對象時,發生一個驗證錯誤。 500 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將沒法判斷髮出的請求是否成功。
Response('...',status=200)
8.不一樣的操做給不一樣的返回值
GET:返回所有的數據
POST:返回新的數據(規範是返回新的數據,可是咱們要根據業務邏輯看新的數據是否有價值,)
GET:獲取單挑數據
PUT:返回修改的數據
PATCH:返回修改的數據
DELETE:返回空
9.返回錯誤信息
10.詳細信息.
restful是一個規範,規定API如何編寫,經過它咱們可讓api更加簡潔可維護
好比,最直觀的根據method的不一樣進行不一樣的操做,原來這些都是url設置的
除此以外:
-api標識
-版本
-面向資源編程
-狀態碼
-返回值
-錯誤信息
-hypemedia link
幫助咱們快速的開發符合restful規範的接口
有什麼功能:
1.路由
2.視圖
3.版本
4.認證
5.權限
6.頻率
7.解析器
8.序列化
9.分頁
10.渲染器
-路由
-能夠經過as_view傳參數,根據請求方式的不一樣執行響應的方法
-能夠在url中設置一個結尾相似於.json
-視圖
-幫助開發者提供了一些類,並在類提供了不少的方法供咱們使用
-版本
-在url中設置version參數,用戶請求傳入參數時,在request.version中獲取版本,根據版本的不一樣作不一樣的處理
-認證
- 寫一個類並註冊到認證類,在類的authticate方法中編寫認證邏輯
-認證成功(user,auth)
-rase AuthticateFaild(..)
-None 繼續
- 權限
-寫一個類並註冊的權限類,在類的has_permission方法中寫權限邏輯
-True
-False
-頻率限制
-寫一個類並註冊的權限類,在類的allow_requset/wait 方法中寫權限邏輯
-匿名
-用戶
返回True 或者False 若是返回False 那麼要執行wait
-解析器:
-根據ContentType請求頭,選擇不一樣的解析器對請求體中的數據進行解析.
Content-Type : url-formedo
Content-Type :application/json
-分頁
-對從數據庫中取到的數據進行分頁處理. 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
-根據加密:
-序列化
對queryset序列化以及對請求數據格式校驗
-渲染器
-根據url中傳入的後綴,決定在數據如何渲染到頁面上.
在用戶登陸的時候進行判斷是否登陸過來決定是更新仍是建立token
(update_or__create)下次訪問的時候要帶着token進行訪問.
若是認證失敗則拋出異常,認證成功須要返回一個元組
(request.user,request.auth)
爲何要更新token?
若是你的token一直是同一個值的話,那麼若是別人獲取了你的token值,就能夠
僞造你進行一些不是你我的意願的操做
你的認證是隻給一個視圖仍是全局的?
這個認證是可單視圖也能夠是全局的,
由於在源碼裏邊,他先會去你編寫的類authentication_classes裏面取你設置的認證
若是沒有就去settings裏面找.在settings設置了就能夠進行全局認證
主要分爲匿名用戶和非匿名用戶兩種類型,
先講講匿名用戶
假設咱們一分鐘限制最多訪問10次
當請求進來的時候,以IP爲key,值是一個列表,列表裏套着時間戳,最新的時間放在最左邊
1.若是用戶在20秒內訪問了10次,那麼列表裏就有10個時間戳,當他再次訪問的時候
拿訪問的時間-60秒跟10次最舊的時間相比,若是比它小,那麼不能進行訪問.
2.若是訪問的時間大於10個,那麼把列表的10個清空放置最新的時間
用戶的話就能夠用用戶名爲key來實現.
本質上這種方式只可以防小白,稍微有經驗的都會用代理IP而後隨機獲取進行訪問
或者隨機用不一樣的用戶進行爬取信息
頻率的限制分兩種:
一種是匿名用戶
當匿名用戶訪問的時候,把它的IP爲key,value值對應一個列表裏面裝訪問的時間戳,
下一次匿名用戶訪問的時候,對比列表的時間戳的時間戳,把不符合的剔除跳.超時的.
而後再對比他的個數
若是是用戶的話那麼把用戶名做爲key
這是看本身源碼學習的,可是我想啊
對於匿名用戶來講,若是他有不少代理的IP隨機訪問,那麼咱們就捕捉不到他,不能給他作
頻率的限制.
默認將訪問記錄放在了緩存中: redis/mecached