web-dev-qa-db-ja.com

FlaskのPythonを使用して訪問者のIPアドレスを取得します

Flask micro-frameworkWerkzeug に基づく)を使用してユーザーがログオンしてファイルをダウンロードできるWebサイトを作成しています。これはPython(私の場合は2.6)。

ユーザーがログオンするときに、ユーザーのIPアドレスを取得する必要があります(ログの目的で)。誰もこれを行う方法を知っていますか?確かにPythonでそれを行う方法はありますか?

186
Jon Cox

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 を参照してください。

250
Tarantula

実際には、次のものを取得するだけでサーバーのアドレスが取得されます。

request.remote_addr

クライアントのIPアドレスが必要な場合は、次を使用します。

request.environ['REMOTE_ADDR']
79
Chiedo

プロキシを使用すると、これが少し複雑になります。使用する場合は、 ProxyFixFlask docs )を確認してください。特定の環境でrequest.environを見てください。 nginxでは、時々このようなことをします:

from flask import request   
request.environ.get('HTTP_X_REAL_IP', request.remote_addr)   

Nginxなどのプロキシがアドレスを転送する場合、通常、リクエストヘッダーのどこかに元のIPが含まれます。

Updateflask-securityの実装を参照 。繰り返しますが、実装する前にProxyFixに関するドキュメントを確認してください。ソリューションは、特定の環境によって異なる場合があります。

78
Stephen Fuhry

ユーザーのIPアドレスは、次のスニペットを使用して取得できます。

from flask import request
print(request.remote_addr)
28
davidg

httpbin.org はこのメソッドを使用します:

return jsonify(Origin=request.headers.get('X-Forwarded-For', request.remote_addr))
7
Pegasus

私は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......"
}
6
Soheyl

以下のコードは常にクライアントのパブリック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
5
Tirtha R

これは仕事をする必要があります。クライアントIPアドレス(リモートホスト)を提供します。

このコードはサーバー側で実行されていることに注意してください。

from mod_python import Apache

req.get_remote_Host(Apache.REMOTE_NOLOOKUP)
0
raviv