Attach a lazy evaluated function as a property of request
in a middleware.
from django.contrib.gis.geoip import GeoIP
from django.utils.functional import SimpleLazyObject
def get_country_code(request):
g = GeoIP()
location = g.country(request.META['REMOTE_ADDR'])
country_code = location.get('country_code', 'TW')
return country_code
class CountryAndSiteMiddleware(object):
def process_request(self, request):
request.COUNTRY_CODE = SimpleLazyObject(lambda: get_country_code(request))
Then you could use request.COUNTRY_CODE
whenever you want.