[pyar] Puedo usar decoradores para esto?

Claudio Freire klaussfreire en gmail.com
Jue Jun 10 18:14:32 ART 2010


2010/6/10 Hystrix <ego en hystrix.com.ar>

> Buenas gente, que tal?
>
> Estoy haciendo un app en Django y mirando las vistas que estaba por
> escribir me di cuenta que estoy repitiendo una estructura para todas.
> Sin saber mucho del tema me pregunto, podre usar un decorador para
> eliminar la repeticion?
>
> Las vistas comparten esta estructura basica:
>
> def vista_a(request, id):
>  data = {'area': 'i'}
>  data['obj'] = get_object_or_404(modelo, pk=id)
>  #cosas propias de la vista
>  #usa cosas de data y agrega cosas a data
>  #tambien usa cosas de request
>  #aca se define el template
>  return render_to_response(template, data)
>
>
> Mi idea inicial era hacer un decorador que se ocupe de crear "data" y
> despues devolver la respuesta http con render_to_response.
> Pero no se como hacer para pasar los datos entre el decorador y la
> funcion decorada.
>

Esto podés generalizarlo a cualquier decorador que quieras implementar, es
sencillito:

import functools

def decoradorloco(f):
    # un decorador es una función que toma una función y devuelve una
función
    # functools.wraps permite que cierta metadata de la funcion se copie a
la version
    # decorada, como el nombre, docstring y demás detalles

    @functools.wraps(f)
    # en general, cuando decores, generalizar, haciendo que la funcion
decorada
    # reciba parametros extra en *p y **kw - no siempre es adecuado, pero
    # es lo mas comun
    def funcion_decorada(request, id, *p, **kw):
        # preámbulo común
        data = {'area': 'i'}
        data['obj'] = get_object_or_404(modelo, pk=id)

        # la parte específica a cada request
        # le mandamos el "data" para que lo manipule como quiera
        # pedimos que retorne un "data" modificado (si quisiera
        # devolver otro diccionario nuevo por ejemplo) y el template
        data, template = f(request, id, data, *p, **kw)

        # el epílogo común a todos
        return render_to_response(template, data)


@decoradorloco
def vista_a(request, id, data):
    #cosas propias de la vista
    #usa cosas de data y agrega cosas a data
    #tambien usa cosas de request
    #aca se define el template
    return data, template
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20100610/785ef9c9/attachment.html>


More information about the pyar mailing list