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