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 : [EMAIL PROTECTED] : http://blog.ianbicking.org
_______________________________________________
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe: 
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com

Reply via email to