Реклама

Django - Заметка 001. Получение IP адреса и предыдущего URL из запроса

TutorialDjangoHTTP, referer, Django, IP877

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

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

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

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

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

from django.utils.http import is_safe_url, urlunquote


def get_next_url(request):
    next = request.META.get('HTTP_REFERER')
    if next:
        next = urlunquote(next)  # HTTP_REFERER may be encoded.
    if not is_safe_url(url=next, host=request.get_host()):
        next = '/'
    return next

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

@EVILEG 30 декабря 2016 г. 11:30

Реклама

Реклама

Комментарии

Комментарии

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

Реклама

Реклама