Flask を使ってユーザの IP アドレスを取得するには?

Flask は最も人気のある Python Web 開発フレームワークの 1 つです。

軽量なWebフレームワークですが、効率的なWebアプリケーションを手間なく展開するためのさまざまな組み込みメソッドを提供しています。

このガイドでは、Flask を使って作成した Web アプリケーションにアクセスしたユーザーの IP アドレスを取得することにします。

エンドポイント / への着信リクエストを処理し、ユーザーの IP アドレスをレスポンスとして返す、シンプルな REST API を作成します。

Flaskを使った基本的なWebアプリの作成

このチュートリアルのために、新しい Flask プロジェクトを作成します。

エンドポイント / へのリクエストで “Hello World” を返す基本的なアプリを作成します。

from flask import Flask


# Creating the instance of the class Flask
app = Flask(__name__)


# Using the decorator to create the URL for the web application
@app.route('/')
# The function will return the information displayed on the webpage
def hello_world():
    return '<h1 Hello World</h1'


# Run the application
if __name__ == '__main__':
    app.run(debug=True)


さて、アプリのセットアップができたので、ユーザーのリクエストに関連するIPアドレスを収集してみましょう。

Flask でユーザの IP アドレスを調べるには?

クライアントがページをリクエストするときはいつも、あるペイロードを持った HTTP GET リクエストを送信します。

他の情報の中に、彼らの特徴的なIPアドレスが含まれています。

Flask では、すべてのルートが request 変数にアクセスすることができ、この変数はユーザーから送られてきたリクエストを表します。

この request からは様々な要素を抽出することができ、IPアドレスは remote_addr プロパティとして示されます。

@app.route('/')
def hello_world():
    ip_addr = request.remote_addr
    return '<h1 Your IP address is:' + ip_addr


また、リクエストコンテキストの環境を通して、リモートアドレスを取得することもできます。

requestオブジェクトのenviron辞書は、リクエストに関連する様々なキーとその値を保持しています。

REMOTE_ADDR はサーバー変数 (キー) のひとつで、クライアントやサーバーの IP アドレスにマッピングされています。

@app.route('/client')
def client():
    ip_addr = request.environ['REMOTE_ADDR']
    return '<h1 Your IP address is:' + ip_addr


しかし、ユーザーがプロキシの内側でリクエストを行う場合、上記の2つのオプションは機能しません。

この場合、リクエストのヘッダをチェックしなければなりません。

特に、HTTP_X_FORWARDED_FORヘッダを探します。

@app.route('/proxy-client')
def proxy_client():
    ip_addr = request.environ['HTTP_X_FORWARDED_FOR']
    return '<h1 Your IP address is:' + ip_addr


さて、このアプローチでもヘッダが設定されていない場合はうまくいきません。

そこで、一般的な方法として get() メソッドを使用し、ヘッダが設定されていない場合はリモートアドレスをデフォルトにすることができます。

@app.route('/proxy-client')
def proxy_client():
    ip_addr = request.environ.get('HTTP_X_FORWARDED_FOR', request.remote_addr)
    return '<h1 Your IP address is:' + ip_addr


注意: 存在しないキーから値を取得しようとすると None が返されます。

dictクラスのget()メソッドを使用すると、get()がキーを見つけられなかった場合に使用するデフォルト値を設定することができます。

HTTP_X_FORWARDED_FOR が None の場合、代わりに request.remote_addr の値が使用されます。

これらを踏まえて、ユーザーのIPアドレスを取得するために、以下の3つのアプローチのいずれかを選択することができます。

from flask import Flask, request


app = Flask(__name__)


@app.route('/')
def hello_world():
    ip_addr = request.remote_addr
    return '<h1 Your IP address is:' + ip_addr


@app.route('/client')
def client():
    ip_addr = request.environ['REMOTE_ADDR']
    return '<h1 Your IP address is:' + ip_addr


@app.route('/client')
def proxy_client():
    ip_addr = request.environ.get('HTTP_X_FORWARDED_FOR', request.remote_addr)
    return '<h1 Your IP address is:' + ip_addr


if __name__ == '__main__':
    app.run(debug=True)


結論

この記事では、ユーザーの IP アドレスを取得するための 3 種類の方法を学びました。

リモートアドレスには request.remote_addr で直接アクセスし、 request.environREMOTE_ADDR キーでアクセスし、ユーザーがプロキシを使っている場合には request.environHTTP_X_FORWARDED_FOR キーをチェックする必要がある、ということです。

</h1

タイトルとURLをコピーしました