A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

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 51

Preguntas 6

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

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 }}

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

El concepto de 鈥淓xpandir el diccionario鈥 es un Kwargs en python.
http://book.pythontips.com/en/latest/args_and_kwargs.html

You forgot that when you use a variable into an html, you need to wrap the variable in {{ variableName }}, if you don鈥檛 wrap it, it just will display the name of the variable, that鈥檚 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())```

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.

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

url_for es propio de flask o del motor jinja2

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>

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 }}

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.

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 鈥?鈥).

Existe una funci贸n nativa en python que retorna las variables del scope actual (contexto de ejecuci贸n) llamada 鈥渓ocals鈥, 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)

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

Esta muy loco!

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 鈥渢odo鈥 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(鈥榠ndex鈥) }}鈥

驴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>
>