首先安装geoip2:
sudo pip3 install geoip2
然后下载GeoIP的数据库放到项目目录下:
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
gunzip GeoLite2-Country.mmdb.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
gunzip GeoLite2-City.mmdb.gz
自定义中间件,逻辑部分根据需求自定义即可:
from django.contrib.gis.geoip2 import GeoIP2
geoip = GeoIP2(country='GeoLite2-Country.mmdb')
class StatisticsMiddleware(MiddlewareMixin):
def process_request(self, request):
ip = request.META.get('HTTP_REMOTE_ADDR', request.META['REMOTE_ADDR'])
try:
country = geoip.country(ip)['country_code']
except:
country = 'CN'
if country != 'CN':
return HttpResponseForbidden('Access is denied.')
else:
...
最后在settings.py中配置GeoIP数据库的路径,把自定义的中间件放在第一个中间件的位置,这样屏蔽后的IP发来的请求不会进入其他中间件中:
GEOIP_PATH = os.path.join(BASE_DIR, 'mysite/geoip/')
MIDDLEWARE.insert(0, 'mysite.backends.StatisticsMiddleware')