DRF之View和APIView

Lea4ning發表於2024-04-22

【零】DRF在Django專案中的使用

【1】匯入

# DRF需要使用pip install 安裝
pip install djangorestframework
  • DRF(Django Rest Framework)是一個用於構建 Web API 的工具包,它是基於 Django 框架的一個第三方應用(app)
  • 在 Django 專案中,一個應用(app)通常是一個具有特定功能的模組,它包含了模型、檢視、模板等元件,用於實現特定的功能或業務邏輯。

image-20240415161036714

【2】使用

  • 使用drf時,需要先在settings.py檔案中進行註冊app
# settings.py
INSTALLED_APPS = [
    ...
    'rest_framework'
]

【一】View

  • restful規範所需5個介面
    • 查詢所有
    • 新增
    • 查詢單條資料
    • 更新單條
    • 刪除單條

【1】基於Django的View實現5個介面

  • DRF_prospect · Lea4ning/DjangoObject - 碼雲 - 開源中國 (gitee.com)

  • 程式碼預覽

image-20240415163008511

  • 預處理請求資料的裝飾器程式碼

image-20240415170227132

  • 【注】該版本如果使用post請求,需要註釋掉csrf中介軟體

【2】基於DRF.APIView + Response實現5個介面

  • 使用Django自帶的View我們可以發現,其對請求資料的處理不夠完善

  • 而在DRF中,其幫我們處理了請求資料,能夠讓我們可以透過【request.data】直接獲取到三種編碼格式處理後的資料

  • 【request.data】中的資料可能為【querydict】或【dict】物件

  • 程式碼預覽

image-20240415173532313

【2.1】APIView原始碼分析

  • 檢視類呼叫時,就是執行【as_view()】方法
  • 【as_view()】就是我們檢視APIView原始碼的入口
【2.1.1】DRF的APIView的as_view()

image-20240415194225740

【2.1.2】Django的View的as_view()

image-20240415194314096

【2.1.3】DRF的APIView的dispatch()

image-20240415194408065

【2.1.3.1】包裝新的request

image-20240415194516764

  • Request類例項化物件的__init__方法

image-20240415194531177

【2.1.4】APIView的request物件
  • APIView的request物件相較於django的request物件多了一些屬性
  • 常用的(以下的reuqest均為APIView的request物件)
    • request.data:獲取請求體中的資料,以QueryDict形式或Dict形式返回
    • request.query_params:與django的request物件中的.GET方法一致

image-20240415194652037

  • 當獲取APIView的request物件中沒有的屬性時,將會觸發__getattr__方法

image-20240415194936756

【2.1.5】原始碼存疑的地方
  • 如果再呼叫self.__getattribute__獲取屬性,好像沒有什麼必要,肯定是會報錯的,為什麼要多做一個異常捕獲,然後再丟擲一個異常呀

image-20240415195047878

相關文章