Chicos, estoy teniendo problemas para entender el flujo de control en la clase python, es decir, lo que está sucediendo con el código paso a paso. Dado el siguiente código corto, me gustaría saber: cuando se llama a la clase MainPage, ¿simplemente ejecuta todo lo que está dentro de esa clase? En orden lineal? (La primera línea, después de la segunda, etc.)Problemas para comprender el flujo de control en python class (en un motor de aplicación de google)
Problemas para comprender el flujo de control en python class (en un motor de aplicación de google)
Respuesta
Cuando se ejecuta un archivo de Python, cada instrucción en el archivo se ejecuta desde la parte superior a la parte inferior. En su caso, hay seis estados:
from ..
from ..
class MainPage ..
application = ..
def main() ..
if __name__ ..
Los dos primeros se encuentran otros módulos de Python, y ejecutar todas sus declaraciones, que probablemente sólo definen un montón de clases, y luego se definen algunos nombres en el módulo utilizando valores de esos otros módulos. Entonces, después de las dos primeras declaraciones, tenemos webapp
y run_wsgi_app
definidos.
El tercer enunciado define la clase MainPage
. Lo hace ejecutando las instrucciones dentro del cuerpo de la clase, en este caso solo hay una: a def
. Tenga en cuenta que la ejecución de una declaración def
no ejecuta las instrucciones en el cuerpo de la función, simplemente recopila esas declaraciones en una función nombrada. Cuando termina el cuerpo de la clase, todos los nombres definidos se convierten en atributos de la clase.
La cuarta instrucción llama al webapp.WSGIApplication
y asigna el resultado al application
.
La quinta declaración define una función llamada main
.
La sexta declaración mira el nombre __name__
. Cada vez que se ejecuta un archivo Python, se le asigna una variable __name__
. Si el archivo es el principal que se está ejecutando, es decir, el que Python comenzó con, el valor de __name__
es "__main__"
. Esta declaración if es un modismo que significa: "¿Soy el programa principal?" En este caso, lo es, por lo que el cuerpo de la instrucción if también se ejecuta.
El cuerpo de if simplemente llama a la función main()
, que a su vez invoca la función run_wsgi_app
, pasando su valor application
ya incorporado.
Se trata de ejecutar una aplicación WSGI, pero básicamente equivale a "esperar hasta que alguien visite una URL, y luego asignar la URL a algún código y luego ejecutar el código". En su caso, proporcionó un mapa de URL que asociaba "/" con MainPage
. Una vez que alguien visita el/URL, se creará un objeto MainPage
y se invocará un método en él.
En particular, debido a que el método HTTP utilizado para visitar/se GET, el corredor de la aplicación WSGI llama al método .get()
en el objeto MainPage
. Las declaraciones en el método get
se ejecutan en secuencia, escribiendo algunos datos en la respuesta. Cuando ya no hay más declaraciones en el cuerpo de la función, regresa. ¡El contenedor de la aplicación WSGI envía esa respuesta nuevamente al navegador web!
Este programa nunca finaliza, porque el ejecutante de la aplicación WSGI siempre gira en bucle esperando la siguiente visita a la URL. Pero si no fuera así, una vez completada la última declaración en su archivo principal, el programa de Python estaría listo y el proceso finalizaría.
Gracias por su atención y excelente respuesta, Ned. Me clarificó varios otros aspectos. Pero todavía tengo una duda con respecto a esto: "Una vez que alguien visita el/URL, se creará un objeto MainPage y se invocará un método sobre él". Cuando se crea el objeto MainPage, siempre ejecutará los procedimientos dentro de ese objeto (como get, post, etc.)? – craftApprentice
La única forma en que la aplicación puede encontrar el código para ejecutar es buscando un objeto para un método. Entonces sí, siempre ejecuta un método en ese objeto. –
El código no se ejecuta linealmente.
En primer lugar, define una clase que preparará datos para una página cuando se llame a un determinado método (get
). Esta es la definición de clase de MainPage
.
Luego, registre esta clase con el sistema y también le dirá cuándo usar esta clase. Puede ver que eso sucede en el código que comienza con application = ...
. El código allí le dice al framework webapp que use MainPage
cuando la ruta URL es /
. Como puedes imaginar, puedes registrar múltiples clases para diferentes rutas aquí. Tenga en cuenta que este fragmento de código se ejecuta una vez antes de llamar al main
.
A continuación, defina el punto de entrada del programa: main()
. Es simple: le dices al framework que comience a funcionar con el application
que construiste. El código de run_wsgi_app
espera una solicitud, comprueba la ruta de URL contra las clases registradas cuando recibe una, obtiene una respuesta de la clase registrada llamando a su método get()
y envía una respuesta. Por supuesto, esto es una gran simplificación de lo que realmente está sucediendo allí.
Finalmente, llama a main en el último bloque de código.
En resumen: en primer lugar llamamos main
, que llama run_wsgi_app
, lo que crea una instancia MainPage
y llama a su método get()
utilizando la estructura application
.
Gracias, vhallac, su explicación es simple y clara. Pero, me gustaría saber: ¿por qué cuando se llama a main() y se crea el objeto (MainPage istantiated) ejecuta el método get CUANDO no hay nada que llame get, sino solo una definición de get (def get (self)) . No entiendo cómo ocurre el flujo de control aquí, porque si fuera un script de función ordinario, después de definir un procedimiento tendría que llamarlo. ¿Podría darme una explicación sobre esto? – craftApprentice
El corredor de la aplicación WSGI llama a .get() porque se utilizó el método HTTP GET para visitar el sitio. –
Gracias más una vez, Ned. Sin embargo, estoy empezando a entender lo que sucede "porque el método HTTP GET que se utilizó para visitar el sitio" todavía me resulta un poco oscuro. Pero sé que eso creo, con más ejemplos que podré entender (con otros ejemplos más allá de get(), como post()). Creo que obtener el procedimiento tiene esto llamado ocultismo, pero otros procedimientos (como post()) tendrán una llamada de función más clara. Gracias por compartir tu conocimiento y tu tiempo. – craftApprentice
- 1. proveedor de motor de aplicación google oauth2
- 2. python try/finally para control de flujo
- 3. ¿Hay '?' Control de flujo en Python?
- 4. velocity framework en el motor de la aplicación de google
- 5. sesión en el motor de la aplicación de Google
- 6. python lxml en el motor de la aplicación?
- 7. ¿Cómo puedo crear un WebSocket en el motor de aplicación de Google para HTML5
- 8. Problemas para comprender C++ `virtual`
- 9. ¿Cómo se usa numpy en el motor de la aplicación de google (Python)
- 10. Ejemplo de cuadro de texto de autocompletar en python + motor de aplicación de Google
- 11. Problemas con interfaz de flujo en C++
- 12. curl en el motor de la aplicación
- 13. https sólo en motor de aplicación de Google
- 14. problema con el autoescape de jinja2 en la aplicación del motor de aplicaciones de Google
- 15. Cómo unir 2 imágenes en el motor de la aplicación google en Java
- 16. Flujo de control de SSIS frente al flujo de datos
- 17. ¿Cómo eliminar las cookies de un usuario usando Python en el motor de la aplicación?
- 18. Control de diagrama de flujo para WPF
- 19. Comprender cómo crear un montón en Python
- 20. Comprobando si la entidad existe en el almacén de datos del motor de la aplicación google.
- 21. Motor de flujo de trabajo basado en ASP.NET
- 22. Combinar 2 imágenes con el motor de la aplicación de google y python?
- 23. Cargue el archivo .war en el motor de la aplicación Google (GAE) usando la aplicación
- 24. ¿Cómo funciona el sandbox del motor de la aplicación Google?
- 25. Cómo usar la sesión en el motor de la aplicación de Google
- 26. ¿El motor de la aplicación Google admite JDBC?
- 27. ¿Cómo sobrescribir el método put() en un modelo de motor de aplicación python?
- 28. Datos de exif de imagen en el motor de la aplicación de google
- 29. Control de flujo Ruby
- 30. Inicio de sesión con OpenID en el servidor de desarrollo local para el motor de la aplicación Google
http://webpy.org/docs/0.3/tutorial – dm03514