I see closures are not even necessary. The solution is using routes. For the interested routes is ok for production (the embargo was old-news). Here's some info: https://mail.google.com/mail/?shva=1#search/routes+production/12a53a18e7f6b2d5
Miguel On Wed, Jul 6, 2011 at 4:03 PM, Miguel Lopes <[email protected]> wrote: > Humm, > > Nice. Yes, closures are enough, and cleaner too. > Is routes OK for production mode? > Txs, > Miguel > > > On Wed, Jul 6, 2011 at 3:54 PM, Massimo Di Pierro < > [email protected]> wrote: > >> Jonathan is right. Here is a simple way around. >> >> Create a single controller called dynamical. use request.args(0) to >> parse the name of one of the dynamical actions and remap >> >> def dynamical(): >> actionname, request.args[:] = request.args(0), request.args[1:] >> # call actionname and pass request.args and request.vars >> >> use routes to remove the 'dynamical/' part form the URL. >> >> This allows you to do what you want without necessarily meta- >> programming. >> >> On Jul 6, 9:35 am, Miguel Lopes <[email protected]> wrote: >> > 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 <[email protected]> >> 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 >> > >

