Callbacks en diferido

Uno de los principios de diseño de Flask es que los objetos de respuesta son creados y pasados por una cadena de potenciales callbacks que pueden modificarlos o reemplazarlos. Cuando se inicia la gestión de la solicitud, todavía no hay un objeto de respuesta. Se crea según sea necesario por una función de la vista o por algún otro componente del sistema.

¿Qué ocurre si se quiere modificar la respuesta en un punto en el que ésta aún no existe? Un ejemplo común para esto sería un callback before_request() que quiere establecer una cookie en el objeto de respuesta.

Una forma es evitar la situación. Muy a menudo eso es posible. Por ejemplo, puedes intentar mover esa lógica a un callback after_request() en su lugar. Sin embargo, a veces mover el código allí lo hace más complicado o incómodo de razonar.

Como alternativa, puedes usar after_this_request() para registrar callbacks que se ejecutarán sólo después de la petición actual. De esta manera puedes diferir la ejecución de código desde cualquier parte de la aplicación, basándote en la petición actual.

En cualquier momento durante una petición, podemos registrar una función para ser llamada al final de la petición. Por ejemplo puedes recordar el idioma actual del usuario en una cookie en un callback before_request():

from flask import request, after_this_request

@app.before_request
def detect_user_language():
    language = request.cookies.get('user_lang')

    if language is None:
        language = guess_language_from_request()

        # when the response exists, set a cookie with the language
        @after_this_request
        def remember_language(response):
            response.set_cookie('user_lang', language)
            return response

    g.language = language