Holen Sie die IP-Adresse der Besucher mit Flask für Python
-
04-10-2019 - |
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?
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)