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
>>
>
>

Reply via email to