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?
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 .
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.
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']
Die IP-Adresse des Benutzers kann mit dem folgenden Snippet abgerufen werden:
from flask import request
print(request.remote_addr)
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......"
}
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
httpbin.org verwendet diese Methode:
return jsonify(Origin=request.headers.get('X-Forwarded-For', request.remote_addr))
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)