1. 程式人生 > >Rest Framework:一,認識RESTful

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規範的介面