Can a thread local work? Yes.
Are they a good idea? IMHO - Generally speaking, no.
From a purely architectural point of view, it doesn't matter what you call them -- you're talking about a global variable. Any argument that holds for why global variables are bad also holds for thread locals. They make everything harder to test. They make problems harder to isolate. If you can avoid using them, you should.
The other big problem is that you need to be *really* careful. In the context of a web server, a thread can last for multiple requests. This means you need to be absolutely certainly that you're not leaking *any* state between requests -- especially user state. If you leak *any* state between requests, you run the risk of introducing a security problem, because a request made by one user can leak sensitive information (account session IDs, credentials, and so on) to another user. Of course, what gets leaked depends entirely on what you're putting in the thread local -- but if you don't put it in a thread local in the first place, it can't leak :-)
Making matters worse, the problems won't generally reveal themselves during development; it's only when you have high volume of requests and a number of different threads being reused extensively that you start to see any problems with leaking state.
So - can they be used? Yes. Django uses thread locals in a couple of places. If we had our time over (and none of the architectural constraints), would we avoid using them? Absolutely.
Yours,
Russ Magee %-)