Получение IP-адреса посетителей сайта на Flask, Python
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для того чтобы получить IP-адрес посетителя в Flask, используйте атрибут request.remote_addr
:
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def show_ip():
return 'Ваш IP: ' + request.remote_addr
При настройке прокси-сервера применяйте заголовок X-Forwarded-For
для получения реального IP-адреса:
from flask import request
real_ip = request.headers.get('X-Forwarded-For', request.remote_addr)
Изловчиться с прокси и разгадать 'X-Real-IP'
Если приложение Flask работает за обратным прокси-сервером, request.remote_addr
может выдать IP самого прокси, а не пользователя. В таком случае прокси передаёт исходный IP через заголовки X-Forwarded-For
или X-Real-IP
. Эту проблему можно решить, применив ProxyFix
либо самостоятельно извлекая заголовки:
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_host=1)
Или так:
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
:
curl http://localhost:5000/
Примечание: "Пора проверить работу!"
Справляться со сложностями прокси и множеством IP-адресов
В облачном хостинге запросы часто проходят через несколько прокси-серверов, и в результате X-Forwarded-For
будет содержать список IP-адресов, отделённых запятыми. Первый в этом списке — это IP клиента.
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 (обозначим его 🏠):
🚶♂️➡️🏠: Посетитель приходит со своим IP (как с невидимым идентификатором).
Применение Flask 📸 фиксирует IP:
visitor_ip = request.remote_addr # 📸 Зафиксировано!
Flask позволяет вести учёт посещений:
| Посетитель | 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-приложение вот таким образом:
app.run(debug=True, host='0.0.0.0', port=5000)
Параметр debug=True
обеспечивает автоматическую перезагрузку и информативные сообщения об ошибках.
Защита IP с помощью доверенного расширения Flask
Применение расширений Flask, таких как flask-security
, обеспечивает дополнительную защиту при регистрации и работе с IP.
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin
# Пример интеграции моделей пользователей и ролей с учётом IP-адресов...
security = Security(app, user_datastore)
Этот код является первым шагом для интеграции flask-security
в ваше приложение.
Полезные материалы
- API — Документация Flask (2.0.x)
- Получение IP-адреса посетителей с использованием Flask для Python – Stack Overflow
- Введение в Flask — Документация Flask (2.0.x)
- Утилиты — Документация Werkzeug (2.0.x)
- X-Forwarded-For – HTTP | MDN
- Requests: HTTP для людей™ — Документация Requests 2.31.0
- Развертывание приложения Flask в производственной среде — Документация Flask (2.0.x)