質問

ユーザーがログオンしてファイルをダウンロードできる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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top