如何使用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節流的迷人旅程。我們已經揭開了內建節流類的秘密,掌握了配置知識,並探索了將節流應用於我們壯麗檢視的藝術。此外,我們還看到了建立我們自己的自定義節流類的無限潛力,賦予我們的創意生命。