Evgenii Legotckoi
30 декабря 2016 г. 11:30

Django - Урок 015. Получение IP адреса и предыдущего URL из запроса

Получение IP адреса пользователя из запроса на Django может быть полезно для организации такого функционала сайта, как например, блокировка хостов, с которых выполняются попытки подбора пароля к сайту или необходимость запомнить пользователя по IP, чтобы обеспечивать доступ к сайту только для определённого пользователя с определённого IP адреса.

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

  1. def get_client_ip(request):
  2. x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
  3. if x_forwarded_for:
  4. ip = x_forwarded_for.split(',')[-1].strip()
  5. else:
  6. ip = request.META.get('REMOTE_ADDR')
  7. return ip

Получение же предыдущего URL, на котором был пользователь может быть полезно в том случае, если Вам необходимо сделать перенаправление пользователя на ту страницу, с которой пользователь пришёл после выполнения авторизации.

Например, на данном сайте имеется виджет авторизации на каждой странице. Для авторизации с виджета направляется POST запрос на URL авторизации, но после этого необходимо вернуть пользователя на ту страницу с которой он пришёл, чтобы пользователь мог дальше работать со статьей или форумом. Можно добавлять в виджет специальное поле, которое будет содержать текущий URL и передаёт его в POST запросе. Изначально так и было сделано, но это усложняет код. А можно воспользоваться извлечением реферального URL, с которого пользователь пришёл, как сделано сейчас на сайте.

  1. from django.utils.http import is_safe_url, urlunquote
  2.  
  3.  
  4. def get_next_url(request):
  5. next = request.META.get('HTTP_REFERER')
  6. if next:
  7. next = urlunquote(next) # HTTP_REFERER may be encoded.
  8. if not is_safe_url(url=next, host=request.get_host()):
  9. next = '/'
  10. return next

С помощью данной функции можно будет получать предыдущий URL в любом запросе и не писать отдельный специальный код для перенаправлений для каждого виджета или формы, с которой работает пользователь.

Для Django рекомендую VDS-сервера хостера Timeweb .

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь