django rest_framework面經

二月雪發表於2024-10-08

1、什麼是drf元件

drf的全稱是Django RESTful Framework;
它是一個基於django開發的元件,本質是一個django的app;
drf可以幫我們快速開發出一個遵循restful規範的程式。

2、drf元件提供的功能

1.免除csrf認證
2.檢視(三種:(1)APIView,(2)ListAPIview,(3)GenericViewSet)
3.版本處理
4.認證
5.許可權
6.節流(頻率限制)
7.解析器
8.篩選器
9.分頁
10.序列化和資料校驗:可以對QuerySet進行序列化,也可以對使用者提交的資料進行校驗——展示特殊的資料
     depth
     source:無需加括號,在原始碼內部會去判斷是否可執行,如果可執行自動加括號。【多對一、一對一/choice】
     SerializerMethodField定義鉤子方法【多對多】
11.渲染器:可以幫我們把json資料渲染到drf自己的頁面上。

3、drf的主要檢視有哪些?

主要檢視有3種:APIView,ListAPIview,GenericViewSet。

第一種:APIView
    第一種遵循了CBV的模式,裡面的功能比較多但是需要自己寫的程式碼也有很多
    提供了免除csrf認證,版本處理、認證、許可權、節流、解析器、篩選器、分頁、序列化、渲染器
 ​
 ​
 第二種:ListAPIView,RetrieveAPIView,CreateAPIView,UpdateAPIView,DestroyAPIView
    第二種則在第一種的基礎上,封裝了許多我們需要自己的寫的程式碼,許多功能的實現只需要給專屬的變數名賦值就可以實現該功能
 ​
 ​
 第三種:GenericViewSet,ListModelMixin,RetrieveModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin
    第三種則重構了APIView中的as_view()方法,結合請求方法和不同Mixin類的方法名從而進行執行不同的功能。
    與前面兩種最主要的區別是url路由中as_view()方法中需要傳值。
    目前使用的主要目的是把第二種的bug(查詢全部資料的功能和查詢單個資料的功能無法在一個類中實現)實現在一個類中!

4、版本處理

DRF提供了幾種版本控制類,如URLPathVersioning、NamespaceVersioning和AcceptHeaderVersioning等。開發人員可以根據自己的需求選擇合適的版本控制類。

在Django REST Framework中使用版本控制,需要在settings.py檔案中配置版本控制類。可以使用DEFAULT_VERSIONING_CLASS設定來指定版本控制類的名稱.

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning',  # 版本驗證
    'DEFAULT_VERSION': 'v2',  # 預設版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 有效版本
}


# 接著在註冊的 API 介面前帶上版本號:
# urls.py
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from .views import UserViewSet

urlpatterns = [
    path('api/v1/users/', UserViewSet.as_view({'get': 'list'}), name='user-list'),
]

urlpatterns = format_suffix_patterns(urlpatterns)

5、drf認證

REST framework 提供了4種認證方式:BasicAuthentication、SessionAuthentication、TokenAuthentication、RemoteUserAuthentication等。
(DRF的認證是在定義有許可權類(permission_classes)的檢視下才有作用)

(1)BasicAuthentication 該認證方案使用 HTTP Basic Authentication,並根據使用者的使用者名稱和密碼進行簽名。

(2)SessionAuthentication 此認證方案使用 Django 的預設 session 後端進行認證。

(3)TokenAuthentication 此認證方案使用簡單的基於令牌的 HTTP 認證方案。

(4)RemoteUserAuthentication 這種身份驗證方案允許您將身份驗證委託給您的 Web 伺服器,該伺服器設定 REMOTE_USER 環境變數。

# setting.py

INSTALLED_APPS = (
    ...
    'rest_framework.authtoken'  # 遷移資料庫時(python manage.py migrate)會生成一個token表用於儲存token資訊
)


# TokenAuthentication身份驗證
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',  # drf的身份認證類
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',  # def的許可權驗證
    )
}

6、drf許可權

drf 提供了5種許可權:AllowAny、IsAuthenticated、IsAdminUser、IsAuthenticatedOrReadOnly、DjangoModelPermissions

(1)AllowAny許可權類將允許不受限制的訪問,而不管該請求是否已透過身份驗證或未經身份驗證。

(2)IsAuthenticated 許可權類將拒絕任何未經身份驗證的使用者的許可權,並允許其他許可權。 如果你希望你的API僅供註冊使用者訪問,則此許可權適用。

(3)IsAdminUser 除非user.is_staff為True,否則IsAdminUser許可權類將拒絕任何使用者的許可權,在這種情況下將允許許可權。

(4)IsAuthenticatedOrReadOnly 將允許經過身份驗證的使用者執行任何請求。只有當請求方法是“安全”方法(GET, HEAD 或 OPTIONS)之一時,才允許未經授權的使用者請求。

(5)DjangoModelPermissions 此許可權類與Django的標準django.contrib.authmodel許可權相關聯。此許可權只能應用於具有.queryset屬性集的檢視。只有在使用者透過身份驗證並分配了相關模型許可權的情況下,才會被授予許可權。

# setting.py 新增配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',  # drf的身份認證類
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',  # def的許可權驗證
    )
}

7、drf節流處理

匿名使用者透過ip地址來控制訪問頻率,已登入使用者透過id來控制
 首先要設定配置檔案:
 # 也可以設定全域性,
     "DEFAULT_THROTTLE_CLASSES":["rest_framework.throttling.AnonRateThrottle",]
 # 設定訪問頻率——一分鐘10次
     "DEFAULT_THROTTLE_RATES": {
             "anon":"10/m"
         }
 - 實現原理
     把所有登入記錄時間放在一個列表中,當使用者請求網頁的時候,用現在的時間減去約束的時間間隔,然後把小於這個時間記錄排除,再計算出時間間隙的記錄條數,
     如果其中的條數小於規定的條數則可以訪問並且把當前時間新增進列表中,如果大於或等於則不讓其訪問。
 - 具體流程
     當使用者請求網頁的時候,後臺允許該介面的url中的as_views(),執行原始碼的APIView中的dispatch方法,執行initial方法,裡面的check_throttles方法,
     迴圈執行節流類中的allow_request方法,但是AnonRateThrottle等類中沒有,去執行SimpleRateThrottle類中的allow_request方法,裡面就是實現原理中的程式碼,
     如果可以訪問返回True,如果不讓訪問則返回False,之後返回check_throttles,如果是False則執行SimpleRateThrottle類中的wait方法得到需要等待的時間在頁面上顯示!

8、序列化器

REST framework提供了兩種序列化器:Serializer類和ModelSerializer類。

(1)Serializer 是對物件的序列化和反序列化

class Book(models.Model):
    id = models.IntegerField(primary_key=True)
    title = models.CharField(max_length=255)
    desc = models.CharField(max_length=255)
    is_deleted = models.IntegerField(choices=[(1, "刪除"), (0, "未刪除")])
    author = models.CharField(max_length=255)

(2)ModelSerializer 是將model中定義的欄位直接序列化處理

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ['id', 'account_name', 'users', 'created']

ModelSerializer 會自動生成model欄位對應的Field不用我們定義。

相關文章