Foros del Web » Programando para Internet » Python »

Modificacion de funcion a ejecutar para una url

Estas en el tema de Modificacion de funcion a ejecutar para una url en el foro de Python en Foros del Web. Hola, estoy pensando en hacer que en el proyecto que estoy haciendo con Django poder cambiar que se mostrara como inicio del web (cuando se ...
  #1 (permalink)  
Antiguo 12/10/2012, 11:09
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años
Puntos: 1
Modificacion de funcion a ejecutar para una url

Hola, estoy pensando en hacer que en el proyecto que estoy haciendo con Django poder cambiar que se mostrara como inicio del web (cuando se pone solo el host, una url / sin nada mas despues del dominio) de forma dinamica, ya que ahora mismo teng un middleware que me permite servir varios dominios ya que cambia el site_id del settings de forma dinamica segun el host por el que se hace la peticion, de modo que cada dominio pueda elegir si quiere al inicio un blog (los tengo ya a medio desarrollo, bastante avanzado), la vista propia del proyecto para esa url, u otra aplicacion, etc.

Hasta donde se, con un middleware puedo obtener, en el momento que se recivb la peticion y antes de devolver la respuesta, una variable con la funcion (vista) a utilizar, parametros, etc. Si llamo a la funcion y retorno el resultado tengo entendido que no se siguen ejecutando los midlewares que procesan lo de la funcion de la vista etc (pero si los anteriores a estos de las vistas y los siguientes de la respuesta, etc).

Si mi middleware es el ultimo se supone que ejecuto la funcion y no hay problema de que otros se queden sin ejecutarse, aun asi estoy barajando posibilidades como intenar la variable que recivo con la funcion igualarla a otra funcion, la duda es si este cambio seria solo local al metodo de mi middleware o se mantendria cuando sigan otros middlewares procesando esta etapa, ¿sabes como seria, o como modificar la funcion de la vista a ejecutar?

Si tienen otras ideas comenten, son bien recibidas. En elpeor de los casos pondria elmiddleware el ultimo siempre y ejecuto la vista que considere oportuna segun el site_id.

Tambien me preocupa si, como estas funciones no aparecen en las urls sino que son dinamicas gracias al middleware, despues podrian formar las plantillas correctamente las urls o como podria solucionar este tema.
__________________
JHG
  #2 (permalink)  
Antiguo 14/10/2012, 13:39
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Modificacion de funcion a ejecutar para una url

No entiendo muy bien, pero creo que puede desde algo muy simple como tener una lista de vistas y en tu vista home (o pagina principal) agarrar una vista al azar.

Puedes poner algo mas concreto? no entiendo mas o menos por donde va la duda.
  #3 (permalink)  
Antiguo 15/10/2012, 01:21
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años
Puntos: 1
Respuesta: Modificacion de funcion a ejecutar para una url

Cita:
Iniciado por razpeitia Ver Mensaje
Puedes poner algo mas concreto? no entiendo mas o menos por donde va la duda.
Estuve biendo como funcionanlos middlewares aqui [URL="http://www.juanjoconti.com.ar/2009/08/15/django-middleware/"]http://www.juanjoconti.com.ar/2009/08/15/django-middleware/[/URL]

Y pone:
Cita:
1) Fase Request (se llama a los métodos process_request() y process_view())
2) Fase Response (se llama a los métodos process_response() y process_exception())
Entonces para manejar la vista necesito ocuparme de process_view. Hasta ahi todo bien.

Cita:
process_view(self, request, view_func, view_args, view_kwargs)
Cita:
process_view() es llamado antes de que Django ejecute la vista. Debe retornar None o un objeto HttpResponse. Si retorna None, Django seguirá procesando el request, ejecutando otros process_view() y luego la vista apropiada. Si retorna un objeto HttpResponse, Django no hará nada más, solo retornar ese objeto.
Aqui ahora llega la cuestion, para no devolver un HttpResponse e impedir la ejecucion de otros middlewares, ¿es posible de alguna forma modificar view_func para que la ejecucion de losmiddlewares continue pero siendo otra la funcion usada como vista? Si se puede, ¿podria esto ocasionar algun problema a la ora de en las plantillas construir las URLs de os enlaces, etc?

Lo que quiero es, con un modelo desde el admin, poder definir entre una lista que yo tenga, que funcion debe ser la vista del index, y asi mostrar la que se corresponda para cada dominio como ya puedo serir varios dominios desde mi proyecto Django (el site_id un middleware lo cambia dinamicamente en la primera fase en un "process_request").

O si tienen otras ideas, comenten.
__________________
JHG
  #4 (permalink)  
Antiguo 15/10/2012, 11:34
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Modificacion de funcion a ejecutar para una url

Si, ponlo al final de la lista, así si quieres regresar None o un HttpResponse no le afecte a los otros middleware.
  #5 (permalink)  
Antiguo 16/10/2012, 04:39
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años
Puntos: 1
Respuesta: Modificacion de funcion a ejecutar para una url

Cita:
Iniciado por razpeitia Ver Mensaje
Si, ponlo al final de la lista, así si quieres regresar None o un HttpResponse no le afecte a los otros middleware.
Y siendo la funcion de la vista un objeto python, ¿no hay forma de modificarlo en mi middleware, poder devolver none y que se ejecuten otros middlewares pero reciviendo la funcion que yo modificara? Es que preferiria poder modificarla y no depender de que si o si mi middleware sea el ultimo, pues si me viese en la situación que otro middleware necesita ser el ultimo seria un dilema a resolver, y cuanto mas sencillo y menor posibilidad de error mejor, pues es un software que empezare usando yo pero quedara bajo GPL a disposición de más gente.
__________________
JHG
  #6 (permalink)  
Antiguo 16/10/2012, 13:12
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Modificacion de funcion a ejecutar para una url

Ok hasta ahora no entiendo (en un panorama global) que tratas de hacer, probablemente construir un middleware no es la mejor opción.

Por lo poco que entendí, comprendí lo siguiente:
Quieres que cuando llamen a una vista (por ejemplo la pagina principal), quieres se muestre alguna otra vista? Estoy bien?
  #7 (permalink)  
Antiguo 17/10/2012, 16:39
Avatar de jhg
jhg
 
Fecha de Ingreso: marzo-2012
Mensajes: 96
Antigüedad: 12 años
Puntos: 1
Respuesta: Modificacion de funcion a ejecutar para una url

Cita:
Iniciado por razpeitia Ver Mensaje
Ok hasta ahora no entiendo (en un panorama global) que tratas de hacer, probablemente construir un middleware no es la mejor opción.

Por lo poco que entendí, comprendí lo siguiente:
Quieres que cuando llamen a una vista (por ejemplo la pagina principal), quieres se muestre alguna otra vista? Estoy bien?
Si, xactamente,y por lo que entiendo eso se hace con un middleware (no conozco si Django tiene alguna otra cosa que me permita hacer esto mejor que un middleware). Con la opción del middleware y ponerlo el ultimo etc, llamo a la funcion que quiea y un httpresponse en vez de none y deberia funcionar, ok, todo perfecto hasta ahi. Ahora intento ir un paso más alla y mejorar esta idea planteando si seria posible la funcion que recibo en el metodo del midleware (que la recivo como un parametro, una variable que es la funcion), si en vez de ejecutarla y devulver un httpresponse podria modificar la variable de la funcion y que se ejecuten otros middlewares, ejecutando la funcion que yo quiera y he modificado al recibirla en mi middleware, o si esto no es posible y el cambio a la variable de la funcion solo endria efecto localmente en mi middleware.

EDITO:
Edito para intentar dejar lo mas claro posible el paso mas alla que intento dar:

- Django usara la funcion de vista vista1 y llama a mi middleware

Código Python:
Ver original
  1. mi_middleware(funcion):
  2.     # funcion = vista1
  3.     funcion = vista2 # o como quiera que sea para poder modificar que ejecute
  4.                               # el codigo de otra funcion y no de vista1
  5.     retur None

- continuan ejecutandose otros middlewares pero no usaran vista1 sino que ahora django usa vista2 por los cambios ue realice mi middleware

Si esto que quiero intentr no se puede pues mando un httpresponse pongo bien documentado en mayusculas ue sea el ultimo middleware si o si y listo, pero uisiera intentar hacer esto que explico de modificar la funcion, si es posible.
__________________
JHG

Última edición por jhg; 17/10/2012 a las 16:47 Razón: Mejorar explicacion
  #8 (permalink)  
Antiguo 17/10/2012, 21:01
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años
Puntos: 1360
Respuesta: Modificacion de funcion a ejecutar para una url

Te recomendaría hacer algo mucho mas sencillo como utilizar un wrapper.

Aquí un ejemplo. La función home es la vista asociada a la pagina principal y supón que foo, bar y baz son otras vistas que desearías desplegar.

Entonces si quieres mostrar una vista aleatoria, solamente creas una lista de posibles vistas que quieres mostrar y esa lista escoger una al azar.

Código Python:
Ver original
  1. from django.http import HttpResponse
  2. from random import choice
  3.  
  4.  
  5. def home(request):
  6.     list_of_views = [foo, bar, baz]
  7.     random_view = choice(list_of_views)
  8.     return random_view(request)
  9.  
  10. def foo(request):
  11.     return HttpResponse("Foo")
  12.  
  13. def bar(request):
  14.     return HttpResponse("Bar")
  15.  
  16. def baz(request):
  17.     return HttpResponse("Baz")

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:38.