Evgenii Legotckoi
30 грудня 2016 р. 11:30

Django - Підручник 015. Отримання IP-адреси та попередньої URL-адреси із запиту

Отримання IP-адреси користувача з запиту на Django може бути корисним для організації такого функціоналу сайту, як, наприклад, блокування хостів, з яких виконуються спроби підбору пароля до сайту або необхідність запам'ятати користувача по IP, щоб забезпечувати доступ до сайту тільки для певного користувача з певного IP адреси.

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 у будь-якому запиті та не писати окремий спеціальний код для перенаправлень для кожного віджету чи форми, з якою працює користувач.

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

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up