Как в 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.

Добавил: xxx5432    2021-04-30 04:28:05     Просмотров: 960
 

Комментариев нет, стань первым!
Текст комментария: