Re: [web2py] Metaprogramming in controller

2011-07-06 Thread Jonathan Lundell
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
 




Re: [web2py] Metaprogramming in controller

2011-07-06 Thread Miguel Lopes
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