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