Django REST frameworker

Django REST frameworker

  • 為什么使用DRF

    1. 在序列化與反序列化操作時,執行的過程相似,將重復的代碼簡化編寫
    2. 在開發REST API視圖時,每個視圖具體操作數據不同,但是CURD的實現流程基本套路化
  • 特點

    1. 構建WEB API的強大工具。(DRF框架,是建立在Django框架上,二次開發項目)
    2. 提供了定義序列化器Serializer方法,快速根據Django ORM自動完成數據庫的序列化//反序列化
    3. 提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫
    4. 函數視圖、類視圖、視圖集合到自動生成API。多種身份驗證和權限驗證支持。
    5. 內置限流系統。直觀的API web界面

REST

? >>> Repersentational State Transfer("具象狀態傳輸"。一般解釋為“表現層 狀態轉換”。 )

? >>> REST是設計風格而不是標準,指Celent 和 Server 交互的形式。

  • Representational

    具象:(表現層) Celent 訪問 Server 獲取資源的表現(html,txt,json。。。)

    表現:獲取的資源對象,以什么形式展現出來-->在HTTP請求頭部中Accept和Content-Type字段中指定

  • State Transfer

狀態轉化:客戶端操作數據庫,必須通過某種手段,讓服務器發生狀態轉化

HTTP協議中:4個操作方式的動詞(GET、POST、PUT、DELETE )來表現 Celent 和 Server 交互的過程

RESTful架構

  • 每一個URL代表一種資源
    1. 域名:將 api 部署在專用域名下
    2. 版本:將 API 的版本號放在 url 中
    3. 路徑:路徑表示 API 的具體網址。每個網址代表一種資源 。網址中不能有動詞,名詞一般=與數據庫的表名相對應,使用復數。
  • 客戶端和服務器之間,傳遞這種資源的某種表現層
  • 客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現"表現層狀態轉化"。

REST接口開發核心任務

  1. 將程序中的一個數據庫結構類型(模型類對象)轉換為響應的數據(JSON、XML、Dict)——>序列化過程
  2. 對數據庫操作的過程。(封裝了對數據庫的操作方法)
  3. 將前端傳遞其他的格式(字典,JSON,XML)等轉化為程序中的數據(模型類對象)——>反序列化過程

DRF工程搭建

? >>>DRF框架依賴Django框架對其擴展應用,python。

  1. pip install djangorestframeworker
  2. 在INSTALLED_APPS里面注冊擴展應用

Serializer序列化器

? >>> 作用:1. 對數據對象進行轉換、響應 2.進行數據的校驗、保存

? >>> 定義:1. 自定義序列化器 繼承自:serializers.Serializer( 字段一一定義、校驗、創建、更新)

? 2. 繼承了最高級的序列化器語法 :serializers.ModelSerializer(指定model、fields)

創建Serializer對象

  • 在View中調用創建好的序列化器對象

  • Serializer類構造方法:

    **Serializer(instance=None, data=empty, **kwarg)

    1.序列化:將模型類對象傳入instance

    2.反序列化:將被反序列化的數據傳入data參數

    3.構造Serializer對象時,可以添加context參數增加額外參數,用于View和序列化之間數據的傳遞

  • 在序列化文件中通過context參數附加的數據,可以通過Serializer對象的context屬性獲取。

序列化

  1. 獲取模型類對象(根據模型類對象Django-ORM的CURD)

  2. 創建序列化器對象—>序列化操作(將模型類對象傳入)

  3. 獲取序列化的自定義字段(或者根據模型類字段,進行定義)

  4. 序列化器對象.data:data屬性獲取序列化對象的數據(字典,返回的數據就是定義在序列化器中定義的字段)

    ser = BookInfoSerializer1(books, many=True)

    return Response(ser.data)

反序列化器

  1. 反序列化時,需要對請求的數據驗證成功,才能對數據修改/保存模型類對象

  2. 反序列化前,必須調用is_valid()方法進行驗證,驗證成功返回True,否則返回False

  3. 驗證失敗,可使用序列化器對象的errors屬性獲取錯誤信息,字典形式返回{ '字段':'錯誤信息' }

  4. 驗證成功,可使用序列化器對象的validated_data屬性獲取數據.

    1.先獲取數據

    data = request.data

    2.對獲取的數據進行校驗

    ser = Serializer(data=data)

    ser.is_valid()

    3.添加數據

    ser.save()

    返回數據

    return Response(ser.data)

反序列化注意點

  1. 在對序列化器進行save()保存時,可以額外傳遞數據,這些數據可以在create()和update()中的validated_data參數獲取到。

ser.save(owner=request.user)

def create(self, validated_data):
     owner = validated_data.get('owner', None)
        pass

def update(self, instance, validated_data):
     instance.owner = validated_data.get('owner', None)
        pass
  1. 默認序列化器必須傳遞所有required的字段,否則會拋出驗證異常。但是我們可以使用partial參數來允許部分字段更新

    ser = Serializer(obj, data=data,partial=True)

視圖

Request

  1. REST framework 提供了Parser解析器,請求后會自動根據Content-Type指明的請求數據類型,將請求數據進行parse解析,解析為類字典對象保存到Request對象中。

  2. Request對象的數據是自動根據前端發送數據的格式進行解析之后的結果。

屬性

  1. .data

request.data 返回解析之后的請求體數據

  1. .query_params

request.query_params與Django標準的request.GET相同。

  1. .user

    請求的用戶對象(獲取已登陸的用戶請求對象)

Response

  1. REST framework提供了一個響應類Response,使用該類構造響應對象時,響應的具體數據內容會被轉換(render渲染)成符合前端需求的類型。

    Response響應構造方式:

    Response(data, status=None, template_name=None, headers=None, content_type=None)

    data:傳給response對象的序列化后,但是沒有render處理的數據

  2. REST framework提供了Renderer 渲染器,用來根據請求頭中的Accept(接收數據類型聲明)來自動轉換響應數據到對應格式。

狀態碼

  1. 信息告知 -1X

  2. 成功 -2X

  3. 重定向-3X(成功請求)

  4. 客戶端請求錯誤-4X

  5. 服務器錯誤-5X

視圖兩個基類

>>>作用:1.控制序列化器的執行 。2. 控制數據庫查詢的執行

APIView

封裝繼承Django的View父類,提供了所有的視圖基類

APIView視圖中沒有封裝HTTP的動作方法;還需自定義方法

APIView和View的區別

  1. 傳入了視圖Resquest和Response對象不同

  2. 任何APIException異常都會被捕獲到

  3. 在基類View進行dispatch()分發前,會對請求進行身份驗證、權限驗證、流量控制

    屬性

    1. authentication_classes :身份驗證
    2. permissoin_classes :權限認證
    3. throttle_classes :流量控制

GenericAPIView

序列化器使用:

  1. 屬性和方法

    屬性: serializer_class指明視圖中使用的序列化器

    方法:get_serializer() 獲取序列化器對象(可重寫)

    注意點:該方法提供序列化器對象的時候,會向序列化器對象的context屬性傳遞三個數據 。

    def get_serializer(self, *args, **kwargs):
            """
            Return the serializer instance that should be used for validating and
            deserializing input, and for serializing output.
            """
            serializer_class = self.get_serializer_class()
            kwargs['context'] = self.get_serializer_context()
            # 返回序列化器對象
            return serializer_class(*args, **kwargs)
    
    def get_serializer_context(self):
            """
            在定義序列化器對象時候使用,會向序列化器對象的context屬性補充三個數據
            """
            return {
                'request': self.request, # 當前視圖的請求對象
                'format': self.format_kwarg, 
                'view': self #當前請求的類視圖對象
            }
    

數據庫的使用:

  1. 屬性和方法:

    屬性:queryset 指明數據庫的查詢集—>數據庫特性:惰性/緩存

    方法:get_queryset()獲取數據對象,返回查詢集queryset屬性;get_object(self)獲取單個的查詢對象

    def get_query(self):
     "對其方法的重寫,返回指定的查詢集對象"
     category_id = self.kwargs["category_id"]
     # 向指定的查詢集添加屬性;獲取分類id對象
     hot_skus = SKu.object.filter(category_id=category_id,is_launched=True)
     return hot_skus
    
    def view(request, *args, **kwargs):
     """在路由中獲取數據,保存在View視圖中“”“
        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 # 。。。
     return self.dispatch(request, *args, **kwargs)
     
    
  1. 其他屬性

    pagination_class 指明分頁控制類(自定義分頁器)

    class LargeResultsSetPagination(PageNumberPagination):
        """
        自定義分頁器,繼承分頁器PageNumberPagination
        請求方法:127.0.0.1/books/?page=1&page_size=5
        """
        page_size = 5   # 每頁的數量
        max_page_size = 10  # 前端最多能設置的每頁數量
        # page_query_param = 'page'   # 前端發送的頁數關鍵字名,默認為"page"
        page_size_query_param = 'page_size'  # 前端發送的每頁數目關鍵字名,默認為None
    

    filter_backends 指明過濾控制后端

五個擴展類

作用:提供后端視圖對數據庫的CURD處理流程的實現,繼承擴展類來復用代碼

兩個基本類:就是為擴展類提供屬性和方法。五個擴展類需要搭配基類(GenericAPIView)

? 要實現序列化器與數據庫的查詢的方法。

  1. 方法

    1)ListModelMixin 2)CreateModelMixin

    3) RetrieveModelMixin 4)UpdateModelMixin 5)DestroyModelMixin

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容