2010-09-21 8 views
144

Ich mache eine Website, wo Benutzer anmelden und Dateien herunterladen können, mit der Flask micro-framework (basierend auf Werkzeug), die Python (2.6 in meinem Fall) verwendet.Erhalten IP-Adresse der Besucher

Ich muss die IP-Adresse der Benutzer abrufen, wenn sie sich anmelden (für Protokollierungszwecke). Weiß jemand, wie man das macht? Sicherlich gibt es einen Weg, es mit Python zu machen?

Antwort

195

Siehe die Dokumentation zu how to access the Request object und dann von diesem Request-Objekt das Attribut remote_addr abrufen.

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

+2

Die Antwort unten ist besser, weil es ein Codebeispiel enthält. –

+1

Manchmal kann es nützlich sein: request.access_route [0] –

+16

Wie bei nginx, sendet es die echte IP-Adresse unter 'HTTP_X_FORWARDED_FOR ', also stellen Sie sicher, dass Sie nicht mit localhost für jede Anfrage enden. –

27

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

from flask import request 
print(request.remote_addr) 
+0

Dies trifft nicht zu, wenn die App hinter einem Proxy-Server wie _nginx_ läuft. Was es oft in der Produktion ist. – datashaman

67

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

request.remote_addr 

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

request.environ['REMOTE_ADDR'] 
+2

Nur wenn Sie hinter einem Reverse Proxy sind, nein? – Ryan

+1

@minitech Ich würde sagen, dass es Ihrem Code egal ist, ob Sie hinter einem Proxy stehen oder nicht. Wenn diese Option unabhängig vom Reverse-Proxy zuverlässig funktioniert und die andere davon ausgeht, dass Sie sich nicht hinter einem Reverse-Proxy befinden, sollte dies bevorzugt werden.(Ich würde das testen, wenn ich einfach einen Reverse-Proxy einrichten könnte, aber das würde mehr Zeit in Anspruch nehmen als jetzt.) – jpmc26

+0

@ jpmc26: Ich sehe keinen Grund, warum es überhaupt funktionieren sollte. 'request.remote_addr' klingt wie eine Eigenschaft, die abhängig davon, ob der Reverse-Proxy vertrauenswürdig ist, eine Remote-Adresse erhalten soll. – Ryan

59

Proxies kann dies ein wenig schwierig machen, stellen Sie sicher, ProxyFix (Flask docs) zu überprüfen, wenn Sie einen verwenden. Werfen Sie einen Blick auf request.environ in Ihrer speziellen Umgebung. Mit nginx werde ich 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.

AktualisierenSee the flask-security implementation. Lesen Sie nochmals die Dokumentation zu ProxyFix vor der Implementierung. Ihre Lösung kann je nach Ihrer Umgebung variieren.

+0

danke. Dies sollte aktualisiert werden – OWADVL

+2

Das funktioniert, wenn Sie die entsprechenden Felder in der Konfiguration Ihres Reverse-Proxy festlegen. In der Produktion verwendet. – drahnr

+2

@drahnr ja in der Tat. Der obige Code funktioniert, wenn z.B. Nginx, das Sie festlegen: proxy_set_header X-Real-IP $ remote_addr; – pors

7

httpbin.org verwendet diese Methode:

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

Das die Arbeit machen sollte. 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) 
Verwandte Themen