Получение IP адреса пользователя из запроса на Django может быть полезно для организации такого функционала сайта, как например, блокировка хостов, с которых выполняются попытки подбора пароля к сайту или необходимость запомнить пользователя по IP, чтобы обеспечивать доступ к сайту только для определённого пользователя с определённого IP адреса.
Получение же предыдущего URL, на котором был пользователь может быть полезно в том случае, если Вам необходимо сделать перенаправление пользователя на ту страницу, с которой пользователь пришёл после выполнения авторизации.
Например, на данном сайте имеется виджет авторизации на каждой странице. Для авторизации с виджета направляется POST запрос на URL авторизации, но после этого необходимо вернуть пользователя на ту страницу с которой он пришёл, чтобы пользователь мог дальше работать со статьей или форумом. Можно добавлять в виджет специальное поле, которое будет содержать текущий URL и передаёт его в POST запросе. Изначально так и было сделано, но это усложняет код. А можно воспользоваться извлечением реферального URL, с которого пользователь пришёл, как сделано сейчас на сайте.
С помощью данной функции можно будет получать предыдущий URL в любом запросе и не писать отдельный специальный код для перенаправлений для каждого виджета или формы, с которой работает пользователь.
Рекомендуем хостинг TIMEWEB
Рекомендуемые статьи по этой тематике
Как получить IP-адрес пользователя в Django?
Как я могу получить IP пользователя в Django?
У меня есть такой вид:
Но я получаю эту ошибку:
Убедитесь, что у вас настроен обратный прокси (если есть), настроенный правильно (например, mod_rpaf установлен для Apache).
А затем просто передайте запрос в качестве аргумента;
Установка:
pip install django-ipware
Простое использование:
Расширенное использование:
Ответ Александра великолепен, но ему не хватает обработки прокси, которые иногда возвращают несколько IP-адресов в заголовке HTTP_X_FORWARDED_FOR.
Реальный IP обычно находится в конце списка, как описано здесь: http://en.wikipedia.org/wiki/X-Forwarded-For
Решение представляет собой простую модификацию кода Александра:
Я хотел бы предложить улучшение ответа Янченко.
Вместо того, чтобы брать первый ip в списке X_FORWARDED_FOR, я беру первый, который не известен как внутренний ip, так как некоторые маршрутизаторы не уважают протокол, и вы можете видеть внутренние ips как первое значение списка.
Надеюсь, это поможет коллегам-гуглерам, у которых возникла такая же проблема.
Вот короткий вкладыш для этого:
PS: я добавил этот ответ только для того, чтобы сделать его решение более заметным.
Больше нет путаницы В последних версиях Django четко указано, что IP-адрес клиента доступен по адресу
для получения дополнительной информации проверьте Django Docs
Информация env:
версия python : версия 2.7.5
Django: (1, 6, 6, ‘final’, 0)
версия nginx: nginx/1.6.0
uwsgi: 2.0.7
Информация настройки Env:
nginx как обратный прокси-сервер, прослушивающий порт 80 uwsgi как восходящий сокет unix, в конечном итоге ответит на запрос
Информация о конфигурации Django:
Конфигурация nginx:
получить все параметры в приложении django:
Вывод:
Таким образом, в основном, вы должны указать точно такое же имя поля / параметра в nginx и использовать request.META[field/param] в приложении django.
И теперь вы можете решить, добавлять ли промежуточное программное обеспечение (перехватчик) или просто анализировать HTTP_X_FORWARDED_FOR определенные представления.
Первоначальная причина, по которой функциональность была удалена из Django, заключалась в том, что заголовок в конечном итоге нельзя доверять. Причина в том, что это легко подделать. Например, рекомендуемый способ настройки обратного прокси-сервера nginx:
Ваш nginx на myhost.com отправит дальше:
В случае, если проблема заключается в том, чтобы доверять своим пользователям, вы можете попробовать что-то вроде django-xff : https://pypi.python.org/pypi/django-xff/
Как получить IP-адрес пользователя в django?
Как получить IP-адрес пользователя в django?
У меня есть вид вот так:
Но я получаю эту ошибку:
ОТВЕТЫ
Ответ 1
А затем просто передайте запрос в качестве аргумента для него;
Ответ 2
Вы можете использовать django-ipware, который поддерживает Python 2 & 3 и обрабатывает IPv4 и IPv6.
Установка:
Простое использование:
Расширенное использование:
Примечание: прочитайте это уведомление.
Ответ 3
Ответ Alexander велик, но не хватает обработки прокси-серверов, которые иногда возвращают несколько IP-адресов в заголовок HTTP_X_FORWARDED_FOR.
Реальный IP обычно находится в конце списка, как описано здесь: http://en.wikipedia.org/wiki/X-Forwarded-For
Ответ 4
Я хотел бы предложить улучшение ответа Янченко.
Вместо того, чтобы принимать первый ip в списке X_FORWARDED_FOR, я беру первый, который не является известным внутренним ip, поскольку некоторые маршрутизаторы не уважают протокол, и вы можете видеть внутреннее ips как первое значение списка.
Я надеюсь, что это поможет собратьям Google, которые имеют ту же проблему.
Ответ 5
Ps: Я добавил этот ответ, чтобы сделать его решение более заметным.
Ответ 6
Информация о Env:
версия python: 2.7.5
Версия Django: (1, 6, 6, ‘final’, 0)
Версия nginx: nginx/1.6.0
uwsgi: 2.0.7
Информация о настройке Env:
nginx как обратный прокси-сервер, прослушивающий порт 80 uwsgi как восходящий сокет unix, будет отвечать на запрос в конце концов
Информация о конфигурации Django:
nginx config:
получить все параметры в приложении django:
Вывод:
Итак, вы должны указать точно такое же имя поля/параметра в nginx и использовать request.META[field/param] в приложении django.
И теперь вы можете решить, добавлять ли промежуточное ПО (перехватчик) или просто анализировать HTTP_X_FORWARDED_FOR в определенных представлениях.
Ответ 7
Вот короткий вкладыш для этого:
Ответ 8
Причина, по которой функциональность была удалена из Django изначально, заключалась в том, что заголовку нельзя доверять. Причина в том, что его легко обмануть. Например, рекомендуемый способ настройки обратного прокси-сервера nginx состоит в следующем:
Когда вы выполните:
Ваш nginx в myhost.com отправит вперед:
X-Real-IP будет IP-адресом первого предыдущего прокси-сервера, если вы будете следовать инструкциям вслепую.
Если вам доверяют, кто ваши пользователи, вы можете попробовать что-то вроде django-xff : https://pypi.python.org/pypi/django-xff/
Ответ 9
Я также пропустил прокси в ответе выше. Я использовал get_ip_address_from_request из django_easy_timezones.
Ответ 10
request.META.get(‘REMOTE_ADDR’) здесь будет достаточно.
Ответ 11
В django.VERSION(2, 1, 1, ‘final’, 0) обработчик запросов
если вы позвоните выше код дважды, вы можете получить
AttributeError («Объект» _io.BytesIO «не имеет атрибута» поток «»,)
AttributeError («Объект» LimitedStream «не имеет атрибута» raw «»)
Как получить IP-адрес пользователя в django?
Как получить IP пользователя в django?
но я получаю эту ошибку:
10 ответов
убедитесь, что у вас правильно настроен обратный прокси (если есть) (например, mod_rpaf установлен для Apache).
а затем просто передайте ему запрос в качестве аргумента;
можно использовать django-ipware, который поддерживает Python 2 & 3 и ручками адрес IPv4 & протокол IPv6.
установка:
Простое Использование:
Дополнительные Функции:
Proxy Count-сервер Django находится за фиксированным количеством прокси
доверенные прокси-сервер Django находится за одним или несколькими известными и доверенными прокси
Примечание: читать это обратите внимание.
ответ Александра велик, но не хватает обработки прокси, которые иногда возвращают несколько IP-адресов в заголовке HTTP_X_FORWARDED_FOR.
реальный IP обычно находится в конце списка, как описано здесь:http://en.wikipedia.org/wiki/X-Forwarded-For
решение представляет собой простую модификацию кода Александра:
Я хотел бы предложить улучшение ответа Янченко.
вместо того, чтобы принимать первый ip в списке X_FORWARDED_FOR, я беру первый, который в не известном внутреннем ip, так как некоторые маршрутизаторы не уважают протокол, и вы можете видеть внутренние ips как первое значение списка.
надеюсь, это поможет коллегам-гуглерам, у которых такая же проблема.
Ps: я добавил этот ответ, чтобы сделать его решение более заметным.
в моем случае ничего из вышеперечисленного не работает, поэтому я должен проверить uwsgi + django исходный код и передать статический парам в nginx и посмотреть, почему/как, и ниже то, что я нашел.
ОКР информация:
версия python: 2.7.5
Версия Джанго: (1, 6, 6, ‘final’, 0)
с nginx версия: nginx/1.6.0
на uwsgi: 2.0.7
информация о настройке Env:
nginx в качестве обратного прокси-сервер слушает порт 80 uwsgi как восходящий сокет unix, будет ответ на запрос, в конечном счете
информация о конфигурации Django:
конфигурация nginx:
получение всех параметров в приложении django:
вывод:
Итак, в основном, вы должны указать точно такое же поле / Имя param в nginx и использовать request.META[field/param] в приложении django.
и теперь вы можете решить, следует ли добавить промежуточный (перехватчик) или просто разбор HTTP_X_FORWARDED_FOR в некоторых представлениях.
GeoIP и Django
Вебразработчики частенько сталкиваются с классической задачей определения местоположения пользователя по его IP-адресу. Существует множество различных решений, например на основе мировой базы Maxmind Geolite или российской IpgeoBase. Все они обладают достаточно низкуровневыми API, ну оно и понятно: на входе айпишник, на выходе страна, либо город и, если повезёт, ещё какая-нибудь полезная информация.
У всех сайтов с GeoIP, которые мы запускали, есть общая черта: они не только нуждаются в простой геолокации, необходимо также выводить различный контент на сайте в зависимости от месторасположения пользователя. Чтобы упростить для себя эту задачу мы написали небольшую батарейку django-geoip, вдохновившись приложением django-ipgeobase.
Django-geoip
Основное достоинство приложения: оно умеет автоматически определять географию пользователя и передавать её в объект request. Теперь контент на сайте, обладающий «региональностью», легко отфильтровать во views.py по значению request.location.
Особенности реализации
Приложение django-geoip поддерживает иерархию географии Страна — Область — Город, которая хранится в нормализованном виде в СУБД. Данные по диапазонам IP-адресов со связями ко всем элементам географии — в четвёртой таблице. Текущая версия работает только с данными ipgeobase.ru, это почти тысяча городов России и Украины и 150 тысяч IP-диапазонов.
Одной из причин хранения данных в БД является потребность в создании своей модели географии, отвечающей задачам бизнес-логики. Например, в одном из проектов мы ограничиваем определение локации пользователя областями России, в другом — набором городов, в которых присутствует компания. Эта модель реализует паттерн «фасада» к иерархии географии ipgeobase, позволяя гибко настроить геолокацию под себя.
Представим, что наш сайт имеет несколько региональных «версий», каждая из которых может содержать свой контент. При этом регион может иметь произвольное имя и, к примеру, содержать несколько областей РФ (таблица geo_location на схеме):
Вот пример того, как это настраивается и работает. Определим свою модель географии MyCustomLocation:
Это обычная джанго-модель, дополненная тремя классметодами, реализующие “интерфейс” фасада GeoIP. Назначение каждой функции понятно из названия и докстринга. Осталось заполнить базу названиями городов и привязать их к моделям djagno-geoip.
Прописываем в settings.py:
Добавляем middleware для автоматического определения региона:
И вуаля: request.location теперь содержит значение нашей модели MyCustomLocation для каждого пользователя.
Если пользователь не оказался ни в одном из этих городов, ему будет присвоен регион по-умолчанию (get_default_location).
Данный подход сильно облегчает задачу создания «региональных» сайтов, отличающихся друг от друга содержимым в зависимости от месторасположения пользователя.
Что дальше
Приложение хотя и альфа, неплохо работает у нас в продакшене (версия 0.2.2). Статус альфа намекает, что в будущем API будет меняться. Мы планируем поддерживать и развивать его дальше, в том числе реализовать определение региона не только для России, но и для остального мира. Также показалось интересной идея оптимизации поиска подходящего IP-диапазона по базе.
Исходные коды доступны на гитхабе, жду ваших комментариев.




