Простой способ в Django блокировать конкретные IP на всем сайте

Категория: Разработка
Теги: Веб-разработка
Опубликовано: 3 января 2021 г. 13:30
Просмотров: 60

Простой способ в Django блокировать конкретные IP на всем сайте

На любом сайте приходится блокировать определенные IP адреса. Если таковых нет, это значит только одно - что этим сайтом никто не занимается. 

Подозрительная активность? Блокировать IP! Постоянный спам? Блокировать IP! Прочие зловредные действия? Также блокировать!

В Django можно реализовать блокировку определенных IP адресов при помощи Middleware. Если очень огрубить, то это своеобразные службы, подобно службам Windows. Можно создать такую службу, которая и будет фильтровать посетителей по IP.

Для начала необходимо создать папку middleware в пакете приложения, то есть там же, где расположен файл settings.py.

В папке middleware создаем файл filter_ip_middleware.py со следующим кодом внутри:

from django.core.exceptions import PermissionDenied

class FilterIPMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    
    def __call__(self, request):
#127.0.0.1 НЕОБХОДИМО ПОМЕНЯТЬ НА ТОТ IP, который нужно заблокировать
        blocked_ips = ['127.0.0.1']
        ip = request.META.get('REMOTE_ADDR')
        if ip in blocked_ips:
            raise PermissionDenied
        
        response = self.get_response(request)
        
        return response

Теперь давайте разберём пару строк. Я искренне надеюсь, что перед использованием великого копипаста вы все-таки прочитаете необольшое количество текста, который тут написан.

Итак, строка from django.core.exceptions import PermissionDenied импортирует библиотеку для ограничения доступа, как не сложно догадаться.

функция __call__ срабатывает при вызове службы, а внутри неё создается список blocked_ips, в котором и указываются IP адреса, которые необходимо заблокировать. Можно указать несколько IP адресов через запятую, например, ['10.0.0.1', '10.0.0.2', '10.0.0.3'].

Далее переменной ip присваиваем значение из параметра REMOTE_ADDR (удаленный адрес) HTTP запроса.

Теперь при помощи простейшего условного оператора if проверяем, присутствует ли полученный ip в списке blocked_ips, если да, тогда вызываем исключение по причине запрета доступа, иначе формируем и возвращаем response для отображения веб-страницы.

Осталось указать данную службу в settings.py в разделе MIDDLEWARE. Приведу не весь settings.py, а только секцию MIDDLEWARE (мы добавили последний элемент списка):

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'board.middleware.filter_ip_middleware.FilterIPMiddleware',
]

Теперь указанные в filter_ip_middleware.py IP-адреса будут блокироваться при попытке открыть сайт. 

Также следует отметить, что последняя служба должна инициализировать процесс отображения веб-страницы, именно поэтому в коде нашего фильтра присутсуют строки self.get_response = get_response, response = self.get_response(request) и return response.