286

Python(私の場合は2.6)を使用するFlaskマイクロフレームワーク( Werkzeugに基づく)を使用して、ユーザーがログオンしてファイルをダウンロードできるWebサイトを作成しています。

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

4

12 に答える 12

386

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のドキュメントを参照してください。

于 2010-09-21T12:37:17.543 に答える
116

プロキシを使用すると、これが少し難しい場合があります。ProxyFixFlask docs )を使用している場合は、必ず確認してください。request.environあなたの特定の環境を見てください。nginxを使用して、次のようなことを行うことがあります。

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

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

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

于 2014-10-30T13:41:48.600 に答える
87

実際、次の情報を取得するだけでサーバーのアドレスが取得されることがわかります。

request.remote_addr

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

request.environ['REMOTE_ADDR']
于 2014-07-30T15:05:14.247 に答える
32

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

from flask import request
print(request.remote_addr)
于 2013-05-12T00:21:33.653 に答える
30

以下のコードは、常にクライアントのパブリック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
于 2018-04-10T18:02:14.217 に答える
29

私は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......"
}
于 2018-08-20T10:37:39.423 に答える
10

httpbin.orgは次の方法を使用します。

return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr))
于 2016-07-31T11:39:09.677 に答える
10

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
于 2020-02-06T11:13:46.077 に答える
1

GunicornとNginx環境を使用している場合は、次のコードテンプレートが機能します。

addr_ip4 = request.remote_addr
于 2020-02-16T07:05:03.400 に答える
0

これでうまくいくはずです。クライアントのIPアドレス(リモートホスト)を提供します。

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

from mod_python import apache

req.get_remote_host(apache.REMOTE_NOLOOKUP)
于 2018-02-22T08:57:42.840 に答える
0

Google CloudAppEngineで上記のいずれの作業も受けられませんでした。これはうまくいきましたが

ip = request.headers['X-Appengine-User-Ip']

提案されrequest.remote_addrたものは、毎回ローカルホストIPのみを返しました。

于 2022-02-13T19:19:44.367 に答える
0

これが最も簡単な解決策であり、本番環境での使用方法です。

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_paramsProxyFixによって解析されるヘッダーを転送します

  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;
于 2022-02-24T03:31:05.147 に答える