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.environ
の REMOTE_ADDR
キーでアクセスし、ユーザーがプロキシを使っている場合には request.environ
の HTTP_X_FORWARDED_FOR
キーをチェックする必要がある、ということです。
</h1