FlaskでAPIレートリミッティングを実装する詳細ガイド

この記事では、PythonのFlaskフレームワークでAPIレートリミッティングを実装する方法について詳しく解説します。具体的なコード例とその解説、応用例を含めています。

目次

はじめに

APIレートリミッティングは、一定時間内にAPIエンドポイントに対するリクエスト数を制限する一般的なテクニックです。不正な利用を防ぐため、またサーバーに対する負荷を抑えるためにも重要です。

基本的なレートリミッティングの実装

PythonとFlaskを使用して、基本的なAPIレートリミッティングを実装する方法について見ていきましょう。

必要なパッケージのインストール

FlaskとFlask-Limiterパッケージが必要です。

pip install Flask Flask-Limiter

サンプルコード

以下は基本的なAPIレートリミッティングを実装したサンプルコードです。

from flask import Flask
from flask_limiter import Limiter

app = Flask(__name__)
limiter = Limiter(app, key_func=get_remote_address)

# レートリミッティングの適用
@limiter.limit("5 per minute")
@app.route("/api/resource", methods=["GET"])
def api_resource():
    return "This is a rate-limited resource."

if __name__ == "__main__":
    app.run()

コードの解説

– `Flask`と`Flask-Limiter`をインポートします。
– `Limiter`クラスを初期化し、アプリケーションに結びつけます。
– `@limiter.limit(“5 per minute”)`で、一分あたり最大5回のアクセスを許可するように設定しています。

応用例

動的なレートリミッティング

一定の条件に応じて、レートリミッティングを動的に変更する方法を見ていきます。

from flask import Flask, request
from flask_limiter import Limiter

app = Flask(__name__)
limiter = Limiter(app, key_func=get_remote_address)

# 動的なレートリミッティング
@limiter.request_filter
def exempt_users():
    return request.endpoint == "static"

@limiter.limit("5 per minute")
@app.route("/api/resource", methods=["GET"])
def api_resource():
    return "This is a rate-limited resource."

if __name__ == "__main__":
    app.run()

コードの解説

– `@limiter.request_filter`で、特定のエンドポイント(この場合は”static”)をレートリミッティングから除外しています。

IPアドレスによる制限

特定のIPアドレスからのリクエストを特別に制限する例です。

from flask import Flask, request
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

app = Flask(__name__)
limiter = Limiter(app, key_func=get_remote_address)

# 特定のIPに対するレートリミッティング
@limiter.request_filter
def block_ip():
    return request.remote_addr == "192.168.0.10"

@limiter.limit("1 per minute")
@app.route("/api/resource", methods=["GET"])
def api_resource():
    return "This is a rate-limited resource for specific IP."

if __name__ == "__main__":
    app.run()

コードの解説

– `request.remote_addr`で、リクエストが来たIPアドレスを取得しています。
– `@limiter.request_filter`で、IPアドレスが”192.168.0.10″の場合に特別なレートリミッティングを適用しています。

まとめ

FlaskでAPIレートリミッティングを実装するための基本的な方法と、いくつかの応用例について解説しました。この知識を活かして、APIをより安全かつ効率的に運用してください。

コメント

コメントする

目次