Thanks. In conjunction with routes could supply a solution (shortening the urls). I think I should rethink the payoff (see my reply to Massimo regarding my goals). Thanks, Miguel
On Wed, Jul 6, 2011 at 3:12 PM, Jonathan Lundell <jlund...@pobox.com> wrote: > On Jul 6, 2011, at 1:23 AM, Miguel Lopes wrote: > > I'm experimenting with dynamically generating functions, aka 'actions' in > controllers. However, I've been unsuccessful. I can use exec and closures > successfully in regular Python code, but I can't make it work with web2py. > Any thoughts on how to achieve this? > > > web2py finds functions by reading the (static) controller file itself. See > gluon.compileapp.run_controller_in, in particular this line: > > exposed = regex_expose.findall(code) > > So, no dynamically generated controller actions, at least not directly. > > I haven't given this much thought, but one way you might accomplish the > same effect would be to push the dynamic function name down one level in the > URL, something like: http://domain.com/app/dynamic/index/function/... > > ...where 'dynamic' is the controller with dynamic functions, and index is a > (static) function that calls function dynamically. You might optimize the > lookup function to extract only the one desired function from your page > table. > > Depending on your overall URL structure, you could rewrite the URLs to > shorten them up. > > > A closure example - FAILS in web2py: > top_pages = db(db.page.id > 0).select() > def add_actions(top_pages): > for page in top_pages: > def inneraction(msg): > sidebar = None > return dict(message=msg, sidebar=sidebar) > inneraction.__name__ = page.link_name > globals()[page.link_name] = inneraction > > add_actions(top_pages) > > A exec example - FAILS in web2py: > > ACTION_TEMPLATE = """ > def NEW_ACTION(): > sidebar = None > return dict(message='s', sidebar=sidebar) > """ > top_pages = db(db.page.id > 0).select() > def makePages(pages): > for page in top_pages: > exec ACTION_TEMPLATE > NEW_ACTION.__name__ = page.link_name > globals()[page.link_name] = NEW_ACTION > > makePages(pages) > > Miguel > > > >