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ó.

  1. 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!"

  1. 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'

  1. 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.

from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect()
csrf.init_app(app)

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')

  1. 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)

  1. 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)

  1. 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

Mòdul 2: Conceptes Bàsics de Flask

Mòdul 3: Formularis i Entrada d'Usuari

Mòdul 4: Integració de Bases de Dades

Mòdul 5: Autenticació d'Usuaris

Mòdul 6: Conceptes Avançats de Flask

Mòdul 7: APIs RESTful amb Flask

Mòdul 8: Desplegament i Producció

Mòdul 9: Proves i Millors Pràctiques

Mòdul 10: Extensions i Ecosistema de Flask

© Copyright 2024. Tots els drets reservats