Search code examples
djangoredismiddleware

ImproperlyConfigured middleware in Django project (error importing redis function)


I'm writing a middleware for a Django app of mine where I get a variable from request.session and then have to insert it into a redis sorted set. Fairly straight forward.

I.e.

import os
#os.environ.setdefault("DJANGO_SETTINGS_MODULE","myproject.settings")
from myapp.redis_functions import set_whose_online

class WhoseOnlineMiddleware(object):
    def process_request(self, request):
        if '_auth_user_id' in request.session:
            set_whose_online(request.session['_auth_user_id'])
        else:
            pass

redis_functions.py contains all redis related functions in my app. The redis connection pool is instantiated there as well.

But this is giving me an ImporperlyConfigured error at import. The full traceback is:

Traceback (most recent call last):
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run
    self.result = application(self.environ, self.start_response)
  File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 72, in __call__
    return self.application(environ, start_response)
  File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/dj_static.py", line 83, in __call__
    return self.application(environ, start_response)
  File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 236, in __call__
    self.load_middleware()
  File "/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 53, in load_middleware
    raise exceptions.ImproperlyConfigured('Error importing middleware %s: "%s"' % (mw_module, e))
ImproperlyConfigured: Error importing middleware myproject.middleware.WhoseOnline: "cannot import name add_filtered_post"

It's perplexing because I'm not trying to import add_filtered_post, I'm trying to import set_whose_online. add_filtered_post is another function in redis_functions.py, used entirely elsewhere.

What could be possibly going on, and how can I remedy this problem? I was guessing circular imports are to blame, but python manage.py validate --traceback returns 0 errors.


Here's what I have in my settings.py:

MIDDLEWARE_CLASSES = (
    'myproject.middleware.XForwardedFor.XForwardedForMiddleware',
    'user_sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'myproject.middleware.WhoseOnline.WhoseOnlineMiddleware',
    #'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'myproject.middleware.HellBanned.HellBannedMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'mobileesp.middleware.MobileDetectionMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

Note: the middleware is added at myfolder/myproject/middleware/WhoseOnline.py, i.e the same folder as settings.py, urls, templates


Solution

  • While there could be various reasons for this to happen, in my particular case it was because of circular imports. I diagnosed and solved the problem, and this went away.