Opened 7 years ago
Last modified 7 years ago
#28981 closed Cleanup/optimization
django.contrib.gis.geoip2.GeoIP2 issue when GEOIP_PATH exists but there is no MaxMind database — at Initial Version
Reported by: | Hugo Rodger-Brown | Owned by: | nobody |
---|---|---|---|
Component: | GIS | Version: | 1.11 |
Severity: | Normal | Keywords: | geoip2 maxmind GEOIP_PATH |
Cc: | Alex Stovbur | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
If a GEOIP_PATH setting is specified, but there is no database file at that location, the initialisation of GeoIP2 runs without raising an error, which is the expected behaviour. However, during this process, neither the _country
nor _city
attributes are set (as there is no database), which means in turn that the _reader
property will always return None
. The problem occurs because both the __repr__
and info
methods expect the _reader
to exist, and will fail with an AttributeError
if it is None.
The expected behaviour is that neither method will fail. The actual behaviour can be replicated below, where GEOIP_PATH is a valid directory that does not contain a MaxMind database file.
>>> import os >>> from django.contrib.gis.geoip2 import GeoIP2 >>> from django.contrib.gis.geoip2.base import GEOIP_SETTINGS >>> assert GEOIP_SETTINGS['GEOIP_PATH'] >>> assert os.path.isdir(GEOIP_SETTINGS['GEOIP_PATH']) >>> g = GeoIP2() >>> assert g._city is None >>> assert g._country is None >>> assert g._reader is None >>> print(g) # traceback truncated ---> meta = self._reader.metadata() AttributeError: 'NoneType' object has no attribute 'metadata' >>> g.info() # traceback truncated ---> meta = self._reader.metadata() AttributeError: 'NoneType' object has no attribute 'metadata'
Error occurs in https://github.com/django/django/blob/1.11.9/django/contrib/gis/geoip2/base.py
Sugggested remedy: update GeoIP2.__repr__
and GeoIP2.info
to handle _reader is None
.