Una de las razones por las que Python es una excelente opción para el desarrollo web es la variedad de marcos web disponibles en el lenguaje. Entre los más populares y útiles se encuentra Flask, que le permite comenzar de manera simple (“una gota a la vez”) pero crece con su aplicación para agregar casi todas las funciones que necesita. En este artículo, explicaremos cómo configurar y usando Flask 3.0 para aplicaciones web básicas. También abordaremos el uso de Jinja2 para crear plantillas y solucionar problemas comunes, como cambiar los tipos de respuesta y manejar redireccionamientos. Configurar FlaskFlask 3.0 es fácil de configurar. Utilice pip install flask para instalar Flask y todas sus dependencias, incluido el sistema de plantillas Jinja2. Como con cualquier marco de Python, es mejor crear un proyecto usando Flask dentro de un entorno virtual de Python. Esto aísla su proyecto de su instalación principal de Python y de otros proyectos que podrían usar Flask y sus dependencias (ya que podría encontrarse manteniendo diferentes versiones para diferentes proyectos). Tenga en cuenta que si desea instalar Flask con soporte para funciones asincrónicas o corrutinas, use el matraz de instalación pip[async]. En breve tendré más información sobre el uso de Flask con async. Una aplicación Flask básica Una aplicación Flask simple y de una ruta se puede escribir en solo unas pocas líneas de código. Guarde la siguiente aplicación de ejemplo simple en un archivo llamado app.py: from flask import Flask app = Flask(__name__) @app.route(«https://www.infoworld.com/») def home(): return «Hola , mundo» Esta aplicación no hace mucho: simplemente crea un sitio web con una única ruta que muestra «Hola, mundo» en el navegador. Esto es lo que hace cada elemento: La línea app = Flask(__name__) crea una nueva instancia de una aplicación Flask, llamada app. La clase Flask toma un argumento que es el nombre del módulo o paquete de la aplicación. Pasarlo __name__ (el nombre del módulo actual) es una forma rápida de usar el módulo actual como punto de partida de la aplicación. En teoría, puedes usar cualquier nombre, pero es habitual usar el nombre del módulo como predeterminado. El decorador app.route se utiliza para encapsular una función e indicar la función que se utilizará para entregar una respuesta para una ruta determinada. En este caso, la ruta es la raíz del sitio («https://www.infoworld.com/») y la respuesta es la cadena «Hola mundo». Para ejecutar la aplicación, use python -m flask run en el mismo directorio que app.py. Deberías ver algo como lo siguiente en la consola: * Entorno: producción ADVERTENCIA: Este es un servidor de desarrollo. No lo utilice en una implementación de producción. Utilice en su lugar un servidor WSGI de producción. * Modo de depuración: desactivado * Ejecutando en http://127.0.0.1:5000/ (Presione CTRL+C para salir) Si abre un navegador web en http://127.0.0.1:5000/, debería ver las palabras, “Hola mundo”. Tenga en cuenta que puede nombrar cualquier archivo principal de su aplicación Flask, pero llamarlo app.py permite que Flask lo reconozca automáticamente. Para usar un nombre diferente, primero debe configurar la variable de entorno FLASK_APP con el nombre del nuevo archivo menos su extensión (por ejemplo, hola para hola.py). Tenga en cuenta también que cuando ejecuta una aplicación Flask de esta manera, Vuelva a ejecutarlo utilizando el servidor de prueba integrado de Flask, que no es adecuado para implementaciones de producción. Pronto discutiremos cómo implementar Flask en producción. Las rutas y las variables de ruta en las aplicaciones FlaskWeb suelen utilizar componentes de una ruta como variables que se pasan a la función de ruta. Flask le permite hacer esto mediante una sintaxis especial de definición de ruta. En este ejemplo, donde tenemos una ruta en el formato /hola/ seguida de un nombre de usuario, el nombre se extrae y se pasa a la función como la variable nombre de usuario. @app.ruta(«/hola/«) def greet(nombre de usuario): return f»Hola, {nombre de usuario}» Visite esta ruta con /hi/Serdar y verá «Hola, Serdar» en el navegador. Tipos para variables de ruta de Flask Las variables de ruta también pueden ser de tipo -restringido, agregándoles información de tipo. Por ejemplo, si usa , eso garantiza que el ID de usuario solo será un número entero. Si utiliza , la parte de la URL desde esa posición en adelante se extraerá en la ruta de datos variable. Para ello, si tuviéramos una ruta como /mostrar/y usó la URL /show/main/info, luego main/info se pasaría en la ruta de datos variable. (Consulte la documentación de Flask para obtener más información sobre las variables de ruta con restricción de tipo). Tenga en cuenta que debe tener cuidado al utilizar múltiples rutas similares con diferentes tipos de datos. Si tienes la ruta /datos/ y la ruta /datos/, cualquier elemento en la segunda posición que no pueda coincidir como un número entero coincidirá como una cadena. Evite este tipo de estructuras de ruta si puede, ya que pueden resultar confusas y difíciles de depurar. Sea lo más claro posible con sus rutas. Los métodos de ruta en los decoradores de FlaskRoute también pueden especificar los métodos utilizados para acceder a la ruta. Puede crear múltiples funciones para manejar una sola ruta con diferentes métodos, como este: @app.route(‘/post’, métodos=[‘GET’]) def post_message_route_get(): devolver show_post_message_form() @app.route(‘/post’, métodos=[‘POST’]) def post_message_route_post(): return post_message_to_site() O puede consolidar rutas en una sola función y tomar decisiones internamente según el método: from flask import request @app.route(‘/post’, métodos=[‘GET’, ‘POST’]) def post_message_route(): if request.method == ‘POST’: return post_message_to_site() # el valor predeterminado es GET si no POST return show_post_message_form() Tenga en cuenta que necesitamos importar el objeto de solicitud global para acceder a la propiedad del método. Exploraremos esto en detalle más adelante. Flask 3.0 también le permite usar app.get y app.post como accesos directos. Las rutas anteriores también podrían expresarse como: @app.get(‘/post’) def post_message_route_get(): return show_post_message_form() @app.post(‘/post’) def post_message_route_post(): return post_message_to_site() Solicitar datos en FlaskEn la última sección, obtuvimos el método utilizado para invocar una ruta desde el objeto de solicitud global. request es una instancia del objeto Request, del cual podemos obtener muchos otros detalles sobre la solicitud: sus encabezados, cookies, datos de formulario, carga de archivos, etc. Algunas de las propiedades comunes de un objeto Request incluyen: .args: Un diccionario que contiene los parámetros de URL. Por ejemplo, una URL con argumentos como ?id=1 se expresaría como el diccionario {«id»: 1}. .cookies: un diccionario que contiene las cookies enviadas en la solicitud. .files: un diccionario que contiene los archivos cargados con la solicitud, siendo la clave para cada elemento el nombre del archivo. .form: Diccionario que contiene los datos del formulario de la solicitud, si los hubiera. .headers: los encabezados sin formato de la solicitud. .método: el método utilizado por la solicitud (por ejemplo, GET, POST). Devolver respuestas en Flask Cuando una función de ruta devuelve datos, Flask hace una mejor suposición para interpretar lo que se ha devuelto: los objetos de respuesta se devuelven tal cual. La creación de un objeto de respuesta le brinda un control detallado sobre lo que devuelve al cliente, pero para la mayoría de los casos de uso puede usar uno de los siguientes elementos. Las cadenas, incluida la salida de las plantillas Jinja2 (más sobre esto a continuación), se convierten en objetos de respuesta, con un código de estado 200 OK y un tipo MIME de texto/html. Los diccionarios se convierten a JSON. Las tuplas pueden ser cualquiera de las siguientes: (respuesta, código de estado [int]) (respuesta, encabezados [list/dict]) (respuesta, código de estado [int]encabezados [list/dict]) Generalmente, es mejor devolver lo que aclare más el trabajo de la función de ruta. Por ejemplo, un controlador de errores 404 puede devolver una tupla doble: el código de error 404 y los detalles del mensaje de error. Esto mantiene la función de ruta ordenada. Las plantillas en FlaskFlask incluyen el motor de plantillas Jinja2 para generar mediante programación resultados HTML a partir de datos. Utiliza la función render_template para generar HTML y luego pasa las variables que se usarán en la plantilla. Aquí hay un ejemplo de cómo se ve esto en una ruta: from flask import render_template @app.route(‘/hi/‘) def greet(nombre de usuario=Ninguno): return render_template(‘hello.html’, nombre de usuario=nombre de usuario) Las plantillas a las que hace referencia render_template se encuentran de forma predeterminada en un subdirectorio del directorio del proyecto Flask, llamado plantillas. Para ello, el siguiente archivo estaría en templates/hello.html:

Hola
{% si nombre de usuario %}

Hola {{ nombre de usuario }}!

{% demás %}

¡Hola, seas quien seas!

{% endif %} Las plantillas de Jinja2 son una especie de lenguaje en sí mismas, pero este fragmento debería darle una idea de cómo funcionan. Los bloques delineados con {% %} contienen lógica de plantilla y los bloques con {{ }} contienen expresiones que se insertarán en ese punto. Cuando llamamos a esta plantilla con render_template arriba, pasamos nombre de usuario como argumento de palabra clave; Se haría lo mismo con cualquier otra variable que usemos. Tenga en cuenta que las plantillas de Jinja2 tienen restricciones en el código que se puede ejecutar dentro de ellas, por razones de seguridad. Por lo tanto, querrá realizar la mayor cantidad de procesamiento posible para una página determinada antes de pasarla a una plantilla. Manejadores de errores en Flask Para crear una ruta que maneje una clase particular de error del servidor, use el decorador de errorhandler: @app.errorhandler (404) def page_not_found(error): return f»error: {error}» Para esta aplicación, cada vez que se genera un error 404, el resultado devuelto al cliente será generado por la función page_not_found. El error es la excepción generada por la aplicación, por lo que puede extraer más detalles si es necesario y pasarlos de vuelta al cliente. Ejecución y depuración de Flask en producción El servidor de prueba de Flask mencionado anteriormente en este artículo no es adecuado para implementar Flask en producción. Para implementaciones de producción, utilice un servidor totalmente compatible con WSGI, con el objeto de aplicación creado por Flask() como la aplicación WSGI. La documentación de Flask tiene detalles sobre la implementación en las opciones de alojamiento más comunes, así como detalles sobre cómo alojar aplicaciones Flask usted mismo: por ejemplo, mediante mod_wsgi de Apache o mediante uWSGI en Nginx. Uso de async en FlaskOriginalmente, Flask no tenía soporte explícito para funciones o rutinas asincrónicas. Las corrutinas ahora son una característica estándar en Python y, a partir de la versión 2.0, Flask admite métodos asíncronos para controladores de rutas. Sin embargo, el soporte asíncrono en Flask viene como un complemento, por lo que debes usar pip install flask.[async] para instalar esta función. Aquí hay un ejemplo de una ruta asíncrona de Flask: @app.route(«/embed/«) async def get_embed(embed_id): data = await async_render_embed(embed_id) return data El soporte asíncrono de Flask no cambia el hecho de que se ejecuta como una aplicación WSGI con un solo trabajador para manejar las solicitudes entrantes. Si desea admitir aplicaciones de larga duración ejecutar solicitudes como conexiones API WebSocket, usar async solo en sus funciones de ruta no será suficiente. Es posible que desee considerar el uso del marco Quart, que es compatible con API con Flask pero usa la interfaz ASGI para manejar mejor las solicitudes de larga duración y múltiples solicitudes simultáneas. Copyright © 2024 IDG Communications, Inc.

Source link