[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