如何使用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節流的迷人旅程。我們已經揭開了內建節流類的秘密,掌握了配置知識,並探索了將節流應用於我們壯麗檢視的藝術。此外,我們還看到了建立我們自己的自定義節流類的無限潛力,賦予我們的創意生命。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP