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='test@example.com',
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 + b6.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
