[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