Willyfrog

Cargando modulos dinámicamente en la botella

Estoy algo liado montando una api para un pequeño proyecto mio, buscando que sea lo más cercano a RESTFUL por motivos laborales y por aprender cosas nuevas (entremedias estoy probando Emacs, que me esta costando un rato el cambio desde Vim).

Como framework estoy usando bottle, ya que siempre estoy usando Flask y quería probar otro distinto a ver qué tal. Y más adelante intentaré montarlo de manera asíncrona, pero eso para más adelante.

Como digo, es una primera aproximación, imagino que el código final tendrá una pinta muy diferente, pero para alguien que quiera cargar dinámicamente los módulos y tratar de ejecutar las funciones es un buen punto de partida.

 1 @route('/:module/:action')  # las rutas dinámicas están compuestas de la forma modulo/función
 2 def run_action(module,action):
 3     try:
 4         m = import_module(module)
 5     except ImportError:
 6         redirect('/404')
 7     action_call = module + '_' + action
 8 # para evitar que cualquier función del modulo pueda ser llamada, solo aquellos que comienzan por el nombre del modulo pueden ser invocados
 9     try:
10         a = getattr(m, action_call)
11     except AttributeError, e:  # diferencia entre fallo por modulo o accion
12         print "ERROR: module %s doesn't have a %s function" % (module, action_call)
13         print "ERROR: %s" % e
14         redirect('/400')
15     return a()

A este código habría que añadir el paso de parámetros, así como si hay diferenciación por método (get, post, put o delete)

Des/activando virtualenv automaticamente » « Movimiento estático