You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

89 lines
3.1 KiB

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import warnings
# XXX intellectronica 2015-03-19
# Disabling dat_getter for now. Users need to make sure they have the GeoIP
# DB installed to use this.
# from ..dat_getter import dat_getter
from django.contrib.gis.geoip import GeoIP
def cowboy_log(msg):
# DEBUG
with open('/tmp/segmentation-debug.log', 'a') as debug_file:
debug_file.write('{}\n'.format(msg))
class ResolveCountryCodeMiddleware(object):
def __init__(self):
cowboy_log('Entering ResolveCountryCodeMiddleware.__init__') # DEBUG
try:
# XXX intellectronica 2015-03-19
# Disabling dat_getter for now. Users need to make sure they have
# the GeoIP DB installed to use this.
# country_data = dat_getter.update_dat()
# The values supplied here only work in the
# Aldryn base project >= 1.4.2
country_data = {
'path': '/home/web/zuykov/env/lib/python2.7/site-packages/country_segment/',
'country': 'GeoIP.dat',
}
self.geo_ip = GeoIP(**country_data)
cowboy_log('ResolveCountryCodeMiddleware.__init__ self.geoip == {}'.format(self.geo_ip)) # DEBUG
except Exception as e:
warnings.warn('GeoIP database is not initialized: {0}'.format(e))
cowboy_log('GeoIP database is not initialized: {0}\n'.format(e)) # DEBUG
self.geo_ip = False
def get_client_ip(self, request):
#
# NOTE: this is a particularly naïve implementation! See:
# http://esd.io/blog/flask-apps-heroku-real-ip-spoofing.html
#
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def process_request(self, request):
'''
Use the GeoIP API to resolve country codes from the visitors IP
Address. In case the IP address does not resolve or of technical
issues, the resulting code may be set to one {'XA', 'XB', ... 'XZ'}.
This range is explicitly reserved for 'private use', so should never
conflict.
See: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
'''
cowboy_log('Entering process_request') # DEBUG
if self.geo_ip:
try:
country_code = self.geo_ip.country_code(self.get_client_ip(request))
if country_code:
country_code = country_code.upper()
else:
country_code = 'XX'
cowboy_log('Country could not be determined') # DEBUG
except Exception, ex:
country_code = 'XB'
cowboy_log(
'Error trying to determine country: {} {}\n'.format(
repr(ex), str(ex))) # DEBUG
else:
country_code = 'XA'
cowboy_log('GeoIP not initialised.') # DEBUG
cowboy_log('COUNTRY_CODE == {}'.format(country_code)) # DEBUG
request.META['COUNTRY_CODE'] = country_code