Получить IP-адрес посетителей, использующих Flask для Python - PullRequest
190 голосов
/ 21 сентября 2010

Я создаю веб-сайт, на котором пользователи могут входить в систему и загружать файлы, используя микрорамку Flask (на основе Werkzeug ), которая использует Python (2.6 в моем случае).

Мне нужно получить IP-адрес пользователей при входе в систему (для целей регистрации).Кто-нибудь знает как это сделать?Конечно, есть способ сделать это с Python?

Ответы [ 8 ]

254 голосов
/ 21 сентября 2010

См. Документацию по , как получить доступ к объекту запроса , а затем получить из этого же объекта запроса атрибут remote_addr.

Пример кода

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

Для получения дополнительной информации см. Документацию Werkzeug .

80 голосов
/ 30 октября 2014

Прокси могут сделать это немного хитрым, обязательно проверьте ProxyFix ( Flask docs ), если вы используете его. Посмотрите на request.environ в вашей конкретной среде. С nginx я иногда делаю что-то вроде этого:

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

Когда прокси-серверы, такие как nginx, передают адреса, они обычно включают исходный IP-адрес где-то в заголовках запроса.

Обновление См. Реализацию безопасности колбы . Опять же, ознакомьтесь с документацией о ProxyFix перед внедрением. Ваше решение может отличаться в зависимости от конкретной среды.

79 голосов
/ 30 июля 2014

На самом деле вы обнаружите, что при простом получении вы получите адрес сервера:

request.remote_addr

Если вам нужен IP-адрес клиента, используйте следующее:

request.environ['REMOTE_ADDR']
28 голосов
/ 12 мая 2013

IP-адрес пользователя можно получить с помощью следующего фрагмента:

from flask import request
print(request.remote_addr)
7 голосов
/ 31 июля 2016

httpbin.org использует этот метод:

return jsonify(origin=request.headers.get('X-Forwarded-For', request.remote_addr))
6 голосов
/ 20 августа 2018

У меня есть Nginx и С ниже 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 решение сработало для меня

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

Мой запрос и ответ:

curl -X GET http://test.api

{
    "ip": "Client Ip......"
}
6 голосов
/ 10 апреля 2018

Приведенный ниже код всегда дает общедоступный IP-адрес клиента (а не частный IP-адрес за прокси-сервером).

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
0 голосов
/ 22 февраля 2018

Это должно сделать работу. Он предоставляет IP-адрес клиента (удаленный хост).

Обратите внимание, что этот код выполняется на стороне сервера.

from mod_python import apache

req.get_remote_host(apache.REMOTE_NOLOOKUP)
...