You can use the new thread local 'current' object. In your module file:

from gluon import *
def use_custom_view(viewname):
    [snip]
        current.response.view = '%s.%s' % (viewname, 
current.request.extension)
    [snip]

Also, note that local_import is no longer necessary -- now you can just do:

import helpers

Anthony

On Sunday, October 30, 2011 11:35:27 AM UTC-4, Samuele Santi wrote:
>
> In many cases, I find out that I can use a single view to render results
> from multiple controllers, for example, I use this to render forms::
>
>     {{left_sidebar_enabled=right_sidebar_enabled=False}}
>     {{extend 'layout.html'}}
>     <h1>{{=title}}</h1>
>     {{=form}}
>
> So I stored that view in ``default/form.html``, and I was calling that
> this way from the controller::
>
>     def my_form():
> # ...
>         response.view = 'default/form.'+request.extension
> return dict(title=mytitle, form=myform)
>
> But it doesn't look very clear at first look which controllers use which
> custom view, etc. so I decided to write a decorator to do that.
>
> I came up with this::
>
>     def use_custom_view(viewname):
>         """Decorator to be used to customize the view to be used
>         to render a given controller.
>         """
>         def _use_newcontroller(func):
>             def _newcontroller():
>                 response.view = viewname+'.'+request.extension
>                 return func()
>             return _newcontroller
>         return _use_newcontroller
>
> It works quite nicely, and so I replaced the above ``my_form()`` with
> this::
>
>     @use_custom_view('default/form')
>     def my_form():
>         # ...
>         return dict(title=mytitle, form=myform)
>
> Then, I decided to move the ``use_custom_view()`` function into a
> module, in order to reuse it in many controllers.
> So, I created a module named ``helpers`` and placed the decorator
> function there.
>
> Now the problem is: how do I access ``request`` and ``response`` from
> the module? There are many ways, as passing the two variables as
> arguments to constructor, or copying them into the module scope.
>
> I choose the second one, doing this::
>
>     helpers = local_import('helpers')
>     helpers.request = request
>     helpers.response = response
>
> But I don't like having to do this each time I import that module..
> Any suggestions on how to do better?
> And, isn't already there something like this in the core?
>
> -- 
> Samuele ~redShadow~ Santi
> ----------------------------------------------------------------
>      redshadow[at]hackzine.org - redshadowhack[at]gmail.com
>
>   Blog: http://hackzine.org
>
>   GPG Key signature:
>        050D 3E9F 6E0B 44CE C008 D1FC 166C 3C7E EB26 4933
> ----------------------------------------------------------------
> /me recommends:
>     Squadra Informatica - http://www.squadrainformatica.com
> ----------------------------------------------------------------
>  - Proud ThinkPad T-Series owner
>  - Registered Linux-User: #440008
>       * GENTOO User since 1199142000 (2008-01-01)
>       * former DEBIAN SID user
> ----------------------------------------------------------------
>       "Software is like sex: it's better when it's free!"
>                               -- Linus Torvalds
>
>

Reply via email to