Enrutamiento

  1. @app.route(‘/’): Este es un decorador en Python que indica que la función siguiente (en este caso, index()) se asociará con la ruta de la raíz de la aplicación, es decir, cuando alguien accede a la página principal del sitio web. Cuando alguien visita la página principal, la función index() se ejecutará y devolverá la cadena ‘Index Page’.
  2. def index():: Esto define la función index(). En este caso, la función simplemente devuelve la cadena ‘Index Page’.
  3. @app.route(‘/hello’): Similar al primer decorador, este indica que la función siguiente (en este caso, hello()) se asociará con la ruta ‘/hello’. Entonces, cuando alguien accede a la URL ‘/hello’, se ejecutará la función hello().
  4. def hello():: Define la función hello(), que devuelve la cadena ‘Hello, World’.

Reglas variables

  1. from markupsafe import escape: Importa la función escape del módulo markupsafe. Esta función se utiliza para escapar caracteres especiales en HTML, lo que es importante para prevenir ataques de inyección de código (como Cross-Site Scripting, XSS).
  2. @app.route(‘/user/<username>’): Este es un decorador de ruta en Flask. Indica que la función siguiente (show_user_profile(username)) se asociará con la ruta ‘/user/<username>’, donde <username> es una variable que captura parte de la URL y la pasa como argumento a la función.
  3. def show_user_profile(username):: Define la función show_user_profile() que toma un parámetro username. Esta función devuelve una cadena formateada que incluye el nombre de usuario después de la palabra ‘User’. La función utiliza la función escape(username) para asegurarse de que el nombre de usuario esté escapado y seguro para ser renderizado en HTML.
  4. @app.route(‘/post/<int:post_id>’): Similar al primer decorador, pero esta vez, la ruta incluye <int:post_id>, indicando que post_id debe ser un entero. La función show_post(post_id) se asociará con esta ruta.
  5. def show_post(post_id):: Define la función show_post() que toma un parámetro post_id (que se espera que sea un entero). La función devuelve una cadena formateada que incluye el número de identificación del post.
  6. @app.route(‘/path/<path:subpath>’): Nuevamente, un decorador de ruta, pero esta vez con <path:subpath>, indicando que subpath puede contener barras diagonales y se captura como un solo argumento. La función show_subpath(subpath) se asociará con esta ruta.
  7. def show_subpath(subpath):: Define la función show_subpath() que toma un parámetro subpath. Esta función devuelve una cadena formateada que incluye el subpath después de la palabra ‘Subpath’. Al igual que antes, se utiliza escape(subpath) para escapar el subpath y hacerlo seguro para HTML.

Tipos de convertidores:

URL únicas/comportamiento de redireccionamiento

Ambas reglas están asociadas con funciones específicas que deben ejecutarse cuando un usuario accede a ciertas rutas en el sitio web.

  1. @app.route(‘/projects/’):
    • Esta regla de ruta está asociada con la función projects().
    • La ruta es ‘/projects/’ y tiene una barra diagonal al final.
    • Cuando un usuario accede a la URL que termina con ‘/projects/’, Flask ejecuta la función projects() y devuelve la cadena ‘The project page’.
  2. @app.route(‘/about’):
    • Esta regla de ruta está asociada con la función about().
    • La ruta es ‘/about’ y no tiene una barra diagonal al final.
    • Cuando un usuario accede a la URL que es exactamente ‘/about’ (sin barra diagonal al final), Flask ejecuta la función about() y devuelve la cadena ‘The about page’.

La diferencia fundamental entre estas dos reglas es cómo manejan la barra diagonal al final de la URL:

  • En la primera regla (‘/projects/’), la barra diagonal al final es parte de la ruta y es necesaria para que la ruta coincida. Por lo tanto, las URL como ‘/projects/’ coincidirán, pero ‘/projects’ (sin la barra diagonal al final) no coincidirán.
  • En la segunda regla (‘/about’), no hay una barra diagonal al final, por lo que Flask considerará tanto ‘/about’ como ‘/about/’ como coincidentes con esta regla. En otras palabras, es más flexible en cuanto a si la barra diagonal está presente o no.

Creacion URL

Este fragmento de código utiliza la función url_for de Flask para generar URLs de manera dinámica. La función url_for toma el nombre de la función asociada con una ruta y genera la URL correspondiente basándose en esa información.

Vamos a analizar el código paso a paso:

  1. Definición de Rutas:
    • Se han definido tres rutas usando el decorador @app.route.
    • La primera ruta es para la función index() asociada con la ruta ‘/’.
    • La segunda ruta es para la función login() asociada con la ruta ‘/login’.
    • La tercera ruta es para la función profile(username) asociada con la ruta ‘/user/<username>’.
  1. Uso de url_for:
    • Se utiliza la función url_for para generar URLs dinámicamente. Esto es útil porque si decides cambiar la URL de una ruta en el futuro, no tendrás que actualizar manualmente todos los lugares donde se usa esa URL.

with app.test_request_context():

print(url_for(‘index’))              # Genera la URL para la función ‘index’

print(url_for(‘login’))              # Genera la URL para la función ‘login’

print(url_for(‘login’, next=’/’))    x # Genera la URL para la función ‘login’ con un parámetro ‘next’

print(url_for(‘profile’, username=’John Doe’))  # Genera la URL para la función ‘profile’ con un parámetro ‘username’

  1. Resultados Impresos:
    • El bloque with app.test_request_context() crea un contexto de solicitud simulado para que url_for funcione correctamente.
    • Luego, se imprimen las URLs generadas para las diferentes funciones:
      • url_for(‘index’): Genera la URL para la función index(), que es (‘/’).
      • url_for(‘login’): Genera la URL para la función login(), que es (‘/login’).
      • url_for(‘login’, next=’/’): Genera la URL para la función login() con el parámetro adicional next, resultando en (‘/login?next=/’).
      • url_for(‘profile’, username=’John Doe’): Genera la URL para la función profile() con el parámetro username, resultando en (‘/user/John%20Doe’) (donde %20 representa un espacio URL-encoded).

Metodo HTTP:

En Flask, los métodos HTTP son utilizados para definir cómo se debe manejar una solicitud específica en función del verbo HTTP utilizado para esa solicitud. Flask proporciona decoradores de ruta para diferentes métodos HTTP. 

GET:

  • El método GET se utiliza para solicitar datos de un recurso especificado.
  • En Flask, el decorador @app.route por defecto maneja solicitudes GET si no se especifica ningún método.

POST:

  • El método POST se utiliza para enviar datos al servidor para ser procesados.
  • Puedes especificar que tu ruta debe manejar solicitudes POST usando el argumento methods.

PUT:

  • El método PUT se utiliza para actualizar un recurso existente o crear un recurso si no existe.
  • Al igual que con POST, puedes especificar que tu ruta debe manejar solicitudes PUT.

DELETE:

  • El método DELETE se utiliza para solicitar al servidor que elimine un recurso.
  • Puedes manejar solicitudes DELETE de la siguiente manera:

PATCH:

  • El método PATCH se utiliza para aplicar modificaciones parciales a un recurso.
  • Puedes manejar solicitudes PATCH de la siguiente manera:

Plantillas de renderizado

  1. Motivación para el Uso de Plantillas:
    • Generar HTML desde Python puede ser complicado y propenso a errores, especialmente en términos de seguridad.
    • Flask utiliza el motor de plantillas Jinja2 para facilitar y hacer más seguro el proceso de generación de HTML desde Python.
  2. Renderizado de Plantillas en Flask:
    • Para renderizar una plantilla, se utiliza la función render_template() de Flask.
    • La función toma el nombre de la plantilla y las variables que deseas pasar como argumentos de palabras clave.
  1. Ubicación de las Plantillas:
    • Flask busca plantillas en la carpeta llamada templates.
    • La carpeta templates debe estar en el mismo directorio que tu aplicación o dentro de tu paquete si estás organizando tu aplicación como un paquete.
  2. Ejemplo de Plantilla Jinja2:
    • Se proporciona un ejemplo de plantilla que utiliza la sintaxis de Jinja2.
    • La plantilla incluye una condición ({% if name %}) para mostrar un saludo personalizado si se proporciona un nombre, de lo contrario, mostrará un saludo predeterminado.
  1. Herencia de Plantillas:
    • Se menciona que las plantillas son especialmente útiles cuando se utilizan con herencia.
    • La herencia de plantillas permite mantener ciertos elementos en cada página, como encabezado, navegación y pie de página.
  2. Escape Automático y Seguridad:
    • Se destaca que el escape automático está habilitado en Jinja2 para evitar problemas de seguridad al generar HTML.
    • Si una variable contiene HTML y se quiere confiar en ella, se puede marcar como segura utilizando la clase Markup o el filtro |safe en la plantilla.
  3. Acceso a Objetos y Funciones en las Plantillas:
    • Se menciona que dentro de las plantillas, se tiene acceso a objetos como config, request, session, así como funciones como url_for(), get_flashed_messages(), y otros.
  4. Introducción a la Clase Markup:
    • Se proporciona una introducción básica a cómo funciona la clase Markup en el contexto de la seguridad.

Acceso a los Datos de la Solicitud en Flask:

  1. Objeto Global request:
    • En una aplicación Flask, el objeto global request proporciona información sobre la solicitud HTTP actual realizada por el cliente al servidor.
    • Este objeto request contiene detalles como la URL, los parámetros de consulta, los datos del formulario, las cabeceras, etc.

Contexto Local y Seguridad para Subprocesos:

  1. Contexto Local:
    • Flask utiliza el concepto de “contexto local” para manejar objetos globales, como el objeto request, de manera segura en entornos multihilo o concurrentes.
    • Estos objetos globales son representantes de objetos que son locales en un contexto específico, que suele ser el hilo de manejo.
  2. Ejemplo de Uso en Pruebas Unitarias:
    • En situaciones de prueba unitaria, donde no hay un contexto de solicitud real, se puede crear manualmente un objeto de solicitud y vincularlo al contexto utilizando el administrador de contexto test_request_context().
  1. Otra Posibilidad con request_context():
    • Otra opción es pasar un entorno WSGI completo al método request_context().

Resumen:

  • Flask utiliza el contexto local para manejar objetos globales como el request de manera segura en entornos concurrentes.
  • En la mayoría de los casos, los desarrolladores pueden acceder al objeto request sin preocuparse por el contexto local.
  • Para pruebas unitarias, se pueden usar administradores de contexto como test_request_context() para simular un contexto de solicitud y realizar pruebas con el objeto request.

Importar el Objeto de Solicitud:

Importar desde Flask:

  • El objeto de solicitud se importa desde el módulo flask con la siguiente línea de código:

Métodos y Atributos del Objeto de Solicitud:

Atributo method:

  • El atributo method proporciona el método HTTP de la solicitud actual (por ejemplo, GET, POST).
  • Puedes utilizar este atributo para determinar el tipo de solicitud y realizar acciones específicas en consecuencia.

Atributo form:

  • El atributo form se utiliza para acceder a los datos del formulario enviados en una solicitud POST o PUT.
  • En el ejemplo, se verifica si la solicitud es de tipo POST y se accede a los datos del formulario (request.form[‘username’] y request.form[‘password’]).

Manejo de Claves Inexistentes en form:

  • Si intentas acceder a una clave que no existe en el atributo form, se generará un KeyError especial.
  • Puedes manejar esto como un KeyError estándar, pero si no lo haces, Flask mostrará una página de error HTTP 400 Bad Request.

Atributo args:

  • El atributo args se utiliza para acceder a los parámetros enviados en la URL (por ejemplo, ?key=value).
  • Se recomienda acceder a los parámetros de URL con get o capturando KeyError porque los usuarios pueden modificar la URL.

Redirecciones con redirect:

Función redirect:

  • Para redirigir a un usuario a otro punto final, se utiliza la función redirect.
  • En el ejemplo, cuando un usuario accede al punto final ‘/’, se redirige a la ruta definida por el nombre de la función login utilizando url_for.

Función abort:

  • Para cancelar una solicitud antes de tiempo con un código de error, se utiliza la función abort.
  • En el ejemplo, cuando un usuario accede al punto final ‘/login’, se aborta la solicitud con un código de error 401 (acceso denegado).
  • Aunque este ejemplo es un tanto inútil en términos de redirección práctica, ilustra cómo funciona la función abort.

Páginas de Error Personalizadas con errorhandler:

Decorador errorhandler:

  • Para personalizar la página de error asociada a un código específico, se utiliza el decorador errorhandler.
  • En el ejemplo, se define una función para manejar errores 404 (página no encontrada).

El decorador errorhandler indica que la función manejará errores 404. La función devuelve una plantilla personalizada y establece el código de estado HTTP en 404.

Sesiones en Flask:

  • Objeto de Sesión: En Flask, además del objeto de solicitud (request), hay un objeto llamado session. Este objeto permite almacenar información específica de un usuario de una solicitud a la siguiente. Se implementa mediante cookies, y las cookies están firmadas criptográficamente.
  • Seguridad de Sesiones: La seguridad se garantiza mediante la firma criptográfica de las cookies. Esto significa que, aunque un usuario puede ver el contenido de su cookie, no puede modificarlo a menos que conozca la clave secreta utilizada para firmarla.
  • Configuración de Clave Secreta:

Ejemplo de Uso de Sesiones:

Generación de Claves Secretas: Una clave secreta debe ser aleatoria. Puedes generar rápidamente una clave secreta utilizando:

  • Nota sobre Sesiones basadas en Cookies: Flask serializa los valores en el objeto de sesión y los almacena en una cookie. Si encuentras que algunos valores no persisten en las solicitudes, verifica el tamaño de la cookie en las respuestas de tu página en comparación con el tamaño admitido por los navegadores web.
  • Sesiones en el Lado del Servidor: Además de las sesiones predeterminadas basadas en el lado del cliente, si deseas manejar sesiones en el lado del servidor, hay varias extensiones de Flask disponibles para admitir esto.
Utilitzem cookies pròpies i de tercers per millorar la teva experiència de navegació i per oferir-te continguts personalitzats. Pots obtenir més informació o configurar les teves preferències a través de la nostra Política de Cookies.   
Privacidad