En aquest tema, aprendrem com implementar la funcionalitat de registre d'usuaris en una aplicació Flask. Aquesta funcionalitat és essencial per a qualsevol aplicació web que requereixi autenticació d'usuaris. Utilitzarem Flask-WTF per gestionar els formularis i Flask-SQLAlchemy per interactuar amb la base de dades.
Objectius
- Crear un formulari de registre d'usuaris.
- Validar les dades del formulari.
- Emmagatzemar els usuaris registrats a la base de dades.
- Proporcionar retroalimentació a l'usuari sobre l'estat del registre.
Passos a Seguir
- Configuració del Formulari de Registre
Primer, crearem un formulari de registre utilitzant Flask-WTF. Aquest formulari inclourà camps per al nom d'usuari, correu electrònic i contrasenya.
# forms.py from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Length, Email, EqualTo class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)]) email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Sign Up')
- Creació del Model d'Usuari
A continuació, definirem el model d'usuari utilitzant Flask-SQLAlchemy. Aquest model representarà la taula d'usuaris a la base de dades.
# models.py from flask_sqlalchemy import SQLAlchemy from datetime import datetime db = SQLAlchemy() class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) image_file = db.Column(db.String(20), nullable=False, default='default.jpg') password = db.Column(db.String(60), nullable=False) created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) def __repr__(self): return f"User('{self.username}', '{self.email}', '{self.image_file}')"
- Creació de la Ruta de Registre
Ara, crearem la ruta de registre que gestionarà les sol·licituds GET i POST per al formulari de registre.
# routes.py from flask import render_template, url_for, flash, redirect from app import app, db from app.forms import RegistrationForm from app.models import User @app.route("/register", methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): user = User(username=form.username.data, email=form.email.data, password=form.password.data) db.session.add(user) db.session.commit() flash('Your account has been created! You are now able to log in', 'success') return redirect(url_for('login')) return render_template('register.html', title='Register', form=form)
- Creació de la Plantilla de Registre
Finalment, crearem la plantilla HTML per al formulari de registre.
<!-- templates/register.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Register</title> </head> <body> <h2>Register</h2> <form method="POST" action=""> {{ form.hidden_tag() }} <div> {{ form.username.label }}<br> {{ form.username(size=32) }}<br> {% for error in form.username.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </div> <div> {{ form.email.label }}<br> {{ form.email(size=32) }}<br> {% for error in form.email.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </div> <div> {{ form.password.label }}<br> {{ form.password(size=32) }}<br> {% for error in form.password.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </div> <div> {{ form.confirm_password.label }}<br> {{ form.confirm_password(size=32) }}<br> {% for error in form.confirm_password.errors %} <span style="color: red;">[{{ error }}]</span> {% endfor %} </div> <div> {{ form.submit() }} </div> </form> </body> </html>
- Hashing de Contrasenyes
Per motius de seguretat, mai emmagatzemem contrasenyes en text pla. Utilitzarem la biblioteca werkzeug.security
per hash de les contrasenyes abans de guardar-les a la base de dades.
# routes.py (modificat) from werkzeug.security import generate_password_hash @app.route("/register", methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): hashed_password = generate_password_hash(form.password.data) user = User(username=form.username.data, email=form.email.data, password=hashed_password) db.session.add(user) db.session.commit() flash('Your account has been created! You are now able to log in', 'success') return redirect(url_for('login')) return render_template('register.html', title='Register', form=form)
Exercici Pràctic
Exercici 1: Implementar la Funcionalitat de Registre
- Crea un formulari de registre utilitzant Flask-WTF.
- Defineix el model d'usuari amb Flask-SQLAlchemy.
- Crea la ruta de registre per gestionar les sol·licituds GET i POST.
- Crea la plantilla HTML per al formulari de registre.
- Implementa el hashing de contrasenyes abans de guardar-les a la base de dades.
Solució
La solució completa es troba en els fragments de codi proporcionats anteriorment. Assegura't de seguir cada pas i verificar que la funcionalitat de registre funcioni correctament.
Resum
En aquest tema, hem après a implementar la funcionalitat de registre d'usuaris en una aplicació Flask. Hem creat un formulari de registre, validat les dades del formulari, emmagatzemat els usuaris registrats a la base de dades i proporcionat retroalimentació a l'usuari. També hem après a hash de les contrasenyes per motius de seguretat. En el següent tema, explorarem com implementar la funcionalitat d'inici i tancament de sessió d'usuaris.
Curs de Desenvolupament Web amb Flask
Mòdul 1: Introducció a Flask
- Què és Flask?
- Configuració del Teu Entorn de Desenvolupament
- Creant la Teva Primera Aplicació Flask
- Entenent l'Estructura d'una Aplicació Flask
Mòdul 2: Conceptes Bàsics de Flask
- Enrutament i Mapeig d'URL
- Gestió de Mètodes HTTP
- Renderització de Plantilles amb Jinja2
- Treballant amb Fitxers Estàtics
Mòdul 3: Formularis i Entrada d'Usuari
Mòdul 4: Integració de Bases de Dades
- Introducció a Flask-SQLAlchemy
- Definició de Models
- Realització d'Operacions CRUD
- Migracions de Bases de Dades amb Flask-Migrate
Mòdul 5: Autenticació d'Usuaris
- Registre d'Usuaris
- Inici i Tancament de Sessió d'Usuaris
- Hashing de Contrasenyes
- Gestió de Sessions d'Usuaris
Mòdul 6: Conceptes Avançats de Flask
- Blueprints per a Aplicacions Grans
- Gestió d'Errors
- Pàgines d'Error Personalitzades
- Registre i Depuració
Mòdul 7: APIs RESTful amb Flask
- Introducció a les APIs RESTful
- Creació de Punts Finals RESTful
- Gestió de Dades JSON
- Autenticació per a APIs
Mòdul 8: Desplegament i Producció
- Configuració de Flask per a Producció
- Desplegament a Heroku
- Desplegament a AWS
- Monitorització i Optimització del Rendiment
Mòdul 9: Proves i Millors Pràctiques
- Proves Unitàries amb Flask
- Proves d'Integració
- Cobertura de Proves
- Millors Pràctiques per al Desenvolupament amb Flask