webentwicklung-frage-antwort-db.com.de

Holen Sie sich die IP-Adresse der Besucher mit Flask für Python

Ich erstelle eine Website, auf der sich Benutzer anmelden und Dateien herunterladen können. Dabei wird das Flask-Mikro-Framework (basierend auf Werkzeug ) verwendet, das Python ( 2.6 in meinem Fall).

Ich muss die IP-Adresse der Benutzer abrufen, wenn sie sich anmelden (zu Protokollierungszwecken). Weiß jemand, wie man das macht? Sicher gibt es eine Möglichkeit, dies mit Python zu tun?

193
Jon Cox

Lesen Sie die Dokumentation zu wie Sie auf das Request-Objekt zugreifen und erhalten Sie dann von demselben Request-Objekt das Attribut remote_addr.

Codebeispiel

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

Weitere Informationen finden Sie in der Werkzeugdokumentation .

261
Tarantula

Proxies können dies etwas komplizierter machen. Lesen Sie unbedingt ProxyFix ( Flask docs ), wenn Sie eine verwenden. Werfen Sie einen Blick auf request.environ in Ihrer speziellen Umgebung. Mit Nginx mache ich manchmal so etwas:

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

Wenn Proxys, wie z. B. nginx, Adressen weiterleiten, enthalten sie normalerweise die ursprüngliche IP-Adresse irgendwo in den Anforderungsheadern.

Update Siehe Implementierung von flask-security . Lesen Sie vor der Implementierung erneut die Dokumentation zu ProxyFix. Ihre Lösung kann je nach Ihrer speziellen Umgebung variieren.

84
Stephen Fuhry

Tatsächlich werden Sie feststellen, dass Sie beim einfachen Abrufen der folgenden Informationen die Adresse des Servers erhalten:

request.remote_addr

Wenn Sie die IP-Adresse des Clients verwenden möchten, verwenden Sie Folgendes:

request.environ['REMOTE_ADDR']
80
Chiedo

Die IP-Adresse des Benutzers kann mit dem folgenden Snippet abgerufen werden:

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

Ich habe Nginx und mit unten 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 Lösung hat bei mir funktioniert

#!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)

Meine Anfrage und Antwort:

curl -X GET http://test.api

{
    "ip": "Client Ip......"
}
9
Soheyl

Der folgende Code gibt immer die öffentliche IP des Clients an (und keine private IP hinter einem Proxy).

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
7
Tirtha R

httpbin.org verwendet diese Methode:

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

Dies sollte den Job machen. Es stellt die Client-IP-Adresse (Remote-Host) bereit.

Beachten Sie, dass dieser Code auf der Serverseite ausgeführt wird.

from mod_python import Apache

req.get_remote_Host(Apache.REMOTE_NOLOOKUP)
0
raviv