Рубрики
Без рубрики

TU Primer Web App Con Flask: Parte 3

TAL COMO LO PROMETI, HOY ESTAREMOS Viendo Cosas Intersantes: Manejo de formularios y persistencia de … помечен с python, колбой, webdev, backend.

TU Primer Web App Con Flask (4 части серии)

TAL COMO LO PROMETI, HOY ESTAREMOS Viendo Cosas Intersantes: Manejo de formulios y persistencia de datos en una bd.

Manejando Formulios.

Уна Pregunta Que Te Habr Hecho Es, ¿Cual Es El Chiste de Manejar Formulios Con Otra Cosa Que Нет моря HTML?

Bueno, Eso Se debe que hacerlo de forma tradicional, requiere que protejamos de forma “Casera” LOS вход de nuestros formulios (TE Recomiendo Leer Sobre CSRF).

WTForms Es Una Integracion Simple de Flask que intruye entre sus caracteristalas:

  • Процектор Conta CSRF.
  • Subida de Archivos.
  • Сопорт Пара recaptcha.
  • Интернационализация
  • Y MAS !!

Para Instalarlo:

pip install Flask-WTF

Ahora Es Tiempo de ModelArlos!

Vas Crage Directionalio Llamado ‘Forms’ Forms ‘y un archivo’ formularioestudiantes.py ‘dondeiremos la estructura del formulio:

from flask_wtf import FlaskForm
from wtforms.validators import DataRequired
from wtforms import StringField, SubmitField
from wtforms.fields.html5 import IntegerField, EmailField
from wtforms.widgets.html5 import NumberInput 

class FormularioEstudiantes(FlaskForm):
    nombre = StringField('Nombre', validators=[DataRequired()])
    calificacion = IntegerField('Calificacion', validators=[DataRequired()], widget=NumberInput(min=0, max=10, step=1))
    email = EmailField('Direccion de correo electronico', validators=[DataRequired()])
    submit = SubmitField('Registrar')

COMO PodeMos Ver, Conforms Podemos Controlar El Tipo de Dato, LAS Validaciones и т. Д. Que recibimos desde el Cliente.

Ahora Debemos de Importarlo En Nuestra Aplicacion:

from forms.FormularioEstudiantes import FormularioEstudiantes

Y Haremos UNAS модификации a lo que ya tenemos.

Crowsos Una Secret_key, Necesaria Para El Token de CSRF:

app.secret_key = 'Coloca aca tu clave secreta'

La Ruta de Registro Ahora Se verá asi:

@app.route('/registro/', methods=['GET', 'POST'])
def registro():
    if request.method == 'POST':

        formulario = FormularioEstudiantes(request.form)

        alumnos.append({
            "nombre": formulario.nombre,
            "calificacion": formulario.calificacion,
            "email": formulario.email,
        })

        return redirect(url_for('index'))
    else:
        formulario = FormularioEstudiantes()
    return render_template('registro_alumno.html', formulario=formulario)

Es necesario que le pasemos el formulio a nuestra vista para que asta pueda mastrarlo.

Si La Petication Viene POR POST, Quiere Decir Que desde El Cliente Se Sefiono El Boton «Регистратор», Пор Ло Кин Дебернация Venir Contos. Es por eello que incizamos el mismo con la data contenida ru Запрос.

Si La Petication Viene Por Get, Conlity Aque el Cliente Esta Intentando Acceder A La Ruta Para Poder Регистрация ООН Alumno. POR LO Que EL Formulio Iria Vacio (EN ESTE CASO NO LE PASAMOS NINGUN PARMETRO EN LA INSTANCIA)

Ha Llegado El Turno de Modififar Tambien El HTML, Que Es Donde Debemos de “Dibujar” Nuestro Formulio:

Una de las formas de hacerlo, es esta:

{{formulario.csrf_token}} {{ formulario.nombre.label() }} {{formulario.nombre()}}
{{ formulario.calificacion.label() }} {{formulario.calificacion()}}
{{ formulario.email.label() }} {{formulario.email()}}
{{ formulario.submit()}}

La Segunda Forma ES:

{{formulario.csrf_token}} {% for campo in formulario %} {{campo.label() }}{{campo()}}
{% endfor %}

La Eleccion Es Tuya.

WTForms Nos Provise Tambien de Validaciones Con Sus Consistizes сообщает об ошибателях de “. Para Mastrarlos Solo Debemos Colocar Lo Siguiente:

{% for campo, errores in form.errors.items() %}
    
{{ form[campo].label }}: {{ ', '.join(errores) }}
{% endfor %}

AL EJECUTAR NUESTRA APP Y VERICITAR EL CODIGO HTML, DEBERIAMOS VER ALGO ASI:

COMO Podemos Ver, WTForms SE Encargo de Crag Los входы que le indimos y Ademas le Alphicó las validaciones necesarias ademas de las indindadas.

Hay Un Campo Que No Mencione Pero Si Está en El Codigo Y Es Necesario (Ademas de Ayudarnos a Mitigar Un Ataque Espersifico). SE TRATA DEL. CSRF_Token Отказ SI Queres Artrender Mas de Esto, TE DEJO DOS Включает Para Que Посети:

CSRF Glosario Перекрестное запрос для профилактики подделки

Гениал! Nustro Formulio Ya Se Encuentra Funcionando. Ahora Solo Debemos Almacenar Los Datos de Forma Persistente.

PersiScia de datos.

ES Momento Darle Seriedad A La Alipeacion, Y Grawchar Los Datos En Una BD Como Debe Ser.

Перо Cual Motor Debo ElegiR? El Que Vos quieras. EN MI CASO, PARA ALPACACIONES PEQUENAS (COMO ESTA) UTILIZO SQLITE3, PERO TENES MAS OPCIONES COMO PostgreSQL, Mariadb/Mysql, MSSQLSERVER и т. Д. O, Si предпочтения NoSQL, Hay Opciones Como Mongodb.

Frameworks Diferencias de Otros (COMO Django), Флэк Нет Posee Orm Propio, POR Lo Que Seremos NoSotros Los Que Decidamos Que Usar.

El Mapeo objeto-rueacional (o POR SUS SIGLAS EN INGLE OUT CIGLASTARAS) ES UNA TÉCNICA de Programación Para ConventiR DE TECOS ENTRE EL SISTEMA DE TIPOS UTILIZADO EN OUT LENGUAJE de Programación Reartado A Objetos Y La Utilización de Una Base de datos de persistencia.

Pasinentamente, UN ORM NOS Ayuda Trabajar Con La BD SIN NECESIDAD DE ESCRIBIR CONSULTAS SQL O NoSQL A MANO (Auentando La Posibilidad de Vulnanabilabilidades Como SQL Inurge).

YO VOY A ESTAR USANDO SQLALCHEMY.

Инсталация

pip install flask-sqlalchemy

POR ООН Проблема EN Версии Recientes de Sqlalchemy, Recomiendo Instalar SU Версия 1.3.23:

pip install sqlalchemy==1.3.23

AHORA HAREMOS UNA SERIE de Modificaciones EN Nuestra Alipexacion:

from flask import Flask, render_template, request, redirect, url_for
from forms.FormularioEstudiantes import FormularioEstudiantes
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.secret_key = 'Coloca aca tu clave de seguridad'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///alumnos.sqlite3'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

# Modelo de datos: Alumno

class Alumno(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nombre = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    calificacion = db.Column(db.Integer)

    def __repr__(self):
        return '' % self.nombre

@app.route('/')
def index():
    alumnos = Alumno.query.all()
    return render_template('index.html', alumnos=alumnos)

@app.route('/registro/', methods=['GET', 'POST'])
def registro():
    if request.method == 'POST':

        formulario = FormularioEstudiantes(request.form)

        alumno = Alumno(
            nombre = formulario.nombre.data,
            calificacion=formulario.calificacion.data,
            email=formulario.email.data,
        )

        db.session.add(alumno)
        db.session.commit()

        return redirect(url_for('index'))
    else:
        formulario = FormularioEstudiantes()
    return render_template('registro_alumno.html', formulario=formulario)


if __name__ == '__main__':
    db.create_all()
    app.run(port=3000, debug=True)

Ahora Corremos Nuestra Alpexacion, y Comenzamos АЛМУРЕНТЫ:

Ya TeneMos Nuestra Base de datos funcionando !!

POR Hoy Finalizamos. En la proxima entrega vamos a finzalizar против El Crud de Heumnos, Y Reestucturaremos un Poco La App.

Si Queres Darle Una Mirada Al Codigo, TE DEJO El Link acá.

TU Primer Web App Con Flask (4 части серии)

Оригинал: “https://dev.to/gareisdev/tu-primer-web-app-con-flask-parte-3-llb”