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

Uso de método POST en Flask-WTF

18/36
Recursos

Flask acepta peticiones GET por defecto y por ende no debemos declararla en nuestras rutas.

Pero cuando necesitamos hacer una petición POST al enviar un formulario debemos declararla de la siguiente manera, como en este ejemplo:

@app.route('/platzi-post', methods=['GET', 'POST'])

Debemos declararle además de la petición que queremos, GET, ya que le estamos pasando el parámetro methods para que acepte solo y únicamente las peticiones que estamos declarando.

De esta forma, al actualizar el navegador ya podremos hacer la petición POST a nuestra ruta deseada y obtener la respuesta requerida.

Aportes 28

Preguntas 9

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Amigos para los que tienen muy claro el uso de GET y POST. Ahí les dejo unos adicionales:

Existen diferentes métodos para intercambiar información entre el cliente y el servidor. Entre los cuales se encuentran:

GET - Es mandar la información al servidor en forma de variables a través de la url.

POST - Cuando son datos especiales que no quieres que se vean en la url, se envian a través de post, que un buen número de veces se da por medio de un formulario. Tecnicámente los datos viajan a través de los headers del protocolo http.

AJAX - Asyncronus javascript and XML. Permite actualizar el body de la página sin necesidad de redirigirme a otra url. EJ: cómo cuando agrego un comentario en facebook.

SOCKETS - Intercambio de información en tiempo real. Ej: Un juego online o un chat.

Para los rebeldes (como yo) que no usamos boostrap, Y por ende, hicimos la plantilla así:

<div class="container-form">
        <form action="{{url_for('hello')}}" method="POST">
            {{login_form.username.label}}
            {{login_form.username}}
            {{login_form.password.label}}
            {{login_form.password}}
            {{login_form.submit}}
        </form>
    </div>

Esta es la configuración para que el resultado sea igual al de Bernardo.

app.config['WTF_CSRF_ENABLED']= False

Lo que pasa es que los formularios hay que cifrarlos para poder mandar la información más segura y ese proceso lo hace boostrap por defecto. Mientras que el método manual, toca tambien cifrarlo pero de forma manual.

esta bueno esto methods=[‘get’, ‘post’]

Fue a ver si estaba el link con los filtros pero no esta 😦

A ver si entendí:

  • Primero hacemos un get a ‘hello’, éste me regresa al navegador un html inicial.
  • Luego hago un post con el formulario, retorna un comando de redirección a ‘index’, con el usuario en la sesión.
  • Luego el navegador hace un request a ‘index’, optiene la ip y la guarda en la sesión. tambien me regresa al navegador una redirección a ‘hello’.
  • Finalmente renderiza el nombre de usuario y la IP.

Duda:
La sesión o la cookie siempre se envía al servidor en cualquier request que hagamos desde el cliente? sea POST o GET?

Esto se parece demasiado a php

dure como 30 hora buscanod un bug y era () eso nomas nada mas ajjaja

Por alguna razon no me sirivio poner

if login_form.validate_on_submit():

asi que lo cambie por

if request.method == 'POST':

quiza a alguien mas le sirva.

Es muy bueno saber esto ya que en un futuro me gustaría hacer una API con flask y los metodos Http son claves

Vamos avanzando

uff flask es el framework más amigable que he conocido! y super rapidoª

Uso de método POST en Flask-WTF

Podemos indicar qué métodos se usarán en las rutas.

from flask import Flask, request, make_response, redirect, render_template, session, url_for
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from wtforms.fields import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired

app = Flask(__name__)
bootstrap = Bootstrap(app)

app.config['SECRET_KEY'] = 'SUPER SECRETO'


todos = ['Comprar cafe', 'Enviar solicitud de compra', 'Entregar video a productor ']


class LoginForm(FlaskForm):
    username = StringField('Nombre de usuario', validators=[DataRequired()])
    password = PasswordField('Password', validators=[DataRequired()])
    submit = SubmitField('Enviar')


@app.errorhandler(404)
def not_found(error):
    return render_template('404.html', error=error)


@app.errorhandler(500)
def server_error(error):
    return render_template('500.html', error=error)


@app.route('/')
def index():
    user_ip = request.remote_addr

    response = make_response(redirect('/hello'))
    session['user_ip'] = user_ip

    return response


@app.route('/hello', methods=['GET', 'POST'])
def hello():
    user_ip = session.get('user_ip')
    login_form = LoginForm()
    username = session.get('username')

    context = {
        'user_ip': user_ip,
        'todos': todos,
        'login_form': login_form,
        'username': username
    }

    if login_form.validate_on_submit():
        username = login_form.username.data
        session['username'] = username

        return redirect(url_for('index'))

    return render_template('hello.html', **context)

Y mostramos la variable en el template

{% extends 'base.html' %}
{% import 'macros.html' as macros %}
{% import 'bootstrap/wtf.html' as wtf %}

{% block title %}
    {{ super() }}
    Bienvenido
{% endblock %}

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

    <div class="container">
        <!--<form action="{{ url_for('hello')}}" method="POST">-->
            <!--{{ login_form.username }}-->
            <!--{{ login_form.username.label }}-->
        <!--</form>-->
        {{ wtf.quick_form(login_form) }}
    </div>

    <ul>
        {% for todo in todos %}
            {{ macros.render_todo(todo) }}
        {% endfor %}
    </ul>
{% endblock %}

Me ha quedado bien!

Para mostrar errores de sus formularios en la terminal:

print(login_form.errors)

Por alguna razón me aparecia un KeyError en session (con el códido exacto de la clase), así es como lo solucioné.

@app.route('/hola', methods=['GET', 'POST'])
def hola():
    login_form = LoginForm()
    
    if request.method == 'GET':
        ip_usuario = session['ip_usuario']
 
        context = {
            'ip_usuario': ip_usuario,
            'productos': productos,
            'login_form': login_form
        }
        
        return render_template('hola.html', **context)
    
    if login_form.validate_on_submit():
        ip_usuario = session['ip_usuario']
        username = login_form.username.data
        session['username'] = username
        
        flash('Nombre de usuario registrado exitosamente!')
        
        context = {
            'ip_usuario': ip_usuario,
            'productos': productos,
            'login_form': login_form,
            'username': session['username']
        }

        return render_template('hola.html', **context)

Estuve como una hora buscando el error hasta que me di cuenta que puse el {% if username %} fuera del {% block content %}.
Igual esta bueno revisar el codigo y ver bien el flujo para comprender mejor que es lo que escribe uno, al final uno aprende mas de los errores.

Tuve algunos problemas con mis archivos pero gracias a la buena getion de git pude volver a retomar, Grande Git


¡Hola a todos!
Aquí les dejo el resultado de unos “ligeros cambios” que realicé al proyecto.
Principalmente separé la pantalla de login de una pantalla de bienvenida que igualmente nos muestra el nombre del usuario, su dirección Ip y unas cuantas tareas.

Solo tengo que decir, que justo tengo un proyecto de la universidad y este curso me esta salvando la vida, muy buen curso.

este curso me está gustando muchísimo de momento, flask es muy poderoso jajaja

Entendido, continuemos…

Desearía que el curso de Django tuviese esta pedagogía…

https://bootstrap-flask.readthedocs.io/en/stable/migrate.html

Este link es la migración de Bootstrap, espero que les ayude ya que cambiaron diferentes instrucciones

TIP Puedes utilizar mas metodos dentro de las variables utilizando el | por ejemplo upper lower, etc.

No nos olvidemos de poner el token dentro del form

 {{ login_form.csrf_token }}
  • Por defecto Flask acepta peticiones GET en sus route, para incluir otro tipo de peticiones, debemos incluirlas específicamente.
@app.route('/page-post', methods=['GET', 'POST'])

mas sobre Form-WTF

si el browser les devulve este error

Flask_form : CSRF Token do not match

Simplemente borren las cookies.