Uzyskaj adres IP odwiedzających korzystających z Flask for Python

Tworzę stronę internetową, na której użytkownicy mogą logować się i pobierać pliki, używając mikro-frameworka Flask (opartego na Werkzeug ), który używa Pythona (w moim przypadku 2.6).

Muszę uzyskać adres IP użytkowników podczas logowania (w celach logowania). Czy ktoś wie jak to zrobić? Na pewno jest sposób, aby to zrobić z Pythonem?

Author: Acumenus, 2010-09-21

10 answers

Zobacz dokumentację Jak uzyskać dostęp do obiektu Request, a następnie uzyskać z tego samego obiektu Request atrybut remote_addr.

Przykład kodu

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

Więcej informacji można znaleźć w dokumentacji Werkzeug .

 332
Author: Tarantula,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 16:30:09

Proxy mogą to trochę utrudnić, upewnij się, aby sprawdzić ProxyFix (Flask docs) Jeśli używasz jednego. Spójrz na request.environ w swoim konkretnym środowisku. Z nginxem czasami zrobię coś takiego:

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

Gdy proxy, takie jak nginx, wysyłają adresy do przodu, zazwyczaj zawierają oryginalny adres IP gdzieś w nagłówkach żądań.

Aktualizacja Zobacz implementację flask-security . Ponownie przejrzyj dokumentację o ProxyFix przed wdrożeniem. Rozwiązanie może się różnić w zależności od konkretnego środowiska.

 109
Author: Stephen Fuhry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-10 12:59:56

Faktycznie, to, co znajdziesz Jest to, że po prostu uzyskanie następujących będzie ci Adres serwera:

request.remote_addr

Jeśli chcesz mieć adres IP klienta, użyj następującego polecenia:

request.environ['REMOTE_ADDR']
 85
Author: Chiedo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 15:05:14

Adres IP użytkownika można odczytać za pomocą następującego fragmentu:

from flask import request
print(request.remote_addr)
 30
Author: davidg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 17:32:41

Mam Nginx i poniżej 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 rozwiązanie zadziałało dla mnie

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

Moja prośba i odpowiedź:

curl -X GET http://test.api

{
    "ip": "Client Ip......"
}
 20
Author: Soli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-20 10:37:39

Poniższy kod zawsze podaje publiczny adres IP klienta (a nie Prywatny adres IP za 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
 17
Author: Tirtha R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 18:02:14

Httpbin.org używa tej metody:

return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr))
 8
Author: Pegasus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-11 22:39:55

Jeśli używasz Nginx za innymi równoważnikami, na przykład AWS Application Balancer, HTTP_X_FORWARDED_FOR zwraca listę adresów. Można to naprawić w ten sposób:

if 'X-Forwarded-For' in request.headers:
    proxy_data = request.headers['X-Forwarded-For']
    ip_list = proxy_data.split(',')
    user_ip = ip_list[0]  # first address in list is User IP
else:
    user_ip = request.remote_addr  # For local development
 8
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-06 11:13:46

Jeśli używasz środowiska Gunicorn i Nginx, poniższy szablon kodu działa dla Ciebie.

addr_ip4 = request.remote_addr
 1
Author: Jyotiprakash panigrahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-16 07:05:03

To powinno wystarczyć. Dostarcza adres IP klienta (zdalny host).

Zauważ, że ten kod działa po stronie serwera.

from mod_python import apache

req.get_remote_host(apache.REMOTE_NOLOOKUP)
 0
Author: raviv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 09:23:26