フロー制限は、名前が示すように、APIコールの頻度を制限することです。各APIコールは、サーバーのリソースを費やすので、多くのAPIは、無制限にユーザーに開かれることはありません、リクエストは、もはやアクセスすることは許可されません一定の回数に達すると、または時間の期間、せいぜい、唯一のAPIにアクセスすることが許可される回数を指定します。
現在、インターフェイスは流量を制限する措置がなく、ユーザーがインターフェイスを呼び出す限り、サーバーはデータを処理して返します。インターフェイスが悪意のあるユーザーによってブラッシングされるのを防ぐために、インターフェイスにフローを制限するために来てください。
前回の記事で、インターフェイスが整理され、キャッシュが追加され、フロー制限ポリシーはキャッシュ設定に基づくことができるようになりました。キャッシュ時間が長いインターフェースに対しては、制限を適切に緩和することができ、データベースへのアクセスを必要とする可能性のあるインターフェースに対しては、厳格な制限が適用されます。
django-rest-framework は、フロー制限のための2つの一般的な補助クラス、 AnonRateThrottle と UserRateThrottle を提供します。 AnonRateThrottle は認証されていないユーザのアクセス頻度を制限するために使われ、 制限はユーザの ip に基づいて行われます。UserRateThrottle は認証されたユーザ、つまりウェブサイトの登録ユーザへのアクセスを制限するために使用されます。両方のクラスを同じ API で使用することで、異なるタイプのユーザに対して異なる流量制限ポリシーを適用することができます。
2つのヘルパー・クラスは、"最大アクセス数/間隔 "というフォーマットで指定する頻度を制限します。 exceptions.Throttled 制限回数を超えた呼び出しは例外をスローし、クライアントはレスポンスとして429ステータスコードを受け取ります。
再び、フロー制限ポリシーは、利用可能なAPIのリストとキャッシュに基づいて分析されます:
その他の注意事項
- ホーム記事リストAPI:キャッシュ、通常のユーザーはあまり頻繁に訪問しません、10/分に制限されています。
- 記事詳細API:キャッシュ、通常のユーザーはあまり頻繁に訪問しません、10/分に制限されています。
- カテゴリ、タグ、アーカイブの日付のリスト、キャッシュ、通常のユーザーからはあまりアクセスされません。
- 検索インターフェイス、通常のユーザーはあまり頻繁に訪問しません、5/分に制限されています。
インターフェイスのフロー制限ルールができたら、次はフロー制限ヘルパークラスを設定します。
1つはグローバル設定、もう1つはグローバル設定をオーバーライドする個々のビュー設定です。ほとんど全てのインターフェースは匿名ユーザーへのフローを制限しているので、グローバル設定から始めましょう。プロジェクトの設定ファイルcommon.pyで、REST_FRAMEWORKの設定項目を見つけて、以下の設定を追加します:
# filename="common.py"
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
],
'DEFAULT_THROTTLE_RATES': {
'anon': '10/min',
}
}
このようにして、すべてのインターフェイスのアクセス周波数は10/分に設定されます。
検索インターフェースでは、5/分という流量制限ルールが設定されているため、このビューセットには別の流量制限クラスが設定されています。
グローバル・コンフィギュレーションでは、制限周波数のデフォルト設定は10/分なので、制限クラスのデフォルト周波数を5/分に設定するには、元の制限クラスを継承して、そのTHROTTLE_RATESプロパティをオーバーライドする必要があります:
# filename="blog/views.py"
from rest_framework.throttling import AnonRateThrottle
class PostSearchAnonRateThrottle(AnonRateThrottle):
THROTTLE_RATES = {"anon": "5/min"}
そして、検索インターフェイスのビューセットで、throttle_classesを介してこのフロー制限クラスを指定します:
# filename="blog/views.py"
class PostSearchView(HaystackViewSet):
index_models = [Post]
serializer_class = PostHaystackSerializer
throttle_classes = [PostSearchAnonRateThrottle]
電流制限が実際に機能するかどうかをテストするためです。
まず、10分のアクセス制限をかけたインターフェイスをテストしてみましょう。 記事リストインターフェイスapi/v1/posts/を例にとると、10回の連続アクセスの後、インターフェイスは次のような結果を返します:
HTTP 429 リクエストが多すぎます 許可: GET, HEAD, OPTIONS Content-Type: application/json Retry-After: 52 Vary: Accept
{ "detail": "リクエストが速度制限を超えました。 52秒後に利用可能になる予定です。}
分後に再アクセスすると正常に戻りました。
api/v1/search/?text=markdownにアクセスして、検索インターフェイスをもう一度テストしてみましょう。 5回連続してリフレッシュした後、インターフェイスは以下の結果を返します:
HTTP 429 リクエストが多すぎます 許可: GET, HEAD, OPTIONS Content-Type: application/json Retry-After: 26 Vary: Accept
{ "detail": "リクエストが速度制限を超えました。 26秒後に利用可能になる予定です。}
分後に再アクセスすると正常に戻りました。
!!! ノート




