Python(私の場合は2.6)を使用するFlaskマイクロフレームワーク( Werkzeugに基づく)を使用して、ユーザーがログオンしてファイルをダウンロードできるWebサイトを作成しています。
ユーザーがログオンするときに(ログ記録の目的で)ユーザーのIPアドレスを取得する必要があります。誰かがこれを行う方法を知っていますか?確かにPythonでそれを行う方法はありますか?
Python(私の場合は2.6)を使用するFlaskマイクロフレームワーク( Werkzeugに基づく)を使用して、ユーザーがログオンしてファイルをダウンロードできるWebサイトを作成しています。
ユーザーがログオンするときに(ログ記録の目的で)ユーザーの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のドキュメントを参照してください。
プロキシを使用すると、これが少し難しい場合があります。ProxyFix(Flask docs )を使用している場合は、必ず確認してください。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)
以下のコードは、常にクライアントのパブリック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
私は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))
AWS Application Balancerなどの他のバランサーの背後でNginxを使用する場合、HTTP_X_FORWARDED_FORはアドレスのリストを返します。次のように修正できます。
if 'X-Forwarded-For' in request.headers:
proxy_data = request.headers['X-Forwarded-For']
ip_list = proxy_data.split(',')
user_ip = ip_list[0] # first address in list is User IP
else:
user_ip = request.remote_addr # For local development
GunicornとNginx環境を使用している場合は、次のコードテンプレートが機能します。
addr_ip4 = request.remote_addr
これでうまくいくはずです。クライアントのIPアドレス(リモートホスト)を提供します。
このコードはサーバー側で実行されていることに注意してください。
from mod_python import apache
req.get_remote_host(apache.REMOTE_NOLOOKUP)
Google CloudAppEngineで上記のいずれの作業も受けられませんでした。これはうまくいきましたが
ip = request.headers['X-Appengine-User-Ip']
提案されrequest.remote_addr
たものは、毎回ローカルホストIPのみを返しました。
これが最も簡単な解決策であり、本番環境での使用方法です。
from flask import Flask, request
from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)
# Set environment from any X-Forwarded-For headers if proxy is configured properly
app.wsgi_app = ProxyFix(app.wsgi_app, x_host=1)
@app.before_request
def before_process():
ip_address = request.remote_addr
に追加include proxy_params
し/etc/nginx/sites-available/$project
ます。 proxy_params
ProxyFixによって解析されるヘッダーを転送します
location / {
proxy_pass http://unix:$project_dir/gunicorn.sock;
include proxy_params;
}
sudo cat /etc/nginx/proxy_params
proxy_set_header Host $http_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;