web-dev-qa-db-fra.com

Obtenir l'adresse IP des visiteurs en utilisant Flask pour Python

Je crée un site Web sur lequel les utilisateurs peuvent se connecter et télécharger des fichiers, en utilisant le Micro-framework de Flask (basé sur Werkzeug ) qui utilise Python ( 2,6 dans mon cas).

Je dois obtenir l'adresse IP des utilisateurs lorsqu'ils se connectent (à des fins de journalisation). Est-ce que quelqu'un sait comment faire ça? Il existe sûrement un moyen de le faire avec Python?

193
Jon Cox

Voir la documentation sur comment accéder à l'objet Request puis récupérez à partir de ce même objet Request l'attribut remote_addr.

Exemple de code

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

Pour plus d'informations, voir le documentation Werkzeug .

261
Tarantula

Les mandataires peuvent rendre cela un peu difficile, assurez-vous de vérifier ProxyFix ( Les documents de flacon ) si vous en utilisez un. Jetez un coup d'œil à request.environ dans votre environnement particulier. Avec nginx, je vais parfois faire quelque chose comme ça:

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

Lorsque les mandataires, tels que nginx, transmettent des adresses, ils incluent généralement l'adresse IP d'origine quelque part dans les en-têtes de requête.

Update Voir l'implémentation de flask-security . Encore une fois, consultez la documentation sur ProxyFix avant la mise en œuvre. Votre solution peut varier en fonction de votre environnement particulier.

84
Stephen Fuhry

En fait, vous constaterez que lorsque vous obtenez simplement ce qui suit, vous obtenez l'adresse du serveur:

request.remote_addr

Si vous voulez l’adresse IP du client, utilisez ce qui suit:

request.environ['REMOTE_ADDR']
80
Chiedo

L'adresse IP de l'utilisateur peut être récupérée à l'aide de l'extrait de code suivant:

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

J'ai Nginx et avec en dessous 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 la solution a fonctionné pour moi

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

Ma demande et réponse:

curl -X GET http://test.api

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

Le code ci-dessous donne toujours l'adresse IP publique du client (et non une adresse IP privée derrière un 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 utilise cette méthode:

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

Cela devrait faire le travail. Il fournit l'adresse IP du client (hôte distant).

Notez que ce code est exécuté sur le côté serveur.

from mod_python import Apache

req.get_remote_Host(Apache.REMOTE_NOLOOKUP)
0
raviv