[Web-SIG] Using decorators to add objects in a thread-local store..
Etienne Robillard
robillard.etienne at gmail.com
Wed Jul 16 18:12:22 CEST 2008
On Jul 15, 4:44 pm, "Mike Orr" <sluggos... at gmail.com> wrote:
> On Tue, Jul 15, 2008 at 1:42 PM, Etienne Robillard
>
>
>
> <robillard.etie... at gmail.com> wrote:
>
> > On Mon, 14 Jul 2008 16:09:18 -0400
> > Etienne Robillard <robillard.etie... at gmail.com> 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
> >> 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 ?
>
> >> For details, you can checkout the source code of notmm, which
> >> holds the current implementation of the with_session decorator:
>
> >> $ hg clone -r tiphttp://gthc.org/projects/notmm/repo/notmm
> >> For more details about notmm, please see here:http://gthc.org/projects/notmm/
>
> >> Thanks and Regards,
>
> >> Etienne
>
> > Hi,
>
> > I'm forwarding this on pylons-discuss. I'd be interested in
> > feedback on how to integrate SQLAlchemy in Pylons. Can this
> > decorator (with_session) works on/with Pylons controllers too ?
>
> This is the "standard" way.http://wiki.pylonshq.com/display/pylonsdocs/Using+SQLAlchemy+with+Pylons
Ah yes. I forgot that document, it explains really closely what I was
trying to do
with the with_session decorator...
Some notable differences:
- myapp/model/meta.py: I just throw that stuff in a file named myapp/
config/environment.py.
- myapp/model/__init__.py : Likewise, I defined a get_model() which is
essentially a clone of init_model.
It just returns a `Table` instance for a given table_name.
> It puts a scoped session object at myapp.model.meta.Session
Interesting. To put this in constrast with the with_session object,
the only difference
I see is the place to store and retrieve the Session object.
(request.environ vs meta..)
> I suppose the decorator would work, but it's not typical for an action
> to read things directly from the environment unless it's something
> Pylons doesn't support any other way.
Well, I like refering to a web project by its name, rather than
refering to it
as a framework X project. For that reason I think 'typical' doesn't
apply here,
since supporting Pylons might not be it. I just read Pylons code for
inspiration
and technical guidance... :)
> --
> Mike Orr <sluggos... at gmail.com>
Thanks!
Etienne
More information about the Web-SIG
mailing list