I think that the correct solution for your problem would be, instead of
hacking around with the template path on the fly like this, to instead write
a template loader for your application, and apply the logic you need within
the template loader itself.

See:
http://docs.djangoproject.com/en/dev/ref/templates/api/#loading-templatesand
http://code.djangoproject.com/browser/django/trunk/django/template/loader.pyfor
details.

- Craig -

On Wed, Dec 15, 2010 at 18:30, Doug Ballance <dball...@gmail.com> wrote:

> 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<django-users%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/django-users?hl=en.
>
>

-- 
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.

Reply via email to