[Web-SIG] Using decorators to add objects in a thread-local store..
Ian Bicking
ianb at colorstudy.com
Wed Jul 16 04:32:39 CEST 2008
Etienne Robillard wrote:
>
> Hi all,
>
> I'd like to have your input and comments on using decorators
> functions for adding extra options to the request.environ object.
>
> For instance, here's a decorator whichs adds a "scoped" session
> object into request.environ:
>
> def with_session(engine=None):
> """
> Decorator function for attaching a `Session` instance
> as a keyword argument in `request.environ`.
> """
> def decorator(view_func):
> def _wrapper(request, *args, **kwargs):
> scoped_session.set_session(engine)
> request.environ['_scoped_session'] = getattr(scoped_session, 'sessio
You should always use a namespace, e.g.,
request.environ['something._scoped_session'] = ...
In the context of a Pylons controller you could do it this way. Of
course with just WSGI it would be better to wrap it via WSGI, which is
almost equivalent to a decorator:
def with_session(engine=None):
def decorator(app):
def engine_wsgi_app(environ, start_response):
environ['...'] = ...
return app(environ, start_response)
return engine_wsgi_app
return decorator
Pylons controllers aren't *quite* WSGI applications, but instances of
those controller classes are. So wrapping an individual controller with
middleware requires a bit more work.
> return view_func(request, *args, **kwargs)
> return wraps(view_func)(_wrapper)
> return decorator
>
> Then it can be used as follows:
>
> @with_session(engine=engine):
> def view_blog_list(request, *args, **kwargs):
> # get the local session object for this
> # request (thread-local)
> sess = request.environ['_scoped_session']
> # do stuff with the Session object here...
> ...
>
> Is this a good approach, or can this be adapted to work
> in multithreaded environments ?
Since you are passing around arguments to functions it should be fine in
threaded environments.
--
Ian Bicking : ianb at colorstudy.com : http://blog.ianbicking.org
More information about the Web-SIG
mailing list