En aquest tema, aprendrem com implementar funcionalitats d'inici i tancament de sessió d'usuaris en una aplicació Flask. Aquestes funcionalitats són essencials per a qualsevol aplicació web que requereixi autenticació d'usuaris.
Objectius
- Entendre com gestionar sessions d'usuaris amb Flask.
- Implementar funcionalitats d'inici de sessió.
- Implementar funcionalitats de tancament de sessió.
- Utilitzar
Flask-Loginper simplificar la gestió de sessions.
Requisits Previs
- Coneixements bàsics de Flask.
- Coneixements bàsics de bases de dades i models amb SQLAlchemy.
- Coneixements bàsics de formularis amb WTForms.
Instal·lació de Flask-Login
Primer, hem d'instal·lar l'extensió Flask-Login:
Configuració de Flask-Login
- Configuració Bàsica
Afegim la configuració bàsica de Flask-Login a la nostra aplicació Flask:
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager app = Flask(__name__) app.config['SECRET_KEY'] = 'el_teu_secret_clau' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' db = SQLAlchemy(app) login_manager = LoginManager(app) login_manager.login_view = 'login'
- Definició del Model d'Usuari
Definim el model d'usuari amb SQLAlchemy i Flask-Login:
from flask_login import UserMixin
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(150), unique=True, nullable=False)
password = db.Column(db.String(150), nullable=False)
- Càrrega de l'Usuari
Implementem la funció de càrrega de l'usuari:
Implementació de l'Inici de Sessió
- Formulari d'Inici de Sessió
Creem un formulari d'inici de sessió amb WTForms:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import InputRequired, Length
class LoginForm(FlaskForm):
username = StringField('Username', validators=[InputRequired(), Length(min=4, max=150)])
password = PasswordField('Password', validators=[InputRequired(), Length(min=4, max=150)])
submit = SubmitField('Login')
- Vista d'Inici de Sessió
Implementem la vista d'inici de sessió:
from flask import render_template, redirect, url_for, flash
from flask_login import login_user
from werkzeug.security import check_password_hash
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user and check_password_hash(user.password, form.password.data):
login_user(user)
return redirect(url_for('dashboard'))
else:
flash('Invalid username or password')
return render_template('login.html', form=form)
- Plantilla d'Inici de Sessió
Creem la plantilla login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="POST">
{{ form.hidden_tag() }}
<p>
{{ form.username.label }}<br>
{{ form.username(size=32) }}
</p>
<p>
{{ form.password.label }}<br>
{{ form.password(size=32) }}
</p>
<p>{{ form.submit() }}</p>
</form>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>Implementació del Tancament de Sessió
- Vista de Tancament de Sessió
Implementem la vista de tancament de sessió:
from flask_login import logout_user
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('login'))Resum
En aquesta secció, hem après a implementar funcionalitats d'inici i tancament de sessió d'usuaris en una aplicació Flask utilitzant Flask-Login. Hem configurat l'extensió, creat el model d'usuari, implementat la vista d'inici de sessió amb validació de formularis i la vista de tancament de sessió.
Exercicis Pràctics
- Exercici 1: Modifica la vista d'inici de sessió per redirigir l'usuari a una pàgina diferent en funció del seu rol (per exemple, administrador o usuari normal).
- Exercici 2: Implementa una funcionalitat de "Recorda'm" que permeti als usuaris mantenir-se autenticats fins i tot després de tancar el navegador.
Solucions als Exercicis
Solució a l'Exercici 1
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user and check_password_hash(user.password, form.password.data):
login_user(user)
if user.role == 'admin':
return redirect(url_for('admin_dashboard'))
else:
return redirect(url_for('user_dashboard'))
else:
flash('Invalid username or password')
return render_template('login.html', form=form)Solució a l'Exercici 2
Afegim un camp "Recorda'm" al formulari d'inici de sessió:
from wtforms import BooleanField
class LoginForm(FlaskForm):
username = StringField('Username', validators=[InputRequired(), Length(min=4, max=150)])
password = PasswordField('Password', validators=[InputRequired(), Length(min=4, max=150)])
remember = BooleanField('Remember Me')
submit = SubmitField('Login')Modifiquem la vista d'inici de sessió per utilitzar el camp "Recorda'm":
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user and check_password_hash(user.password, form.password.data):
login_user(user, remember=form.remember.data)
return redirect(url_for('dashboard'))
else:
flash('Invalid username or password')
return render_template('login.html', form=form)Amb aquestes modificacions, hem afegit la funcionalitat de "Recorda'm" a la nostra aplicació Flask.
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
