Получение IP-адреса посетителей сайта на Flask, Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы получить IP-адрес посетителя в Flask, используйте атрибут request.remote_addr:

Python
Скопировать код
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def show_ip():
    return 'Ваш IP: ' + request.remote_addr

При настройке прокси-сервера применяйте заголовок X-Forwarded-For для получения реального IP-адреса:

Python
Скопировать код
from flask import request

real_ip = request.headers.get('X-Forwarded-For', request.remote_addr)
Кинга Идем в IT: пошаговый план для смены профессии

Изловчиться с прокси и разгадать 'X-Real-IP'

Если приложение Flask работает за обратным прокси-сервером, request.remote_addr может выдать IP самого прокси, а не пользователя. В таком случае прокси передаёт исходный IP через заголовки X-Forwarded-For или X-Real-IP. Эту проблему можно решить, применив ProxyFix либо самостоятельно извлекая заголовки:

Python
Скопировать код
from werkzeug.middleware.proxy_fix import ProxyFix

app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_host=1)

Или так:

Python
Скопировать код
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def show_real_ip():
    real_ip = request.headers.get('X-Real-IP', request.remote_addr)
    return 'Ваш настоящий IP: ' + real_ip

Проверить работу механизма определения IP можно воспользовавшись curl:

Bash
Скопировать код
curl http://localhost:5000/

Примечание: "Пора проверить работу!"

Справляться со сложностями прокси и множеством IP-адресов

В облачном хостинге запросы часто проходят через несколько прокси-серверов, и в результате X-Forwarded-For будет содержать список IP-адресов, отделённых запятыми. Первый в этом списке — это IP клиента.

Python
Скопировать код
x_forwarded_for = request.headers.get('X-Forwarded-For', '').split(',')
client_ip = x_forwarded_for[0] if x_forwarded_for else request.remote_addr

Тем не менее, работать с IP-адресами следует аккуратно из-за возможности подделки IP и связанных с этим угроз безопасности.

Визуализация

Представим каждого пользователя в виде уникального эмоджи-персонажа 🚶‍♂️ с невидимым идентификатором — IP-адресом:

Посещение вашего приложения Flask (обозначим его 🏠):

Markdown
Скопировать код
🚶‍♂️➡️🏠: Посетитель приходит со своим IP (как с невидимым идентификатором).

Применение Flask 📸 фиксирует IP:

Python
Скопировать код
visitor_ip = request.remote_addr  # 📸 Зафиксировано!

Flask позволяет вести учёт посещений:

Markdown
Скопировать код
| Посетитель | IP-адрес    |
| ---------- | ----------- |
| 🚶‍♂️1       | 192.168.1.10 |
| 🚶‍♂️2       | 172.16.0.2   |
| 🚶‍♂️3       | 10.0.0.1     |

Каждая запись соответствует визиту в ваше веб-приложение 🏠.

Логирование в Nginx

Если Nginx работает в качестве обратного прокси, его следует настроить на корректное логирование IP клиентов:

location / {
    proxy_pass http://your_flask_app;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Теперь Nginx будет правильно передавать IP через необходимые заголовки.

Удобная разработка на локальной машине

При локальной разработке запускайте своё Flask-приложение вот таким образом:

Python
Скопировать код
app.run(debug=True, host='0.0.0.0', port=5000)

Параметр debug=True обеспечивает автоматическую перезагрузку и информативные сообщения об ошибках.

Защита IP с помощью доверенного расширения Flask

Применение расширений Flask, таких как flask-security, обеспечивает дополнительную защиту при регистрации и работе с IP.

Python
Скопировать код
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin

# Пример интеграции моделей пользователей и ролей с учётом IP-адресов...

security = Security(app, user_datastore)

Этот код является первым шагом для интеграции flask-security в ваше приложение.

Полезные материалы

  1. API — Документация Flask (2.0.x)
  2. Получение IP-адреса посетителей с использованием Flask для Python – Stack Overflow
  3. Введение в Flask — Документация Flask (2.0.x)
  4. Утилиты — Документация Werkzeug (2.0.x)
  5. X-Forwarded-For – HTTP | MDN
  6. Requests: HTTP для людей™ — Документация Requests 2.31.0
  7. Развертывание приложения Flask в производственной среде — Документация Flask (2.0.x)