Cargando



Construyendo vistas en Flask

En este tutorial vamos a explicar de una forma sencilla como podemos construir vistas en Flask utilizando dos vertientes, las vistas basadas en funciones y las vistas basadas en clases, de esta manera tendremos la posibilidad de elegir la herramienta adecuada según el caso que queramos resolver.


mar 04 2015 03:33
Profesional
dic 02 2015 12:02

Dentro del modelo o paradigma de desarrollo que propone Flask, uno de los puntos más importantes es el manejo de las vistas, ya que estas nos permiten definir la forma en la que el usuario va a tener interacción con nuestra página o aplicación.

 

La forma más sencilla de trabajar una vista es definiendo el funcionamiento directamente en la definición de la ruta de la misma, sin embargo esto no siempre es útil o adecuado, sobre todo si construimos grandes aplicaciones.

 

Requisitos
Necesitamos una instalación funcional de Flask y por motivos de compatibilidad necesitamos una versión superior a la 0.7 ya que uno de los componentes que trabajaremos no fue incluido en el framework hasta después de dicha versión. También necesitamos iniciar una aplicación o tener alguna aplicación Flask de forma que podamos incluir los ejemplos en la sección de vistas y así poder ejecutarlas por navegador.

 

Vistas basadas en funciones


Es una de las formas más simples de construir la interacción con el usuario, únicamente debemos escribir una función y decorarla con la ruta, esto hace que cuando el router de Flask reciba la petición este verifique si hay una función esperando dicha ruta, y entonces si la consigue la ejecuta.

 

Generalmente este tipo de vistas requiere de al menos el método GET de HTTP, sin embargo como buena práctica y por motivos de seguridad si lo que deseamos es agregar valores a nuestra estructura de persistencia de datos, también podemos utilizar el método POST.

 

Creando una vista con GET


Vamos a crear una vista utilizando el método GET, para ello simplemente hay que definir el nombre de la misma en una función y asignarle una ruta, luego dentro de la función colocaremos nuestro contenido, veamos el siguiente código para ilustrarnos.
@app.route('/vista-get')def vista(): valor = request.args.get('contenido', 'muestra') return 'Esta es una vista utilizando GET y recibe un valor: %s' % valor
En el código vemos entonces como utilizamos el decorator para indicar que ruta estamos esperando, definimos la función correspondiente y dentro de esta hacemos un llamado con request a los argumentos recibidos por GET, en este caso buscamos por un argumento llamado contenido y se lo asignamos a una variable llamada valor, si este argumento no existe se colocará “muestra” como valor por defecto, y por último hacemos un return de un texto y le pasamos el contenido de valor.

 

Si ejecutamos nuestro ejemplo en el navegador obtendríamos lo siguiente:

 


flask-vistas-funciones-clases.jpg

 

Creando una vista con POST


Que sucede si lo que queremos es recibir datos sensibles y no queremos pasarlos por parámetros en la URL, pues en estos casos debemos utilizar el método POST, ya que este envía los datos ocultos de la vista del usuario, por supuesto hay otras medidas de seguridad que debemos emplear pero por el momento no las necesitamos para este caso.

 

Para construir una vista que reciba datos por POST únicamente hay que indicar el método esperado en el decorator que recibe la ruta que queremos, para ello utilizamos el parámetro adicional methods.

 

Luego dentro de nuestra función podemos utilizar request para obtener los valores, sin embargo a diferencia del ejemplo anterior en vez de requerir los argumentos, debemos indicar que estamos recibiendo los valores de un formulario. Veamos el código de lo que acabamos de explicar.

@app.route('/vista-post', methods=['POST',])def vista_post(): valor = request.form.get('contenido', 'muestra') return 'Esta es una vista utilizando POST y recibe un valor: %s' % valor
Podemos notar que es casi el mismo código anterior a excepción de las diferencias ya mencionadas, pero veamos qué pasa si ejecutamos nuestro código directamente en nuestro navegador:

 


 

Cómo solo especificamos que podemos recibir el método POST, al acceder vía GET nuestra aplicación rechaza el ingreso y por tal nos envía un código 405 de método no permitido, así que sin valores que vengan de una petición POST esta vista no mostrará ninguna información.

 

Combinando GET y POST en la vista


Como manejar diferentes vistas para cada método no siempre es lo que queremos, podemos utilizar ambos métodos en una misma vista, esto es muy útil sobre todo cuando queremos procesar formularios por ejemplo, con el método GET mostramos el formulario y con POST procesamos el envío del mismo.

 

Para utilizar esta modalidad únicamente debemos añadir GET en la lista que le pasamos a methods al momento de definir el decorator con la ruta, veamos el código a continuación:

@app.route('/vista', methods=['GET','POST',])def vista(): if request.method == "GET": return ''' <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Muestra Vistas</title> </head> <body> <form method="post" action=""> <input type="text" name="contenido" placeholder="Escriba su contenido" /> </form> </body> </html> ''' else: valor = request.form.get('contenido', 'muestra') return 'Esta es una vista utilizando GET y POST que recibe un valor: %s' % valor
Al llamar a la ruta desde navegador con método GET obtenemos lo siguiente:

 


flask-vistas-funciones-clases-3.jpg

 

Luego al escribir algo en el campo de texto y presionar Enter estamos enviando el formulario a su misma ruta pero con el método POST, lo que nos da un resultado como el siguiente:

 

flask-vistas-funciones-clases-4.jpg

 

Aquí hemos escrito entonces una verdadera vista basada en funciones, que nos permite utilizar y sacar provecho a ambos métodos de HTTP para hacer nuestras operaciones.

 

Vistas basadas en clases


Como la creación de funciones a pesar de que sirven a nuestros propósitos a veces es muy engorrosa y se presta a que exista más código del necesario, Flask implementó las llamadas vistas basadas en clases, un concepto que ha tomado prestado de Django, y que nos permite escribir clases con las cuales generaremos vistas, dichas clases pueden ser genéricas con lo que podremos hacer herencia si así lo deseamos.

 

Para utilizar este tipo de componente debemos en primer lugar importar de flask.views, donde la clase View es una clase genérica que nos permitirá añadir las funcionalidades básicas para poder despachar rutas y definir métodos.

 

Creando nuestra vista basada en clases


En este ejemplo vamos a crear la misma vista que hicimos en el ejemplo anterior pero desde un enfoque basado en clases, de esta manera podremos establecer las diferencias entre ambas formas, recordemos que aunque no aparezca en el código ejemplo, hemos hecho el import de la clase View.

 

Veamos el código de nuestro ejemplo:

class VistaClase(View): methods = ['GET', 'POST',] def dispatch_request(self): if request.method == "GET": return ''' <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Muestra Vistas</title> </head> <body> <form method="post" action=""> <input type="text" name="contenido" placeholder="Escriba su contenido" /> </form> </body> </html> ''' if request.method == "POST": valor = request.form.get('contenido', 'muestra') return 'Esta es una vista utilizando GET y POST que recibe un valor: %s' % valorapp.add_url_rule( '/vista-clase', view_func=VistaClase.as_view('vista-clase'))
Esta es la forma más básica de este estilo de vistas, sin embargo vemos que ya no dependemos del decorator, lo que hacemos es llamar al método dispatch_request y le pasamos self para que reciba a su mismo objeto con ello podemos determinar las peticiones que recibamos, luego indicamos que recibiremos ambos métodos y finalmente definimos nuestros comportamientos, el resultado por navegador será el mismo que el anterior, tendremos un campo y al enviarlo recibiremos la respuesta especificada.

 

Pero, ¿Qué sucede si queremos escribir un código mucho más limpio? Para ello podemos utilizar la clase MethodView de Flask que nos permite crear métodos dentro de la clase para definir los métodos HTTP de una forma más sencilla.

 

Veamos el siguiente ejemplo donde reescribimos el código anterior para utilizar esta modalidad:

class VistaClase(MethodView): def get(self): return ''' <!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Muestra Vistas</title> </head> <body> <form method="post" action=""> <input type="text" name="contenido" placeholder="Escriba su contenido" /> </form> </body> </html> ''' def post(self): valor = request.form.get('contenido', 'muestra') return 'Esta es una vista utilizando GET y POST que recibe un valor: %s' % valorapp.add_url_rule( '/vista-clase', view_func=VistaClase.as_view('vista-clase'))
Como vemos hemos prescindido de la definición de los métodos que recibiremos, además ya no utilizamos el método dispatch, simplemente definimos lo que haremos en el método POST, y lo que haremos en el GET, dando así mucha más limpieza a nuestra vista.

 

Aún existe el debate de que si es mejor las vistas basadas en funciones o las basadas en clases, pero realmente no hay una mejor que la otra, simplemente son dos formas de trabajar, la recomendación es que si la vista es muy sencilla la podemos hacer con funciones y si ya lleva una lógica más completa la hagamos con clases.

 

Con esto hemos finalizado este tutorial, en el cual hemos construido una base importante al conocer cómo funcionan las vistas y cómo podemos trabajar con sus diferentes métodos HTTP, ya que esto es la fundación que podremos utilizar para crear aplicaciones más avanzadas.


¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X