This is working great! It's exactly what I needed, and makes my code much 
simpler.

Thank you very much! I love it!

On Friday, May 11, 2012 5:03:51 AM UTC-7, Anthony wrote:
>
> Or to avoid a redirect, you can change the function and controller in a 
> model file:
>
> db = DAL(...)
>
> if request.function == 'dispatch':
>     request.controller, request.function = [fetch from db]
>     response.view = '%s/%s.%s' % (request.controller, request.function,request
> .extension)
>     response.generic_patterns = ['html']  # to enable the generic.html 
> view if needed
>
> Anthony
>
> On Friday, May 11, 2012 6:07:56 AM UTC-4, simon wrote:
>>
>> You can do:
>>
>> def dispatch():
>>     controller,function = ... load these from the database ...
>>         redirect(URL(c=controller, f=function, vars=request.vars, 
>> args=request.args))
>>
>>
>> On Friday, 11 May 2012 10:17:19 UTC+1, Michael Toomim wrote:
>>>
>>> I need to be able to dispatch to a different controller based on a 
>>> database lookup. So a user will go to a url (say '/dispatch'), and we'll 
>>> look up in the database some information on that user, choose a new 
>>> controller and function, and call that controller and function with its 
>>> view.
>>>
>>> I've almost got this working below, but the models are not being loaded 
>>> into the new controller. Is there a way to fix that?
>>>
>>> In default.py:
>>> def dispatch():
>>>     controller,function = ... load these from the database ...
>>>     response.view = '%s/%s.html' % (controller,
>>>                                     function)
>>>     
>>>     if not os.path.exists(request.folder + '/views/' + response.view):
>>>         response.view = 'generic.html'
>>>
>>>     from gluon.shell import exec_environment 
>>>     controller = exec_environment('%s/controllers/%s.py'
>>>                                   % (request.folder,
>>>                                      controller),
>>>                                   request=request,
>>>                                   response=response,
>>>                                   session=session)
>>>     return controller[request.task_function]()
>>>
>>> Unfortunately, the controller being called has access to request, 
>>> response, and session, but none of the global variables defined in my 
>>> models. Is there a way to get exec_environment() to run a function in 
>>> another controller WITHOUT losing all the model definitions?
>>>
>>> Or is there a better way to do this?
>>>
>>

Reply via email to