Блог Алексея Черемных

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

Категория: Разработка Теги: Веб-разработка Опубликовано: 3 января 2021 г. 20:30
Код функции
Код функции

На любом сайте приходится блокировать определенные 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.

Похожие материалы:


Код функции-контроллера с декоратором
Разрешить только определенные HTTP запросы при помощи require_http_methods в Django
Автор: Алексей Черемных3 января 2021

В Django существует довольно простой способ разрешить только определенные типы HTTP запросов при помощи декоратора представлений require_http_methods.

Для этого необходимо во …

Форма заявки (пример)
Django автоматическое заполнение поля в модели при её создании
Автор: Алексей Черемных10 января 2021

Появилась необходимость заполнить поле с номером заявки до формирования формы, связанной с моделью, но как это сделать? В интернете много способов, …

VisualSEOStudio
Бесплатная программа для создания карты сайта
Автор: Алексей Черемных30 ноября 2020

Сегодня не так много бесплатных программ для создания карты сайта. Пара штук, и те работают как не очень. О переводе …

Код
Способ передать варианты выбора choices в forms.ChoiceField из views.py
Автор: Алексей Черемных21 июня 2021

Недавно сам столкнулся с проблемой передачи вариантов выбора для поля формы с типом виджета Radio и типом формы forms.ChoiceField из views.py. Зачем, …

Прогон по каталогам
Есть ли эффект от прогонов по каталогам?
Автор: Алексей Черемных28 ноября 2020

Уже давно разного рода сео специалисты спорят о пользе от прогона по каталогам. Под прогоном имеется в виду рассылка объявлений, …

CleanTalk
Лучшая система для фильтрации спама на сайте
Автор: Алексей Черемных30 ноября 2020

Сегодня Вам прорекламирую безусловно лучшую в рунете систему фильтрации спама для сайтов CleanTalk!

С данным сервисов работаю с 2018 года, …

Все теги:

Подписка на рассылку свежих статей