La gestió d'errors és una part essencial del desenvolupament d'aplicacions web. En aquest tema, aprendrem com gestionar errors de manera eficient en una aplicació Flask. Això inclou la captura d'excepcions, la creació de pàgines d'error personalitzades i l'ús de tècniques de registre per monitoritzar i depurar errors.
Conceptes Clau
- Captura d'Excepcions: Utilitzar blocs
try-except
per capturar i gestionar errors. - Gestors d'Errors: Definir funcions específiques per gestionar diferents tipus d'errors HTTP.
- Pàgines d'Error Personalitzades: Crear plantilles personalitzades per mostrar missatges d'error als usuaris.
- Registre d'Errors: Utilitzar el registre per mantenir un registre dels errors que es produeixen en l'aplicació.
Captura d'Excepcions
En Python, podem utilitzar blocs try-except
per capturar excepcions i gestionar-les de manera adequada. Aquí teniu un exemple bàsic:
try: # Codi que pot generar una excepció result = 10 / 0 except ZeroDivisionError: # Gestió de l'excepció print("No es pot dividir per zero!")
Gestors d'Errors en Flask
Flask permet definir gestors d'errors per a diferents codis d'estat HTTP. Aquests gestors es defineixen utilitzant el decorador @app.errorhandler
. Aquí teniu un exemple de com gestionar un error 404 (No Trobat):
from flask import Flask, render_template app = Flask(__name__) @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404
En aquest exemple, quan es produeix un error 404, Flask renderitza la plantilla 404.html
.
Pàgines d'Error Personalitzades
Podem crear plantilles personalitzades per mostrar missatges d'error als usuaris. Aquí teniu un exemple d'una plantilla 404.html
:
<!DOCTYPE html> <html lang="ca"> <head> <meta charset="UTF-8"> <title>Pàgina No Trobada</title> </head> <body> <h1>Error 404</h1> <p>La pàgina que cerques no existeix.</p> <a href="{{ url_for('index') }}">Torna a la pàgina principal</a> </body> </html>
Registre d'Errors
El registre d'errors és crucial per monitoritzar i depurar problemes en una aplicació. Flask utilitza la biblioteca logging
de Python per registrar errors. Aquí teniu un exemple de com configurar el registre d'errors:
import logging from logging.handlers import RotatingFileHandler if not app.debug: # Configurar el registre d'errors file_handler = RotatingFileHandler('errors.log', maxBytes=10240, backupCount=10) file_handler.setLevel(logging.ERROR) formatter = logging.Formatter( '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]') file_handler.setFormatter(formatter) app.logger.addHandler(file_handler)
En aquest exemple, els errors es registren en un fitxer errors.log
amb un format específic.
Exercici Pràctic
Objectiu
Crear una aplicació Flask que gestioni errors 404 i 500 amb pàgines d'error personalitzades i registre d'errors.
Passos
-
Crear l'Aplicació Flask:
from flask import Flask, render_template app = Flask(__name__) @app.route('/') def index(): return "Benvingut a la pàgina principal!" @app.route('/error') def error(): raise Exception("Això és un error intencionat!") if __name__ == '__main__': app.run(debug=True)
-
Definir Gestors d'Errors:
@app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @app.errorhandler(500) def internal_server_error(e): return render_template('500.html'), 500
-
Crear Plantilles d'Error:
404.html
:<!DOCTYPE html> <html lang="ca"> <head> <meta charset="UTF-8"> <title>Pàgina No Trobada</title> </head> <body> <h1>Error 404</h1> <p>La pàgina que cerques no existeix.</p> <a href="{{ url_for('index') }}">Torna a la pàgina principal</a> </body> </html>
500.html
:<!DOCTYPE html> <html lang="ca"> <head> <meta charset="UTF-8"> <title>Error Intern del Servidor</title> </head> <body> <h1>Error 500</h1> <p>Hi ha hagut un error intern del servidor.</p> <a href="{{ url_for('index') }}">Torna a la pàgina principal</a> </body> </html>
-
Configurar el Registre d'Errors:
import logging from logging.handlers import RotatingFileHandler if not app.debug: file_handler = RotatingFileHandler('errors.log', maxBytes=10240, backupCount=10) file_handler.setLevel(logging.ERROR) formatter = logging.Formatter( '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]') file_handler.setFormatter(formatter) app.logger.addHandler(file_handler)
Solució
from flask import Flask, render_template import logging from logging.handlers import RotatingFileHandler app = Flask(__name__) @app.route('/') def index(): return "Benvingut a la pàgina principal!" @app.route('/error') def error(): raise Exception("Això és un error intencionat!") @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @app.errorhandler(500) def internal_server_error(e): return render_template('500.html'), 500 if not app.debug: file_handler = RotatingFileHandler('errors.log', maxBytes=10240, backupCount=10) file_handler.setLevel(logging.ERROR) formatter = logging.Formatter( '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]') file_handler.setFormatter(formatter) app.logger.addHandler(file_handler) if __name__ == '__main__': app.run(debug=True)
Conclusió
En aquesta secció, hem après com gestionar errors en una aplicació Flask. Hem vist com capturar excepcions, definir gestors d'errors, crear pàgines d'error personalitzades i configurar el registre d'errors. La gestió adequada dels errors és crucial per proporcionar una bona experiència d'usuari i per facilitar la depuració i el manteniment de l'aplicació. En el següent tema, explorarem com crear pàgines d'error personalitzades per millorar encara més l'experiència de l'usuari.
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