Django application to handle IP-based geolocation
Project description
mitol-django-geoip
geoip
provides IP geolocation services. At its core, it allows you to pass a
client's IP address to it, and it will send you back a good estimation of what
country the client belongs to.
Specifically, this wraps lookup around using a local copy of the MaxMind GeoIP2/GeoLite2 data. This choice was made to avoid having to hit an API during checkout operations, where doing so may end up blocking the client for an unknown amount of time.
The geoip
app provides lookup for a user's country code only so, while you can
use datasets that contain more granular location data in them, you'll still only
get back the country ISO code from the API in this app.
Setup
The MaxMind geolocation databases are provided in two forms:
- The GeoLite2 database is free.
- The GeoIP2 database is not free - a subscription fee applies.
Which one you need will depend on your use case - however, if your intent is only to use the dataset with this app, the GeoLite2 database is sufficient.
In both cases, you will need the CSV format versions of the databases. You have the option of downloading the ASN, City, or Country versions of the database. For the purposes of this app, the Country version is sufficient; if you plan on using the MaxMind data elsewhere in your project and need more granular location data, you can use the City version instead. The ASN database is not supported and can be skipped unless you have a specific need for it.
The downloaded datasets include the network block information in two CSV files -
one each for IPv4 and IPv6 network blocks - and the location data in a variety
of languages. The English language en
one is required by the app but you can
import any others that you require.
After installing the app into your Django project in the normal way, you should
have a management command called import_maxmind_data
available to you. Run
this command to import the data from the CSV file you downloaded. You must
import the IPv4 netblock file and the English langauge location file but it is
recommended to import the IPv6 netblock file as well, especially if your app
will be capable of serving IPv6 clients.
Working Locally
If you're working locally, the API will never return a country code. The MaxMind datasets don't include the private network blocks in them as they don't really map to anything, so there's no match for any of the private network IPs.
If you'd like these IPs to match something, you can add that data by running the
create_private_maxmind_data
command. This will create a set of fake netblock
records for the 3 private network blocks available:
- 10.0.0.0/24
- 172.16.0.0/12 (172.16.0.0-172.31.255.255)
- 192.168.0.0/16
You can specify what ISO code you wish to assign to these as well. Running the command again will allow you to re-assign the ISO code.
Note that there is no IPv6 block specified because there are no private IPv6 network addresses (in the same way that there are IPv4 ones).
Usage
Import ip_to_country_code
from api
and call it with the IP address you've
collected from the client. This will return the ISO 3166 alpha2 country code
that the IP belongs to, or None if there isn't one. (See note under Working
Locally above for important information about private IPv4 network blocks.)
Updating
MaxMind updates the GeoIP2 and GeoLite2 datasets on a regular schedule. You can
update the databases by rerunning the import_maxmind_data
using newly
downloaded copies of the dataset.
MaxMind does provide a method for downloading the dataset programmatically - in
the downloads section in your account, you can click Get Permalink for the
data files you want. You can then update the link with your API key and write a
task to download and then ingest the files. If you're writing this as a task
from within your Django app (i.e. a Celery task), you can directly call the
import_maxmind_database
to do the heavy lifting once the dataset is
downloaded. See the MaxMind developer portal to find the dates when the datasets
are refreshed.
The import command is idempotent.
Caveats
Note that IP blocks may be reassigned or otherwise move between places for any reason, so the location that is resolved using a specific IP at one point in time may resolve to a different location in the future. You should design your app to store the resolved country code at the time of query if you need to refer to that data later.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file mitol-django-geoip-2023.12.19.1.tar.gz
.
File metadata
- Download URL: mitol-django-geoip-2023.12.19.1.tar.gz
- Upload date:
- Size: 12.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cfe10e9d0196bc8aca33a1cb9709e1264d956bff35e8716add78fc1ccbe455c7 |
|
MD5 | 49e6eed1536724bea5ec1bfd6c41d764 |
|
BLAKE2b-256 | f7f3ac777324a8966c5144683cac0ae0ab9cf2722fce4d3ea31f6d03ab1d8493 |
File details
Details for the file mitol_django_geoip-2023.12.19.1-py3-none-any.whl
.
File metadata
- Download URL: mitol_django_geoip-2023.12.19.1-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e1c4367848237d184e13aa450ce1f3bbbdfd8ebc226f277be825f48cc80ed144 |
|
MD5 | 94a7496a2d5cf2232cd8168bfea6d227 |
|
BLAKE2b-256 | bffbc72370856b5a5840702b600372dbf958627978b08bf794b73b237bae8a71 |