Domanda

Sto facendo un sito web dove gli utenti possono accedere e scaricare file, utilizzando il Flask micro-quadro (basata su Werkzeug ) che utilizza Python (2,6 nel mio caso).

Ho bisogno di ottenere l'indirizzo IP degli utenti quando accedono (per scopi di registrazione). Qualcuno sa come fare questo? Sicuramente c'è un modo per farlo con Python?

È stato utile?

Soluzione

Vedere la documentazione sul come accedere alla richiesta oggetto e poi ottenere da questo stesso oggetto Request, l'attributo remote_addr.

Codice esempio

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

Per ulteriori informazioni consultare la Werkzeug documentazione .

Altri suggerimenti

La delega può rendere questo un po 'difficile, assicuratevi di controllare ProxyFix ( Flask docs ) se si utilizza uno. Date un'occhiata al request.environ in un ambiente particolare. Con nginx io a volte fare qualcosa di simile:

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

Quando proxy, come nginx, gli indirizzi in avanti, che in genere sono la IP originale da qualche parte nelle intestazioni di richiesta.

Aggiorna Vedere le pallone-security implementazione . Anche in questo caso, la documentazione su ProxyFix prima di implementare. La vostra soluzione può variare in base al particolare ambiente.

In realtà, quello che troverete è che quando semplicemente ottenendo il seguente ti porterà l'indirizzo del server:

request.remote_addr

Se si desidera che i client indirizzo IP, quindi utilizzare il seguente:

request.environ['REMOTE_ADDR']

L'indirizzo IP dell'utente può essere recuperato utilizzando il seguente frammento:

from flask import request
print(request.remote_addr)

ho Nginx e con seguente 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;
        }
}
soluzione

@ tirtha-r ha lavorato per me

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

La mia richiesta e di risposta:

curl -X GET http://test.api

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

httpbin.org utilizza questo metodo:

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

Il codice di seguito dà sempre l'IP pubblico del cliente (e non un IP privato dietro 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

Questo dovrebbe fare il lavoro. Esso fornisce l'indirizzo IP del client (host remoto).

Si noti che questo codice è in esecuzione sul lato server.

from mod_python import apache

req.get_remote_host(apache.REMOTE_NOLOOKUP)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top