Frage

Ich mache eine Website, wo Nutzer auf und Dateien herunterladen anmelden können, mit dem Flask Mikro-Rahmen (basierend auf Werkzeug ), den Python (2.6 in meinem Fall) verwendet.

Ich brauche die IP-Adresse der Nutzer zu erhalten, wenn sie sich (zur Protokollierung). Wer weiß, wie dies zu tun? Sicherlich gibt es eine Möglichkeit, es mit Python zu tun?

War es hilfreich?

Lösung

Sehen Sie die Dokumentation auf wie das Request-Objekt zuzugreifen und erhält aus dem gleichen Request-Objekt dann das Attribut remote_addr.

Code-Beispiel

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 Werkzeug Dokumentation .

Andere Tipps

Proxies kann ein wenig knifflig machen dies, stellen Sie sicher, a href überprüfen <= "http://werkzeug.pocoo.org/docs/0.14/contrib/fixers/#werkzeug.contrib.fixers.ProxyFix" rel = "noreferrer"> ProxyFix ( Flask docs ), wenn Sie eine verwenden. Schauen Sie sich auf request.environ in Ihrer Umgebung. Mit nginx Ich werde manchmal so etwas tun:

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

Wenn Proxies, wie nginx, vorwärts Adressen, sie enthalten in der Regel die ursprüngliche IP irgendwo in den Request-Header.

Aktualisieren Siehe Kolben-Sicherheitsimplementierung . Auch vor der Implementierung in der Dokumentation über ProxyFix überprüfen. Ihre Lösung auf Ihrer Umgebung variieren kann.

Eigentlich, was Sie finden, ist, dass, wenn einfach die folgende bekommen werden Sie die Adresse des Servers erhalten:

request.remote_addr

Wenn Sie die Clients IP-Adresse mögen, dann die folgenden verwenden:

request.environ['REMOTE_ADDR']

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

from flask import request
print(request.remote_addr)

Ich habe Nginx und unter 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 funktionierte für mich

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

Meine Anfrage und Antwort:

curl -X GET http://test.api

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

httpbin.org verwendet diese Methode:

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

Der Code unten immer gibt die öffentliche IP-Adresse des Clients (und nicht eine 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

Dies sollte die Arbeit machen. Es bietet die Client-IP-Adresse (Remote-Host).

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

from mod_python import apache

req.get_remote_host(apache.REMOTE_NOLOOKUP)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top