PythonにFlaskを使用して訪問者のIPアドレスを入手してください
-
04-10-2019 - |
質問
ユーザーがログオンしてファイルをダウンロードできるWebサイトを作成しています。 フラスコマイクロフレームワーク (に基づく werkzeug)Python(私の場合は2.6)を使用します。
ユーザーがログオンするときに(ロギング目的で)ユーザーのIPアドレスを取得する必要があります。誰かがこれを行う方法を知っていますか?確かにPythonでそれを行う方法はありますか?
解決
のドキュメントを参照してください リクエストオブジェクトにアクセスする方法 そして、この同じリクエストオブジェクト、属性から取得します remote_addr
.
コードの例
from flask import request
from flask import jsonify
@app.route("/get_my_ip", methods=["GET"])
def get_my_ip():
return jsonify({'ip': request.remote_addr}), 200
詳細については、を参照してください Werkzeugのドキュメント.
他のヒント
プロキシはこれを少し難しくすることができます、必ずチェックアウトしてください proxyfix (フラスコドキュメント)あなたがそれを使用している場合。を見てみましょう request.environ
あなたの特定の環境で。 nginxを使用すると、時々このようなことをします:
from flask import request
request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
Nginxなどのプロキシの場合、フォワードアドレスは通常、リクエストヘッダーのどこかに元のIPを含めます。
アップデート Flask-Securityの実装を参照してください. 。繰り返しますが、実装する前にProxyFixに関するドキュメントを確認してください。ソリューションは、特定の環境に基づいて異なる場合があります。
実際、あなたが見つけるのは、単に以下を取得するだけでサーバーのアドレスを取得するということです。
request.remote_addr
クライアントIPアドレスが必要な場合は、次のことを使用してください。
request.environ['REMOTE_ADDR']
ユーザーのIPアドレスは、次のスニペットを使用して取得できます。
from flask import request
print(request.remote_addr)
私は持っています nginx そして以下で nginx config:
server {
listen 80;
server_name xxxxxx;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://x.x.x.x:8000;
}
}
@Tirtha-R 解決策は私のために働きました
#!flask/bin/python
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/', methods=['GET'])
def get_tasks():
if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
return jsonify({'ip': request.environ['REMOTE_ADDR']}), 200
else:
return jsonify({'ip': request.environ['HTTP_X_FORWARDED_FOR']}), 200
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0', port=8000)
私の要求と応答:
curl -X GET http://test.api
{
"ip": "Client Ip......"
}
httpbin.org この方法を使用します:
return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr))
以下のコードは、常にクライアントのパブリックIPを提供します(プロキシの背後にあるプライベートIPではありません)。
from flask import request
if request.environ.get('HTTP_X_FORWARDED_FOR') is None:
print(request.environ['REMOTE_ADDR'])
else:
print(request.environ['HTTP_X_FORWARDED_FOR']) # if behind a proxy
これは仕事をするはずです。クライアントIPアドレス(リモートホスト)を提供します。
このコードはサーバー側で実行されていることに注意してください。
from mod_python import apache
req.get_remote_host(apache.REMOTE_NOLOOKUP)