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.

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top