Fundamentos de Flask
Qué aprenderás sobre Flask
¿Cómo funcionan las aplicaciones en internet?
¿Qué es Flask?
Instalación de Python, pip y virtualenv
Hello World Flask
Debugging en Flask
Request y Response
Ciclos de Request y Response
Uso de templates y archivos estáticos
Templates con Jinja 2
Estructuras de control
Herencia de templates
Include y links
Uso de archivos estáticos: imágenes
Configurar páginas de error
Extensiones de Flask
Flask Bootstrap
Configuración de Flask
Implementación de Flask-Bootstrap y Flask-WTF
Uso de método POST en Flask-WTF
Desplegar Flashes (mensajes emergentes)
Pruebas básicas con Flask-testing
Proyecto
Planteamiento del proyecto: To Do List
App Factory
Uso de Blueprints
Blueprints II
Base de datos y App Engine con Flask
Configuración de Google Cloud SDK
Configuración de proyecto en Google Cloud Platform
Implementación de Firestore
Autenticación de usuarios: Login
Autenticación de usuarios: Logout
Signup
Agregar tareas
Eliminar tareas
Editar tareas
Deploy a producción con App Engine
Conclusiones
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Bernardo Cassina
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 }}
de esta forma dependiendo de cuantos segment_details.items() haya se repetirá el código.{{ segment }}
Aportes 55
Preguntas 8
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
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']
context = {
'user_ip': user_ip,
'todos': todos,
}
return render_template
pasar el diccionario de datos **context
, se pone ** para que python itere los datos de forma automática.<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>
>
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?