Rest Framework:一,認識RESTful
一、CBV的原始碼分析
-Class Base View(基於類的檢視)
-Function Base View(基於函式的檢視)
-def as_view 類方法
-def view:類方法內部,閉包函式定義:內層函式包含對外部作用域的引用
-python中一切皆物件:函式也是物件
-hasattr(self, 'get')--判斷self類中是不是有該(get)方法
-反射 setattr(self,get,get_all):相當於把get函式,變成了get_all
-getattr(self, 'get'):拿到get函式的記憶體地址
def view(request, *args, **kwargs): self = cls(**initkwargs) if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get self.request = request self.args = args self.kwargs = kwargs # 執行:dispatch:誰的dispatch方法?寫的cbv的那個c,檢視中的那個檢視類 # 我這個類如果沒有寫dispatch,會執行View中的dispatch方法 return self.dispatch(request, *args, **kwargs) -def dispatch(self, request, *args, **kwargs): # request.method 前臺請求的方法,轉成了小寫 # http_method_names View中定義的一個列表:是一堆請求方式 if request.method.lower() in self.http_method_names: # getattr的第三個引數是預設值:self.http_method_not_allowed # 拿到get方法的記憶體地址 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed #get(request,*args, **kwargs) return handler(request, *args, **kwargs)
總結:*******請求來了--->as_view---->view---->dispatch--->分發到不同的函式,執行函式,拿到結果,然後返回
閱讀原始碼:(pycharm)
左側工程欄--->設定圖示-->點選--->show members(能看到py檔案,類的方法)
二、resful規範(是什麼)
- 是一個規範
- 面向資源程式設計:把網路中所有東西,想象成資源
-規範:
-10條規範
1、-API與使用者的通訊協議,總是使用HTTPs協議:https比http安全
2、-域名
https://api.example.com 儘量將API部署在專用域名(會存在跨域問題)
https://example.org/api/ API很簡單
例如寫一個查詢所有圖書的api介面:
https://api.example.com/books
https://127.0.0.1/api/books
3、版本:每個介面都應該有版本
URL
如:https://api.example.com/v1/
https://127.0.0.1/api/v2/books(推薦用這種)
請求頭 跨域時,引發傳送多次請求
4、路徑,視網路上任何東西都是資源,均使用名詞表示(可複數)
https://api.example.com/v1/books
https://api.example.com/v1/animals
https://api.example.com/v1/employees
不能這麼寫:
-獲取所有圖書:https://127.0.0.1/api/get_all_books
-新增一本書:https://127.0.0.1/api/add_book
同一都用這個:
https://api.example.com/v1/books
5、method
GET :從伺服器取出資源(一項或多項)
POST :在伺服器新建一個資源
PUT :在伺服器更新資源(客戶端提供改變後的完整資源)
PATCH :在伺服器更新資源(客戶端提供改變的屬性)
DELETE :從伺服器刪除資源
6、過濾,通過在url上傳參的形式傳遞搜尋條件
https://api.example.com/v1/zoos?limit=10:指定返回記錄的數量
https://api.example.com/v1/zoos?offset=10:指定返回記錄的開始位置
https://api.example.com/v1/zoos?page=2&per_page=100:指定第幾頁,以及每頁的記錄數
https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序
https://api.example.com/v1/zoos?animal_type_id=1:指定篩選條件
7、狀態碼
請求回去,需要有狀態碼
自定義狀態碼
status: 100表示成功
101表示使用者名稱密碼錯誤
102我也不知道什麼錯誤
8、錯誤處理,應返回錯誤資訊,error當做key。
-{status:100,error:'錯誤資訊寫上'}
9、返回結果,針對不同操作,伺服器向用戶返回的結果應該符合以下規範。
GET /books:返回資源物件的列表(陣列)
GET /books/1:返回單個資源物件
POST /books:返回新生成的資源物件 -新增,傳資料,一旦新增完成,把新的資源物件返回
PUT /books/1:返回完整的資源物件
PATCH /books/1:返回完整的資源物件
DELETE /books/1:返回一個空文件
10、Hypermedia API,RESTful API最好做到Hypermedia,即返回結果中提供連結,連向其他API方法,使得使用者不查文件,也知道下一步應該做什麼。
{
status:100
msg:成功
url:127.0.0.1/books/1
}
核心:返回結果中提供連結
1、django寫resful規範的介面