如何使用Django Rest Framework限制API請求速率


在使用著名的Django Rest Framework (DRF)構建API的過程中,必須巧妙地應對管理客戶端向API端點發送大量請求速率的挑戰。節流機制透過有效地防止潛在的濫用、保護寶貴的資源以及促進客戶端之間公平使用來提供幫助。在這篇深入探討的文章中,我們將踏上一次啟蒙之旅,探索在DRF驅動的API中實現節流技術的各個方面。準備好深入探索可用的內建節流類,以及根據您的獨特需求定製節流規則的技巧吧。

強大的內建節流類

在Django Rest Framework的領域中,眾多內建節流類等待您的查閱。讓我們揭開其中一些令人敬畏的類的面紗,每個類都有其獨特的用途。

  • AnonRateThrottle:此類限制匿名(未經身份驗證)客戶端在特定時間段內可以發出的請求數量。

  • UserRateThrottle:此類限制已認證客戶端在給定時間間隔內可以發出的請求數量。

  • ScopedRateThrottle:使用此類,您可以使用範圍為API的不同部分定義自定義節流速率。

要釋放這些強大的節流類的真正潛力,您只需將它們整合到Django專案settings.py檔案的REST_FRAMEWORK設定中即可。

配置節流:要為基於DRF的API配置節流,請按照以下步驟操作

  • 開啟專案的settings.py檔案。

  • 找到REST_FRAMEWORK字典,並將所需的節流類新增到DEFAULT_THROTTLE_CLASSES列表中。

  • 在DEFAULT_THROTTLE_RATES字典中定義節流速率,將速率與每個類關聯。

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
        'rest_framework.throttling.ScopedRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/hour',
        'user': '1000/day',
        'custom': '50/hour',
    }
}

在這個例子中,我們定義了以下節流速率:

  • 匿名客戶端每小時最多可以發出100個請求。

  • 已認證客戶端每天最多可以發出1000個請求。

  • 自定義範圍每小時允許50個請求。

將節流應用於檢視:節流規則可以透過兩種方式應用於檢視:基於類的檢視和基於函式的檢視。

1. 基於類的檢視

  • 在您的檢視類中使用throttle_classes屬性並指定所需的節流類。

  • 此外,您可以設定throttle_scope屬性來為ScopedRateThrottle指定自定義範圍。

使用基於類的檢視的示例

from rest_framework.throttling import UserRateThrottle, ScopedRateThrottle
from rest_framework.views import APIView

class MyApiView(APIView):
    throttle_classes = [UserRateThrottle, ScopedRateThrottle]
    throttle_scope = 'custom'

    def get(self, request):
        # Your view logic here
        pass

2. 基於函式的檢視

  • 在您的檢視函式上使用@throttle_classes裝飾器並提供所需的節流類。

使用基於函式的檢視的示例

from rest_framework.throttling import UserRateThrottle, ScopedRateThrottle
from rest_framework.decorators import api_view, throttle_classes

@api_view(['GET'])
@throttle_classes([UserRateThrottle, ScopedRateThrottle])
def my_api_view(request):
    # Your view logic here
    pass

建立自定義節流:如果內建節流類不能滿足您的需求,您可以透過擴充套件SimpleRateThrottle類並實現get_cache_key()方法來建立自定義節流類。scope屬性定義了自定義節流類的範圍。

自定義節流類的示例

from rest_framework.throttling import SimpleRateThrottle

class CustomThrottle(SimpleRateThrottle):
    scope = 'custom'

    def get_cache_key(self, request, view):
        # Custom logic to generate the cache key
        pass

節流不會產生對使用者可見的任何輸出。相反,它對API請求實施速率限制。

例如,如果客戶端超過UserRateThrottle設定的速率限制,伺服器將返回類似於以下內容的HTTP響應:

HTTP/1.1 429 Too Many Requests
Content−Type: application/json
Retry−After: 60
{
    "detail": "Request was throttled. Expected availability in 60 seconds."
}

結論

因此,尊敬的讀者,我們結束了使用Django Rest Framework進行API節流的迷人旅程。我們已經揭開了內建節流類的秘密,掌握了配置知識,並探索了將節流應用於我們壯麗檢視的藝術。此外,我們還看到了建立我們自己的自定義節流類的無限潛力,賦予我們的創意生命。

更新於:2023年7月10日

508 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告