En aquest tema, explorarem les millors pràctiques per al desenvolupament d'aplicacions web amb Flask. Aquestes pràctiques t'ajudaran a escriure codi més net, mantenible i segur, així com a optimitzar el rendiment de la teva aplicació.
- Organització del Projecte
1.1. Estructura del Projecte
Organitza el teu projecte de manera que sigui fàcil de navegar i mantenir. Una estructura típica podria ser:
my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── templates/ │ └── static/ │ ├── migrations/ │ ├── tests/ │ ├── __init__.py │ ├── test_models.py │ ├── test_views.py │ └── test_forms.py │ ├── venv/ │ ├── config.py ├── requirements.txt └── run.py
1.2. Utilitza Blueprints
Els Blueprints permeten dividir l'aplicació en components més petits i modulars. Això facilita la gestió i l'escalabilitat del projecte.
# app/__init__.py from flask import Flask from app.views import main_blueprint def create_app(): app = Flask(__name__) app.register_blueprint(main_blueprint) return app
# app/views.py from flask import Blueprint main_blueprint = Blueprint('main', __name__) @main_blueprint.route('/') def home(): return "Hello, Flask!"
- Configuració
2.1. Configuració per a Diferents Entorns
Separa la configuració per a diferents entorns (desenvolupament, proves, producció) en fitxers diferents.
# config.py class Config: SECRET_KEY = 'your_secret_key' SQLALCHEMY_TRACK_MODIFICATIONS = False class DevelopmentConfig(Config): DEBUG = True SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db' class ProductionConfig(Config): DEBUG = False SQLALCHEMY_DATABASE_URI = 'sqlite:///prod.db'
2.2. Variables d'Entorn
Utilitza variables d'entorn per a configuracions sensibles com claus secretes i credencials de bases de dades.
import os class Config: SECRET_KEY = os.environ.get('SECRET_KEY') or 'default_secret_key' SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///app.db'
- Seguretat
3.1. Validació d'Entrada
Valida totes les dades d'entrada per evitar injeccions SQL i altres tipus d'atacs.
from flask_wtf import FlaskForm from wtforms import StringField, PasswordField from wtforms.validators import DataRequired, Length class LoginForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=4, max=25)]) password = PasswordField('Password', validators=[DataRequired(), Length(min=6, max=25)])
3.2. Protecció contra CSRF
Utilitza tokens CSRF per protegir els formularis.
3.3. Hashing de Contrasenyes
Utilitza llibreries com werkzeug.security
per a l'emmagatzematge segur de contrasenyes.
from werkzeug.security import generate_password_hash, check_password_hash hashed_password = generate_password_hash('your_password') is_valid = check_password_hash(hashed_password, 'your_password')
- Rendiment
4.1. Cache
Implementa mecanismes de cache per millorar el rendiment de l'aplicació.
from flask_caching import Cache cache = Cache(config={'CACHE_TYPE': 'simple'}) cache.init_app(app) @app.route('/') @cache.cached(timeout=60) def home(): return "Hello, Flask!"
4.2. Optimització de Consultes SQL
Utilitza eines com Flask-SQLAlchemy
per optimitzar les consultes a la base de dades.
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False)
- Proves
5.1. Proves Unitàries
Escriu proves unitàries per assegurar-te que cada component de l'aplicació funciona correctament.
import unittest from app import create_app class BasicTestCase(unittest.TestCase): def setUp(self): self.app = create_app() self.client = self.app.test_client() def test_home(self): response = self.client.get('/') self.assertEqual(response.status_code, 200) self.assertIn(b'Hello, Flask!', response.data) if __name__ == '__main__': unittest.main()
5.2. Proves d'Integració
Escriu proves d'integració per assegurar-te que els diferents components de l'aplicació funcionen bé junts.
class IntegrationTestCase(unittest.TestCase): def setUp(self): self.app = create_app() self.client = self.app.test_client() def test_user_registration_and_login(self): response = self.client.post('/register', data=dict( username='testuser', email='[email protected]', password='password' )) self.assertEqual(response.status_code, 200) response = self.client.post('/login', data=dict( username='testuser', password='password' )) self.assertEqual(response.status_code, 200)
- Documentació
6.1. Documenta el Codi
Utilitza docstrings per documentar les funcions i classes del teu codi.
def add(a, b): """ Afegeix dos números. :param a: Primer número :param b: Segon número :return: La suma de a i b """ return a + b
6.2. Documentació de l'API
Utilitza eines com Flask-RESTful
per documentar les teves APIs.
from flask_restful import Api, Resource api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/')
Conclusió
Seguint aquestes millors pràctiques, podràs desenvolupar aplicacions Flask més robustes, segures i eficients. Recorda que la clau per a un bon desenvolupament és la constància en l'aplicació d'aquestes pràctiques i l'adaptació a les necessitats específiques del teu projecte.
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