Flask micro-framework ( Werkzeug に基づく)を使用してユーザーがログオンしてファイルをダウンロードできるWebサイトを作成しています。これはPython(私の場合は2.6)。
ユーザーがログオンするときに、ユーザーのIPアドレスを取得する必要があります(ログの目的で)。誰もこれを行う方法を知っていますか?確かにPythonでそれを行う方法はありますか?
Requestオブジェクトへのアクセス方法 のドキュメントを参照し、この同じRequestオブジェクトから属性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 documentation を参照してください。
実際には、次のものを取得するだけでサーバーのアドレスが取得されます。
request.remote_addr
クライアントのIPアドレスが必要な場合は、次を使用します。
request.environ['REMOTE_ADDR']
プロキシを使用すると、これが少し複雑になります。使用する場合は、 ProxyFix ( Flask docs )を確認してください。特定の環境でrequest.environ
を見てください。 nginxでは、時々このようなことをします:
from flask import request
request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
Nginxなどのプロキシがアドレスを転送する場合、通常、リクエストヘッダーのどこかに元のIPが含まれます。
Updateflask-securityの実装を参照 。繰り返しますが、実装する前にProxyFixに関するドキュメントを確認してください。ソリューションは、特定の環境によって異なる場合があります。
ユーザーのIPアドレスは、次のスニペットを使用して取得できます。
from flask import request
print(request.remote_addr)
httpbin.org はこのメソッドを使用します:
return jsonify(Origin=request.headers.get('X-Forwarded-For', 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 __== '__main__':
app.run(debug=True,Host='0.0.0.0', port=8000)
私のリクエストとレスポンス:
curl -X GET http://test.api
{
"ip": "Client Ip......"
}
以下のコードは常にクライアントのパブリック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)