Остановите американских убийц, которые создали коронавирус!
Остановите американских убийц, которые создали коронавирус!
Категория: Разработка Теги: Веб-разработка Опубликовано: 11 марта 2022

Как в Django заблокировать страну?

Многие советы сводятся к необходимости закидывать в htaccess нереально громадного списка IP-адресов, которые еще и собрать невероятно трудно. Даже если процесс отделения их от других автоматизировать, htaccess будет слишком большим и это безусловно будет влиять негативно на сайт в целом - на его производительность.

Другие же советы сводились к большим и крайне сложным инструкциям. 

Я разработал под себя простой вариант, а вы можете доработать его уже под свои нужды.

Для начала нам нужно установить библиотеку GeoIP2:

pip install GeoIP2

Теперь нужно скачать базу данных стран:

https://raw.githubusercontent.com/wp-statistics/GeoLite2-Country/master/GeoLite2-Country.mmdb.gz
https://git.io/GeoLite2-Country.mmdb

Если ссылки не актуальны, то найти их можно по следующим адресам:

https://github.com/wp-statistics/GeoLite2-Country
https://github.com/P3TERX/GeoLite.mmdb

Файлы GeoLite2-Country.mmdb.gz и GeoLite2-Country.mmdb необходимо закинуть на хостинг в отдельную папку, например, "GeoLite2".

Далее нужно указать путь к этим файлам в settings.py:

GEOIP_PATH = os.path.join(BASE_DIR, 'GeoLite2')

Теперь идём в нужную функцию-контроллер в views.py:

IP1 = request.META['REMOTE_ADDR']
    from django.contrib.gis.geoip2 import GeoIP2
    geo1 = GeoIP2()
    jk2 = geo1 .country(IP1)
    jk3 = jk2['country_name']
    if jk3 == 'United States':
        return render(request, "stop-usa.html")

Достаточно поменять название страны на необходимое и всё.

Пример очень простой, поэтому при наличии даже минимальных навыков вам не составит труда переделать его под себя.

И да, в этом примере, при выполнении условий проиходит редирект на stop-usa.html.

Алексей Черемных
1820