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?
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 .
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.
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']
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)
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......"
}
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
httpbin.org utilise cette méthode:
return jsonify(Origin=request.headers.get('X-Forwarded-For', request.remote_addr))
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)