My joy of life is on a roll

Come suggeriscono molti medici, psicologi, influencer e gente che incontri sull’autobus, durante la notte bisognerebbe tenere lontani dal letto il cellulare e altri dispositivi elettronici. La cosa migliore sarebbe tenerli anche spenti o, al limite, in una stanza diversa da quella in cui si dorme.

“Gli studi dimostrano” (è un modo di dire, io non ho letto nessuno studio) che questi dispositivi disturbano il sonno e, soprattutto, rappresentano una distrazione e una continua tentazione a passare ore davanti a uno schermo anche quando, in teoria, sarebbe ora di dormire. La luce blu emanata da questi schermi va ad intaccare i ritmi circadiani del nostro corpo, alterando i livelli di cortisolo in circolazione, aumentando lo stress e provocando insonnia.

Quelle che ho appena scritto sono parole buttate lì più o meno a casaccio che mimano, in maniera più o meno plausibile, quello che si legge sui giornali o che si sente in TV o su YouTube (gli influencer di cui sopra).

Tutta questa premessa per dire che, anche la scorsa notte, non ho chiuso occhio e ho vagato per la casa, alternando momenti di lettura di un romanzo (La regina degli inferi – la maledizione di Persefone) a ricerche sul web in materia di sviluppo di applicazioni web con Flask e il loro deployment con Docker o metodi bare metal più tradizionali.

Flask, Python e type annotations

Infatti da qualche tempo sto pensando di utilizzare Flask per sviluppare una semplice applicazione, una specie di PoC (proof of concept), tanto per riprendere un po’ di confidenza con Python (ORRORE! 😱).

Era quasi l’una di notte quando, sul mio fidato Kindle dell’anteguerra, ho riaperto l’ottimo manuale di Miguel Grinberg, “The Flask Mega-Tutorial”, disponibile anche gratuitamente sul suo sito web. Si tratta di un tutorial fatto veramente bene, che prende in considerazione tutti gli aspetti dello sviluppo di un’applicazione, fino alla sua pubblicazione in produzione.

Ripassando un po’ i vari concetti, sono arrivato alla parte riguardante l’interazione con un database e alla definizione di un model, dove c’è questa porzione di codice:

from typing import Optional
import sqlalchemy as sa
import sqlalchemy.orm as so
from app import db

class User(db.Model):
    id: so.Mapped[int] = so.mapped_column(primary_key=True)
    username: so.Mapped[str] = so.mapped_column(sa.String(64), index=True,
                                                unique=True)
    email: so.Mapped[str] = so.mapped_column(sa.String(120), index=True,
                                             unique=True)
    password_hash: so.Mapped[Optional[str]] = so.mapped_column(sa.String(256))

    def __repr__(self):
        return '<User {}>'.format(self.username)Code language: Python (python)

Sono consapevole che l’utilizzo delle type annotations non è obbligatorio e che se ne potrebbe fare a meno, e infatti nella precedente versione del tutorial era così, ad ampio vantaggio della leggibilità e semplicità del codice:

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))

    def __repr__(self):
        return '<User {}>'.format(self.username)Code language: Python (python)

Per me che sono abituato a Ruby e a Rails, questa roba suscita orrore e angoscia (e anche un po’ di schifo, come mi succede con gran parte del codice Python).

Anche in Ruby, da qualche tempo, sono state introdotte le cosiddette “type signature” (RBS), ma se perfino DHH le disprezza evita ci sarà un motivo…

Da Flask a Sinatra

Come dicevo, era circa l’una di notte, e all’improvviso ho avuto una folgorazione. Pensavo a Flask perché leggero, snello, facile da imparare (almeno per applicazioni semplici) e facile da mettere in produzione, praticamente l’opposto di Django. Ed è stato lì che ho pensato “Ehi, Flask sta a Django come Sinatra sta a Rails!”.

Sinatra è un web framework ridotto all’osso, estremamente leggero e adatto ad applicazioni non troppo complesse o allo sviluppo di API. Come con Flask, tutto ciò che è in più va aggiunto esplicitamente, e non ci sono particolari vincoli su come organizzare il codice o quali librerie utilizzare. Mi era già capitato in passato di provarlo per curiosità, per vedere se poteva fare al caso mio, ma senza troppo impegno né convinzione, anche perché non mi trovavo molto a mio agio con la documentazione. Per questo, ormai all’una e mezza di notte, mi sono messo a cercare un manualetto facile ed economico che mi potesse aiutare, e ho trovato questo:

Copertina della guida “Sinatra Essentials”

Ad una prima, rapida lettura, per quelle che erano le mie capacità cognitive alle due passate, l’ho trovato molto accurato e sufficientemente completo per aiutarmi a sviluppare quello che ho in mente. Sicuramente avrò bisogno anche di ricorrere alla documentazione ufficiale e ad altre risorse sul web, ma avere un manualetto dedicato è un grande aiuto.

Il manuale copre un po’ tutti gli aspetti del framework necessari a sviluppare un’applicazione completa, compresa la parte di autenticazione, l’interazione con i database e la gestione dei template.

A proposito di template, che secondo me costituiscono una buona soluzione per aumentare la separazione del codice, devo però citare l’opinione di Salvatore Sanfilippo (antirez) che, nella sua applicazione Lamer News, anch’essa fatta con Sinatra, dice testualmente:

Don’t use templates, they suck.

Salvatore Sanfilippo

Non mi è ben chiaro il motivo di questa posizione così netta contro l’utilizzo dei template, magari un giorno lo capirò anch’io e inizierò a farne a meno, nel frattempo però…

Powered by atecplugins.com