2015-07-14 16 views
5

Ho bisogno di un indirizzo IP client usando python. Ho provato il codice qui sotto, ma la sua non funziona nel server:Come ottenere l'indirizzo IP del client usando la struttura della bottiglia di python

from socket import gethostname, gethostbyname 
ip = gethostbyname(gethostname()) 
print ip 

Sul server, ottengo '127.0.0.1' ogni volta. C'è un modo per trovare l'indirizzo IP del client?

+0

c'è alcun servizio in-tra, ad esempio nginx che riceve in realtà il collegamento esterno dal client e la richiesta avanti html per imbottigliare? –

+0

@LukaRahne Ho lo stesso problema quando Apache inoltra la richiesta alla bottiglia: http://stackoverflow.com/questions/36954669/apache-python-bottle-visitor-ip-always-refers-to-127-0-0 -1 Hai qualche idea? – Basj

risposta

2

Se si sta cercando di ottenere l'IP esterno, sarà necessario scaricarlo da una fonte esterna, ovvero whatismyip.com o da qualche parte che offre un'API. Se questo è quello che stai cercando, dare un'occhiata al modulo richieste http://docs.python-requests.org/

+1

Non penso che tu abbia capito la domanda. (O forse non l'ho capito. :) –

+0

Sai cosa, ho fatto. Ho visto il codice che stava tentando di usare e sono arrivato a una conclusione. Buon occhio – blasko

+0

no, non hai @blasko – cagri

5

Stai diventando l'indirizzo IP del server di , non di clienti del server.

Si desidera guardare della richiesta diREMOTE_ADDR, in questo modo:

from bottle import Bottle, request 

app = Bottle() 

@app.route('/hello') 
def hello(): 
    client_ip = request.environ.get('REMOTE_ADDR') 
    return ['Your IP is: {}\n'.format(client_ip)] 

app.run(host='0.0.0.0', port=8080) 

EDIT: Alcune persone hanno osservato che, per loro, il valore di REMOTE_ADDR è sempre l'indirizzo stesso IP (di solito 127.0.0.1). Questo perché sono dietro un proxy (o bilanciamento del carico). In questo caso, l'indirizzo IP originale del client viene in genere memorizzato nell'intestazione HTTP_X_FORWARDED_FOR. Il seguente codice funzionerà in entrambi i casi:

@app.route('/hello') 
def hello(): 
    client_ip = request.environ.get('HTTP_X_FORWARDED_FOR') or request.environ.get('REMOTE_ADDR') 
    return ['Your IP is: {}\n'.format(client_ip)] 
+1

Ho lo stesso problema e REMOTE_ADDR fornisce sempre 127.0.0.1: http://stackoverflow.com/questions/36954669/apache-python-bottle-visitor-ip-always-refers- a-127-0-0-1 – Basj

5

Il server potrebbe essere dietro un proxy. Utilizzare questo per proxy e il supporto in avanti:

request.environ.get('HTTP_X_FORWARDED_FOR') or request.environ.get('REMOTE_ADDR') 
+0

Perché 'o'? Puoi spiegare, è un operatore bit a bit 'o'? O semplicemente per gestire il caso HTTP_X_FORWARDED_FOR è 'None'? – Basj

+0

Esattamente. A volte, HTTP_X_FORWARDED_FOR è None, ma è importante controllare prima gli IP proxy. – Farsheed