First, I'd like to find out if there is a better way than thread locals to do what I want to do. From what I can tell, it isn't possible any other way. Finally, I don't understand why my thread locals implementation/hack works - which scares me, so I would like to ask the wiser gurus out there for an explanation.
Need: To alter the template path used by a custom template loader based on the the request object. Specifically I want to alter it based on the incoming domain, and sanitized cookie value allowing 'theme' selection. I have a basic theme setup using thread locals that works. in the same module/directory I have: base.py -> contains the theme objects, thread locals variable, and a couple of get/set functions that just use getattr/setattr to set a theme attribute on the local() instance. middleware.py -> contains the middleware that calls my "set theme" function loader.py-> contains the template loader which calls my "get theme" function The base setup works fine, but was written with the intention of subclassing it for another app to set the theme according to a 'site' object that gets created by another middleware (we serve multiple sites from one fastcgi instance). So I have another middleware.py file in another app that imports my ThemeMiddleware and subclasses it overriding the method returns the template path to cause the loader to look for that sites templates. This does not work. I get two different thread locals instances (print shows different addresses), despite all manipulation of the local variable happening in base.py just as it did in the working version. I've had issues in the past with thread locals working differently depending on module import method. So I stripped out the thread locals bit from base.py and put in all by itself in thread_locals.py: --- try: from threading import local except ImportError: from django.utils._threading_local import local thread_local=local() ---- Now in base.py I added 'from thread_locals import thread_local' at the top of the module, and nothing else changes. I was hoping that the same import statment (it's only imported once, in one file) would bypass the problem, but it doesn't. Next I moved the thread_locals.py file from the same directory as my other theme files to the project root, in the same location as django's settings.py. No other changes were made. It works. I should be happy, but I'm not comfortable allowing solutions I don't reasonably understand to go into production. I'd love to drop thread locals entirely, but short of that some understanding of what is happening and why would be a big help. I googled the heck out if it, but didn't find anything that fit. Thanks! -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.