No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Flask

Curso de Flask

Bernardo Cassina

Bernardo Cassina

Estructuras de control

10/36
Recursos

Iteración: es la repetición de un segmento de código dentro de un programa de computadora. Puede usarse tanto como un término genérico (como sinónimo de repetición), así como para describir una forma específica de repetición con un estado mutable.

Un ejemplo de iteración sería el siguiente:

{% for key, segment in segment_details.items() %}
        <tr>
                <td>{{ key }}td>
                <td>{{ segment }}td>
        tr>
{% endfor %}  

En este ejemplo estamos iterando por cada segment_details.items() para mostrar los campos en una tabla {{ key }} {{ segment }} de esta forma dependiendo de cuantos segment_details.items() haya se repetirá el código.

Aportes 55

Preguntas 8

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Creo que literalmente imprimiste "todo", y no era lo que querías. Para usar la variable todo en el for, debes poner {{ todo }}

Al profesor se le pasó los brackets en el for loop. Por esa razón, la salida por pantalla fue:
todo
todo
todo

En el for loop, exactamente en hello.html, es:
{{ todo }}

El concepto de “Expandir el diccionario” es un Kwargs en python.
http://book.pythontips.com/en/latest/args_and_kwargs.html

La verdad me está gustando mucho más Flask que Django. Evidentemente es por el tipo de pedagogía impartida.

You forgot that when you use a variable into an html, you need to wrap the variable in {{ variableName }}, if you don’t wrap it, it just will display the name of the variable, that’s why the program is printing
-todo
-todo
-todo
instead of:
-TODO 1
-TODO 2
-TODO 3

A las personas que en vez de salir el mensaje

  • TODO 1
  • TODO 2
  • TODO 3

eso es por que en vez de poner <li> {{todo}} </li> han puesto <li> todo </li>

lo único que hace ese for es imprimir en pantalla la CADENA todo, en vez de imprimir el iterador todo

main.py

from flask import Flask, request, make_response, redirect, render_template


app = Flask(__name__)

todos = ['TODO 1', 'TODO 2', 'TODO 3']

@app.route('/')
def index():

    user_ip = request.remote_addr
    make = redirect('/hello')
    response = make_response(make)
    response.set_cookie('user_ip', user_ip)

    return response

@app.route('/hello')
def hello():    
    
    user_ip = request.cookies.get('user_ip')
    render = render_template(
        'hello.html', 
        user_ip=user_ip, 
        todos=todos
    )

    return render

if __name__ == "__main__":
    
    app.run(debug=True)

hello.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>

    <body>
        {% if user_ip %}
            <h1>Hola Mundo, soy la ip: {{user_ip}} </h1>
        {% else %}
            <a href=" {{ url_for('index') }} "> Ir al inicio de la pagina </a>
        {% endif %}

        <ul>
            {% for todo in todos %}
                <li> {{todo}} </li>
            {% endfor %}
        </ul>       

    </body>
</html>

Para pasar variables, podemos utilizar la funcion de python locals() que nos trae todas las variables de el contexto actual.


Los asteriscos se deben a que locals() nos regresa un dict con las variables del contexto, pero render_template solo resive un argumento, asi que pasamos el diccionario con key y values en forma de argumentos opcionales. 

Esto es util cuando empezamos a tener muchos datos en el entorno.

return render_template('hello.htmrno. l', **locals())```

Apuntes

Para esta clase se aprendio a trabajar con estructuras de control y for loops en los templates.

  • Para utilizar if y else en templates se tiene que encerrar entre llaves y signos de %.

    {% if user_ip %}
    
    <h1>Hello World Platzi, tu IP es {{ user_ip }}</h1>
    {% else %}
    <a href="{{ url_for('index') }}">Ir a inicio</a>
    {% endif %}
    
  • Escribir la ruta {{ url_for('index') }} en la etiqueta <a> del else

  • Borrar las cookies con developer tools de Google Chrome para comprobar que esta funcionando.

  • Se creo la variable TODOS

todos = ['TODO 1', 'TODO 2', 'TODO 3']
  • Se creo un diccionario de datos llamado context
context = {
        'user_ip': user_ip,
        'todos': todos,
    }
  • En return render_template pasar el diccionario de datos **context, se pone ** para que python itere los datos de forma automática.
  • Crear una lista para iterar los datos de la variable todo
<ul>
    {% for todo in todos %}
    <li>{{todo}}</li>
    {% endfor %}
</ul>

Excelente clase, pero creo que te falto poner {{ }} en todo para que te imprimiera el listado, porque lo que lograste fue simplemente imprimir varias veces la palabra Todo.

un saludo.

url_for es propio de flask o del motor jinja2

Interesante esta clase les comparto este blog que habla sobre como manejar plantillas jinja2 con flask

Por si quieren obtener el índice del elemento ->

<ul>
    {% for todo in todos %}
        <li>{{ todo }} Índice del elemento -> {{ loop.index }}</li>
    {% endfor %}
</ul>

Como complemento del metodo url_for, este permite componer una URL a partir del nombre de una vista. Esta función acepta como parámetros el nombre de una vista y un número variable de argumentos clave-valor, cada uno de ellos asociado a una parte variable de la URL. Si se pasa un argumento cuyo nombre no se corresponde con un parámetro de la parte variable, se añade a la URL como parte de la query string (la sección de la URL que viene tras el carácter ‘?’).

Flask provee un variableurl_for() para cada template, esto nos permite encontrar una ruta por el nombre de una función.
Todos los bloques deben tener un fin.
Declarar una variable {{ variable }}

Para poder ver los elementos de la lista

<ul>
      {% for todo in todos %}
      <li>{{ todo }}</li>
      {% endfor %}
    </ul>

Esta muy loco!

La sintaxis que se usa en html para flask es semejante a Django

Una pequeña correción en el for loop

<ul>
    {% for i in todos %}
        <li>{{i}}</li>
    {% endfor %}
</ul>

Excelente, me agrado mucho la forma que utiliza Python para extender los diccionarios.

Hola Comunidad.
.
Vaya que potente la aplicación de Kwargs para pasar los items de la lista sin necesidad de asociarla al nombre del contenedor.
.
Si desean leer un poco más para comprender o dar más contexto a lo que hizo el profesor les recomiendo este enlace.
.
Y, para ver una serie de ejemplos bien detallados les recomiendo este otro enlace.
.
Ojalá les sirva.
.
¡Saludos!

Estoy tomando el curso de Django y Flask al mismo tiempo, la verdad, aunque me gustan ambas, prefiero enfocarme en flask, soy principiante en la web (y programacion en general) y no puedo agarrar el hilo de Django al 100%. Tal vez luego de aprender Flask pueda entrar de lleno a Django.

Existe una función nativa en python que retorna las variables del scope actual (contexto de ejecución) llamada “locals”, si se usa con el debido respeto y cuidado, resulta más como y limpio a la hora de pasar contexto al render_template, ya que con solo solo declarar la variable automáticamente entra en el contexto.

def home():
    user_ip = request.cookies.get(const.COOKIE_NAME_USER_IP)
    if user_ip is None:
        return make_response(redirect('/session', 302))
    # locals() == {'user_ip': '127.0.0.1'}
    some_var_name = ':v'
    # locals() == {'user_ip': '127.0.0.1', 'some_var_name': ':v'}
    other_var_name = ':d'
    # locals() == {'user_ip': '127.0.0.1', 'some_var_name': ':v', 'other_va..'}
    return render_template('home.html', **locals())


def home_v2():
    context = dict()
    user_ip = request.cookies.get(const.COOKIE_NAME_USER_IP)
    if user_ip is None:
        return make_response(redirect('/session', 302))
    some_var_name = ':v'
    other_var_name = ':d'

    context['user_ip'] = user_ip
    context['some_var_name'] = some_var_name
    context['other_var_name'] = other_var_name
    return render_template('home.html', **context)

** antes de una lista expande las variables o las desestructura, por lo tanto ya no se envian como parametros, sino que se envian como variables

context = {
        'user_ip': user_ip,
        'todos': todos
    }
    return render_template('hello.html', **context)

Referencia de la syntaxis que usa el profe Liquid
Liquid is an open-source template language created by Shopify and written in Ruby. It is the backbone of Shopify themes and is used to load dynamic content on storefronts.

Siempre utilizar el % endif % Porque sino Flask lanza un error.

Buenísima, muy buen clase!!!

Hay un pequeño error en la parte de iterar los datos de la lista todos tiene que ir entre llaves {{todo}}

<ul>
        {% for todo in todos %}
            <li>{{todo}}</li>
        {% endfor %}
</ul>

creo que te saltas mucho la teoria y lo haces de frente en mi opinion tal vez seria mejor explicar cada cosa a detalle y mas pausado ,solo es un consejo igual gracias por el curso!!

ndex.html

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Tutorial Flask: Miniblog</title>
</head>
<body>
    {{ num_posts }} posts
</body>
</html>

post_view.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{ slug_title }}</title>
</head>
<body>
    Mostrando el post {{ slug_title }}
</body>
</html>

post_form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        {% if post_id %}
            Modificando el post {{ post_id }}
        {% else %}
            Nuevo post
        {% endif %}
    </title>
</head>
<body>
{% if post_id %}
    Modificando el post {{ post_id }}
{% else %}
    Nuevo post
{% endif %}
</body>
</html>

el ciclo debería haber impreso los valores de la lista en vez de “todo” 3 veces

El curso es bastante flojo, me tocó estudiar por mi cuenta muchas cosas que no hacen parte de la línea de aprendizaje para entender muchas cosas que hace.
Lo triste es que es un tema muy interesante y necesario pero el profesor lo hace muy complicado, en especial porque no explica la razón detrás de las cosas que hace.

Me encanto el truco de los kwargs

Al pasar un diccionario como kwarg con ** python convierte cada variable que esté en su interor en variables individuales, sin estar dentro de un diccionario, como si las escribieramos en los argumentos una 👍

Para poder usar visual studio code con dos columnas:
Ingles:
View - Edit Layout - Two Colums
Español:
Ver - Editar Diseño - Dos Columnas
Espero les sirva.

Este es el código para que recorra el array.

<ul>
        {% for todo in todos %}
            <li>{{todo}}</li>
        {% endfor %}
</ul>

Aunque ya lo mencionaron, el todo que esta dentro del for, no es el valor de la variable, sino texto en HTML, aunque ya había mencionado que para incrustar una variable era con doble llave {{ variable }}, hasta el momento si he entendido.

Lo correcto es:

<ul>
    {% for todo in todos %}
        <li>{{todo}}</li>
    {% endfor %}
</ul>

Genial el contenido es preciso .

En esta parte de la clase habla de una funcionalidad de python que son los **kwargs que es una forma fancy de pasar argumentos.

Tal como lo han comentado otros compañeros al momento de escribir el ciclo for el profesor cometió un error pero esto se soluciona escribiendo {{ todo }} declarando que es una variable

<ul>
{% for todo in todos %}
    <li>{{ todo }}</li>
{% endfor %}
</ul>

Buenas las facilidades que tiene Python para desarrollar

Dentro de un context tambien s epueden pasar listas o tuplas? O solo una llave puede contener una variable?

Muy bueno el curso

{ % if condición % } : Estructuras de control dentro de un template.

Me parece interesante el poder crear html de forma programática!

Muy interesante

¿Cómo establecer estructuras de control?

{% if <nombre de la condición> %}

{% else %}

{% endif %}

Flask, para los templates pone disponible una variable url_for. Ésta nos permite encontrar una ruta específica simplemente con mandar el nombre de la función que pertenece a la ruta.

href = “{{ url_for(‘index’) }}”

¿Cómo crear una variable iterativa?

<variable> = [<lista, , , ]

muy interesante

{% if user_ip %}
    <h1>Hello World Platzi, tu IP es{{ user_ip }}</h1>
{% else %}
    <a href="{{url_for('index')}}">Ir a inicio</a>
{% endif %}

<ul>
    {% for todo in todos %}
        <li>{{todo}}</li>
    {% endfor %}
</ul>

Para que se impriman los elementos de la lista seria algo asi:

{% if user_ip %}
    <h1>Hello World Platzi, tu IP es {{ user_ip }}</h1>
{% else %}
    <a href="{{ url_for('index') }}">Ir a inicio </a>
{% endif %}

<ul>
    {% for todo in todos %}
        <li>{{ todo }}</li>
    {% endfor %}
</ul>

Viniendo de PHP donde se trabaja directamente sobre el archivo y lo hace super facil, pense que el utilizar Python + Flask iba a ser mas complicado pero es bastante parecido y sobretodo muy agil! Excelente.

Para indicar comentario en el html aplicando jinja2 , se usa esto :

{# _comentario_#} 

Genial, entonces usamos {{ }} para imprimir el valor de las variables o funciones de python en html.

Por si tenéis problemas

<
    <ul>
    {% for todo in todos %}
        <li>{{todo}}</li>
    {% endfor %}
    </ul>
>