Trabajar con el Shell

Changelog

Nuevo en la versión 0.3.

Una de las razones por las que todo el mundo ama Python es el shell interactivo. Básicamente te permite ejecutar comandos de Python en tiempo real y obtener inmediatamente los resultados. Flask en sí mismo no viene con un shell interactivo, porque no requiere ninguna configuración específica por adelantado, sólo importa tu aplicación y empieza a jugar.

Sin embargo, hay algunos ayudantes útiles para hacer que jugar en el shell sea una experiencia más agradable. El principal problema con las sesiones de consola interactivas es que no estás lanzando una petición como lo hace un navegador, lo que significa que g, request y otros no están disponibles. Pero el código que quieres probar puede depender de ellos, así que ¿qué puedes hacer?

Aquí es donde algunas funciones de ayuda son útiles. Tenga en cuenta, sin embargo, que estas funciones no sólo están ahí para el uso interactivo de la shell, sino también para las pruebas unitarias y otras situaciones que requieren un contexto de solicitud falsa.

Generalmente se recomienda leer primero El contexto de la solicitud.

Interfaz de línea de comandos

A partir de Flask 0.11 la forma recomendada de trabajar con el shell es el comando flask shell que hace mucho de esto automáticamente por ti. Por ejemplo, el shell se inicializa automáticamente con un contexto de aplicación cargado.

Para más información, véase Interfaz de línea de comandos.

Creación de un contexto de solicitud

La forma más sencilla de crear un contexto de petición adecuado desde el shell es utilizando el método test_request_context que nos crea un RequestContext:

>>> ctx = app.test_request_context()

Normalmente se usaría la sentencia with para activar este objeto de petición, pero en el shell es más fácil usar los métodos push() y pop() a mano:

>>> ctx.push()

A partir de ese momento se puede trabajar con el objeto request hasta que se llame a pop:

>>> ctx.pop()

Petición de disparo antes/después

Al crear simplemente un contexto de petición, todavía no has ejecutado el código que normalmente se ejecuta antes de una petición. Esto puede resultar en que su base de datos no esté disponible si se está conectando a la base de datos en un callback antes de la petición o que el usuario actual no se almacene en el objeto g etc.

Sin embargo, esto se puede hacer fácilmente. Simplemente llama a preprocess_request():

>>> ctx = app.test_request_context()
>>> ctx.push()
>>> app.preprocess_request()

Ten en cuenta que la función preprocess_request() puede devolver un objeto respuesta, en ese caso simplemente ignórala.

Para cerrar una solicitud, es necesario engañar un poco antes de que las funciones posteriores a la solicitud (activadas por process_response()) operen sobre un objeto de respuesta:

>>> app.process_response(app.response_class())
<Response 0 bytes [200 OK]>
>>> ctx.pop()

Las funciones registradas como teardown_request() son llamadas automáticamente cuando el contexto es desalojado. Por lo tanto, este es el lugar perfecto para derribar automáticamente los recursos que fueron necesarios por el contexto de la solicitud (como las conexiones a la base de datos).

Mejorar aún más la experiencia de Shell

Si te gusta la idea de experimentar en un shell, crea tú mismo un módulo con cosas que quieras importar de forma estelar en tu sesión interactiva. Allí también podrías definir algunos métodos más de ayuda para cosas comunes como la inicialización de la base de datos, la eliminación de tablas, etc.

Sólo hay que ponerlos en un módulo (como shelltools) e importarlos desde allí:

>>> from shelltools import *