Get country code/name by IP address

Using tornado and maxmind geoip2 database:

pip install tornado
pip install geoip2

Use self.country to get client country code:

import os.path

from geoip2.database import Reader as GeoIP2Reader
from tornado import options
from tornado.ioloop import IOLoop
from tornado.web import RequestHandler, Application


class BaseHandler(RequestHandler):

    # download it from maxmind site: http://dev.maxmind.com/geoip/geoip2/geolite2/
    GEOIP_BINARY = 'bin/GeoLite2-Country.mmdb'

    @property
    def country(self):
        try:
            ip = self.request.remote_ip
            geoip = getattr(self.application, '_geoip', None)
            if not geoip:
                geoip_file = os.path.join(
                    os.path.dirname(os.path.realpath(__file__)),
                    self.GEOIP_BINARY)
                geoip = GeoIP2Reader(geoip_file)
                self.application._geoip = geoip
            return geoip.country(ip).country.iso_code
        except Exception as e:
            return None


class CountryHandler(BaseHandler):

    def get(self):
        self.write(str(self.country))


if __name__ == '__main__':
    options.parse_command_line()
    application = Application(
        handlers=[
            (r'/', CountryHandler),
        ],
        debug=True,
    )
    application.listen(8000)
    IOLoop.instance().start()
Licensed under CC BY-SA 3.0