Как получить местоположение по IP?
Не всё так просто, особенно с мобильным интернетом. Я, например, нахожусь в Брянске, и если сижу с мобилы, мой ip московский. Давно уже перевалили за 50% по мобильному трафику, поэтому в большинстве случаев geo по ip определяется не точно. Конечно в массштабах стран всё - ок. 
Если отвечать конкретно на Ваш вопрос, то базы maxmind в помощь. У них есть платные и бесплатные.
Используйте https://github.com/maxmind/GeoIP2-python
Его можно локально использовать, без запросов к стороннему APIspoiler>>> import geoip2.database
>>>
>>> # This creates a Reader object. You should use the same object
>>> # across multiple requests as creation of it is expensive.
>>> reader = geoip2.database.Reader('/path/to/GeoLite2-City.mmdb')
>>>
>>> # Replace "city" with the method corresponding to the database
>>> # that you are using, e.g., "country".
>>> response = reader.city('128.101.101.101')
>>>
>>> response.country.iso_code
'US'
>>> response.country.name
'United States'
>>> response.country.names['zh-CN']
u'美国'
>>>
>>> response.subdivisions.most_specific.name
'Minnesota'
>>> response.subdivisions.most_specific.iso_code
'MN'
>>>
>>> response.city.name
'Minneapolis'
>>>
>>> response.postal.code
'55455'
>>>
>>> response.location.latitude
44.9733
>>> response.location.longitude
-93.2323
>>> reader.close()
Данный модуль встроен в Django https://docs.djangoproject.com/en/2.2/ref/contrib/...spoiler>>> from django.contrib.gis.geoip2 import GeoIP2
>>> g = GeoIP2()
>>> g.country('google.com')
{'country_code': 'US', 'country_name': 'United States'}
>>> g.city('72.14.207.99')
{'city': 'Mountain View',
'country_code': 'US',
'country_name': 'United States',
'dma_code': 807,
'latitude': 37.419200897216797,
'longitude': -122.05740356445312,
'postal_code': '94043',
'region': 'CA'}
>>> g.lat_lon('salon.com')
(39.0437, -77.4875)
>>> g.lon_lat('uh.edu')
(-95.4342, 29.834)
>>> g.geos('24.124.1.80').wkt
'POINT (-97 38)'