Recensione: 13 framework web Python a confronto

Se stai sviluppando un'applicazione web e hai scelto Python come linguaggio per costruirla, è una mossa intelligente. La maturità dello sviluppo di Python, le solide librerie e l'ampiezza dell'adozione nel mondo reale hanno contribuito a renderlo un gioco da ragazzi per lo sviluppo web.

Ora arriva la parte difficile: scegliere uno dei tanti framework web Python disponibili. Non solo il numero continua a crescere, ma può essere difficile trovare quello che si adatta meglio al tuo caso d'uso. Se stai costruendo un'API REST rapida e sporca, non avrai bisogno di nulla vicino all'impianto idraulico e al cablaggio necessari per un'applicazione completa rivolta all'utente con accessi utente, convalide di moduli e gestione del caricamento.

Video correlato: creazione di una semplice app Web con Python e Flask

In questo riepilogo, esamineremo 13 dei framework Web Python più diffusi. Noteremo quali tipi di applicazioni web sono più adatte a costruire e esamineremo come si sovrappongono l'una contro l'altra in queste sei aree:

Installazione: quanto è facile o diretto impostare il framework: progetti che non richiedono un'installazione formale (può essere semplicemente inserito in un progetto esistente come modulo incluso), richiedono un boilerplate minimo per iniziare o vengono forniti con qualche tipo delle impostazioni preconfigurate ottengono punti extra.

Documentazione: quasi tutti i progetti Python decenti hanno una documentazione che guida attraverso l'installazione, illustra i casi d'uso di base e fornisce dettagli sulle API. Qui, diamo voti più alti ai framework che mostrano come creare un'intera app come parte del tutorial, includono ricette comuni o modelli di progettazione e altrimenti vanno oltre il dovere (ad esempio fornendo dettagli su come eseguire il framework sotto una variante Python come PyPy o IronPython).

Gestione: questo è un punteggio relativo, che indica quanto lavoro è necessario per configurare e mantenere il framework. I framework minimi hanno un punteggio più alto qui per impostazione predefinita.

Funzionalità native: quante batterie sono incluse? I punteggi più alti vanno ai framework che forniscono supporto nativo per l'internazionalizzazione, modelli HTML e un livello di accesso ai dati. I punti vanno anche ai framework che fanno un uso nativo del supporto nativo introdotto di recente da Python per le operazioni di I / O asincrone.

Sicurezza: i framework che forniscono misure di sicurezza native come la protezione CSRF (cross-site request forgery) e la gestione delle sessioni con cookie crittografati ottengono punteggi più alti.

Scalabilità: la maggior parte dei framework Python può utilizzare progetti come Gevent o Gunicorn per essere eseguiti su larga scala. Qui, esaminiamo le funzionalità native del framework che promuovono la scalabilità, come l'output e la memorizzazione nella cache dei frammenti di pagina.

Se sei curioso di conoscere i benchmark delle prestazioni, dai un'occhiata alla serie di prove in corso di TechEmpower, che confronta più framework web tra varie attività, con codice e metodologie pubblicati su GitHub e sottoposti a costante rivalutazione. Non tutti i framework in questa discussione vengono analizzati lì, ma è possibile avere un'idea precisa di quali framework funzionano meglio con quali tipi di carichi.

Esamineremo 13 framework in tutto. Cinque di questi - CubicWeb, Django, Web2py, Weppy e Zope2 - adottano l'approccio "lavello da cucina", comprendendo quasi tutte le funzionalità che potresti immaginare di aver bisogno per un'applicazione web. I restanti otto framework - Bottle, CherryPy, Falcon, Flask, Pyramid, Tornado, Web.py e Wheezy.web - offrono una versione più minimalista, scambiando massa e completezza con semplicità e facilità.

Cominciamo con i pesi massimi.

Framework web Python pesanti

CubicWeb

CubicWeb è classificato come "un framework per applicazioni web semantiche che favorisce il riutilizzo e la progettazione orientata agli oggetti". È un sistema intrigante - come notato da Rick Grehan quando lo esaminò nel 2011 - che enfatizza l'uso di astrazioni e blocchi di codice riutilizzabili chiamati "cubi", ma potrebbe essere troppo astratto o idiosincratico per alcuni sviluppatori.

I cubi sono componenti software che presentano uno schema (modello di dati), entità (logica di programmazione) e viste. Assemblando più cubi, ognuno dei quali esegue la propria attività, è possibile comporre applicazioni software riutilizzando il proprio codice e il codice di altri.

Al suo interno, CubicWeb fornisce lo scaffolding di base utilizzato da ogni app web: un "repository" per le connessioni dati e l'archiviazione; un "motore web" per richieste / risposte HTTP di base e azioni CRUD; e uno schema per la modellazione dei dati. Tutto questo è descritto nelle definizioni delle classi Python. Per configurare e gestire istanze di CubicWeb, lavori con uno strumento da riga di comando simile a quello utilizzato per Django.

CubicWeb non sembra utilizzare la funzionalità asincrona nativa di Python 3. Un modo indiretto per includere l'asincronia potrebbe essere quello di utilizzare il modulo cubicweb.pyramid per utilizzare il framework Pyramid come server web e disegnare su un fork di Pyramid che utilizza costruzioni asincrone. Ma niente di più semplice sembra fuori portata per ora.

Per recuperare o manipolare dati persistenti in un'app CubicWeb, si utilizza Relation Query Language (RQL), che utilizza una sintassi vagamente simile a SQL ma è modellato sullo SparQL del W3C. La giustificazione di CubicWeb per questo è, ancora una volta, l'astrazione: RQL fornisce un percorso altamente disaccoppiato per correlare varie fonti di dati. Ma poiché è implementato, costruendo manualmente query come stringhe, probabilmente sembrerà antiquato per gli sviluppatori abituati agli ORM.

Ci sono altri ostacoli all'uso di CubicWeb. Per uno, l'installazione può essere una seccatura. Poiché CubicWeb ha molte dipendenze, è meglio usarle pip installper recuperarle tutte. Potrebbe anche essere necessario eseguire una certa quantità di modifiche manuali sull'ambiente locale. Ciò è in netto contrasto con altri framework in cui pip installè sufficiente eseguire o rilasciare il codice del framework in una sottocartella di un altro progetto.

Un altro potenziale problema è l'assenza di un motore di template nativo; la generazione di HTML è lasciata allo sviluppatore. È possibile ovviare a questo problema utilizzando un sistema di modelli di terze parti come Jinja2 o optando per un cubo che fornisce strumenti per le interfacce utente Web, come quello per il framework HTML Boostrap.

Un problema di vecchia data con CubicWeb - la mancanza del supporto per Python 3 - è stato risolto. A partire da giugno 2016 e dalla versione 3.23, il supporto per Python 3 è arrivato in CubicWeb, ad eccezione dei moduli come Twisted che non sono stati completamente portati.

Come Web2py, CubicWeb si riferisce alla sua lunga documentazione come "il libro". Ci vuole tempo per spiegare l'approccio insolito di CubicWeb, dimostra come creare alcune applicazioni di base, include riferimenti API e in generale fa di tutto per essere specifico.

Django

Nel decennio e nel cambiamento dalla prima apparizione di Django, è diventato uno dei framework più utilizzati da Python per la creazione di applicazioni web. Django viene fornito con quasi tutte le batterie di cui potresti aver bisogno, quindi è più propenso a creare applicazioni grandi che piccole.

Video correlato: creazione di un semplice sito Web con Django

Dopo molti anni passati alla versione 1.x, Django ha recentemente fatto un salto di versione a sinistra del punto decimale. Il più grande cambiamento in Django 2.0 è che il framework ora funziona solo con Python 3.4 e versioni successive. Idealmente, dovresti comunque usare Python 3.x, quindi l'unico motivo per usare il ramo 1.x di Django è se sei bloccato con una vecchia versione di Python.

Una parte fondamentale dell'attrattiva di Django è la velocità di distribuzione. Poiché include così tanti pezzi di cui hai bisogno per sviluppare l'applicazione web media, puoi muoverti rapidamente. Routing, analisi degli URL, connettività al database (incluso un ORM), convalida dei moduli, protezioni dagli attacchi e modelli sono tutti integrati.

Troverai elementi costitutivi per gli scenari di applicazioni Web più comuni. La gestione degli utenti, ad esempio, si trova sulla maggior parte dei siti Web, quindi Django la offre come elemento standard. Invece di dover creare il tuo sistema per tracciare account utente, sessioni, password, accessi / disconnessioni, autorizzazioni di amministratore e così via, Django ha queste funzionalità in modo nativo. Possono essere utilizzati così come sono o estesi per comprendere nuovi casi d'uso con una quantità minima di lavoro.

zope.formlib 1. Il core è BSD; alcuni componenti LGPLv3. 2. Disponibile tramite; installato separatamente ma supportato come parte del progetto. 3. Disponibile tramite estensione di terze parti.
  CubicWeb Django Web2py Weppy Zope2
Licenza LGPL BSD LGPLv3 BSD / LGPLv3 [1] Licenza pubblica Zope
Sistema di template HTML nativo
ORM nativo / gestione dei dati
Libreria di estensioni
Convalida del modulo Sì [2]
Protezione dalla contraffazione delle richieste cross-site
Gestione degli utenti / accesso basato sui ruoli
Supporto per Python 3 No No
Migrazioni dello schema per i modelli di dati No
Memorizzazione nella cache delle risposte No
Supporto all'internazionalizzazione
Supporto WebSocket nativo No Numero 3] No No
Ambiente di sviluppo interattivo No No

Django ha impostazioni predefinite sane e sicure che aiutano a proteggere la tua applicazione web dagli attacchi. Quando si inserisce una variabile in un modello di pagina, ad esempio una stringa con HTML o JavaScript, il contenuto non viene visualizzato letteralmente a meno che non si designi esplicitamente l'istanza della variabile come sicura. Questo di per sé riduce molti problemi comuni di cross-site scripting. Se desideri eseguire la convalida del modulo, puoi utilizzare qualsiasi cosa, dalla semplice protezione CSRF ai meccanismi di convalida campo per campo completi che restituiscono un feedback dettagliato degli errori.

Un set di funzionalità così ricco e ampio come quello di Django non sarebbe molto buono senza una robusta documentazione che lo accompagni. Il sito di documentazione di Django approfondisce ogni aspetto del framework da più angolazioni. Lavorare con Python 3 o altri tipi di linguaggio, eseguire correttamente la sicurezza, implementare componenti di applicazioni Web comuni (come sessioni o impaginazione), generare sitemap: sono tutti coperti. Anche le API per ogni livello dell'applicazione (modello, vista e modello) sono descritte in dettaglio.

Con un grande potere, tuttavia, arriva una grande complessità. Le applicazioni Django hanno la reputazione di essere molto pesanti, con molte parti mobili. Anche una semplice app Django con solo un paio di percorsi richiede una discreta quantità di configurazione per funzionare. Se il tuo lavoro non è fare altro che impostare un paio di semplici endpoint REST, Django è quasi certamente eccessivo.

Anche Django ha le sue stranezze. Ad esempio, i modelli di pagina non possono utilizzare invocabili. Esempio: puoi passare {{user.name}}come componente in un modello, ma non {{user.get_name()}}. È uno dei modi in cui Django garantisce che i modelli non facciano inavvertitamente cose brutte, ma questi vincoli possono essere fastidiosi se non sei preparato per loro. Sebbene ci siano soluzioni alternative, tendono a incidere sulle prestazioni.

Il nucleo di Django è sincrono. Tuttavia, un modo per aggiungere un comportamento asincrono è tramite il progetto Django Channels. Questo progetto, un add-on ufficiale di Django, aggiunge la gestione asincrona per connessioni e socket a Django, preservando gli idiomi di programmazione di Django.

Web2py

Nel mondo Ruby, Ruby on Rails è il framework web de facto. Il professore di informatica della DePaul University Massimo Di Pierro si è ispirato a Rails per creare un framework web in Python che fosse altrettanto facile da configurare e utilizzare. Il risultato è Web2py.

La più grande attrazione di Web2py è il suo ambiente di sviluppo integrato. Quando configuri un'istanza di Web2py, ti viene fornita un'interfaccia web, essenzialmente un editor di applicazioni Python online, dove puoi configurare i componenti dell'app. Questo in genere significa creare modelli, viste e controller, ciascuno descritto tramite moduli Python o modelli HTML. Alcune app di esempio vengono fornite con Web2py immediatamente. Puoi smontarli per vedere come funzionano o sfruttarli come modelli iniziali per creare le tue app.

Gli sviluppatori in genere distribuiscono Web2py semplicemente scaricando il suo codice sorgente e utilizzandolo. Ma per gli utenti meno tecnici su Windows o MacOS, i creatori di Web2py offrono versioni che sono essenzialmente server indipendenti. Scarica, scompatta ed esegui una di queste versioni e avrai un server web locale con una copia preconfigurata di Web2py integrata. Questo è un bel modo per ottenere un vantaggio sulla creazione di un'app Web2py, che può quindi essere distribuita altrove secondo necessità.

L'interfaccia web di Web2py è stata costruita con Bootstrap 2.16.1, quindi è facile per gli occhi e facile da navigare. L'editor in-browser non sostituisce un IDE completo, ma è dotato di utili aiuti come la numerazione delle righe e l'evidenziazione della sintassi Python (incluso il rientro automatico). È inclusa anche una rapida interfaccia web per la shell Python, in modo da poter interagire con Web2py dalla riga di comando, se necessario, una bella concessione agli esperti.

Il sistema di astrazione dei dati utilizzato in Web2py funziona in modo leggermente diverso dall'ORM di Django e da altri ORM ad esso ispirati (come Peewee). Questi sistemi usano classi Python per definire modelli, dove in Web2py usi funzioni di costruzione come define_tableistanziare modelli. La maggior parte di queste differenze rischia di essere stridente solo per le persone che hanno già esperienza con una e stanno iniziando a usare l'altra; sono quasi altrettanto complessi per i nuovi arrivati. È improbabile che tu abbia problemi con l'autostop Web2py a un fornitore di dati, poiché parla con quasi tutti i principali database esistenti.

Una funzione relativa al database veramente utile è la capacità di generare un diagramma dei modelli, per visualizzare meglio come i tuoi modelli si relazionano tra loro. Tuttavia, dovrai installare la libreria pygraphviz per abilitare quella funzione.

Web2py fornisce molti altri componenti di livello professionale: funzioni di internazionalizzazione, molteplici metodologie di caching, controllo degli accessi e autorizzazione e persino effetti front-end (ad esempio, un selettore di date nei moduli) tramite il supporto integrato per jQuery e AJAX. Sono inclusi anche ganci per middleware esterno e interno, sebbene non sia consentito utilizzare il middleware per sostituire le funzioni principali di Web2py.

Una limitazione significativa di Web2py è che è compatibile solo con Python 2.x. Per prima cosa, questo significa che Web2py non può utilizzare la sintassi asincrona di Python 3. Per due, se ti affidi a librerie esterne esclusive di Python 3, sei sfortunato. Tuttavia, sono in corso lavori per rendere conforme a Web2py Python 3, ed è molto vicino al completamento al momento della stesura di questo documento.

Non c'è da meravigliarsi che la documentazione di Web2py venga chiamata "il libro". Innanzitutto, copre un'incredibile quantità di materiale su Web2py, Python e gli ambienti di distribuzione utilizzati per entrambi. Secondo, è scritto in uno stile narrativo altamente accessibile. In terzo luogo, parla in modo approfondito degli scenari comuni di creazione di applicazioni. C'è un intero capitolo, ad esempio, sull'uso di jQuery (in bundle con Web2Py) per creare applicazioni AJAX.

Weppy

Weppy si sente a metà strada tra la semplicità minima di Flask e la completezza di Django. Mentre lo sviluppo di un'app Weppy ha la semplicità di Flash, Weppy viene fornito con molte funzionalità presenti in Django, come i livelli di dati e l'autenticazione. Pertanto, Weppy è adatto alle app che vanno da estremamente semplici a modestamente sofisticate.

A prima vista, il codice Weppy assomiglia molto al codice Flask o Bottle. Sono necessarie poche istruzioni per ottenere un sito Web di base a percorso singolo attivo e funzionante. I percorsi possono essere descritti tramite decoratori di funzioni (il modo più semplice) o programmaticamente, e la sintassi per farlo è strettamente correlata a Flask / Bottle. I modelli funzionano più o meno allo stesso modo, a parte piccole variazioni di sintassi.

Weppy contrasta con questi altri framework includendo alcune funzionalità che incorporano solo come plug-in o componenti aggiuntivi. Ad esempio, né Flask né Bottle hanno un ORM integrato o un sistema di gestione dei dati. Weppy include un ORM, sebbene basato sul progetto pyDAL piuttosto che sul ben più popolare SQLAlchemy. Weppy supporta anche le migrazioni di schemi, che Django supporta come parte del suo ORM (inoltre, il sistema di migrazione di Django è molto più automatizzato). Sebbene Weppy abbia un meccanismo di estensione, l'elenco dei componenti aggiuntivi ufficialmente approvati è minuscolo, molto più piccolo del catalogo di estensioni per Flask.

Framework più leggeri come Weppy vengono spesso utilizzati per creare API RESTful e Weppy è dotato di funzioni utili a tale scopo. Inserisci un decoratore @service su un percorso e i dati che restituisci vengono automaticamente formattati nella tua scelta di JSON o XML.

Weppy include altre funzionalità che sembrano più in linea con un framework più ampio, ma sono implementate senza ingombro. Esempi: meccanismi di convalida dei dati, gestione dei moduli, memorizzazione nella cache delle risposte e convalida dell'utente. In tutti questi casi, Weppy adotta un approccio "appena sufficiente". Le funzionalità fornite non sono complete come potresti trovare in un framework di dimensioni Django, ma uno sviluppatore non ha bisogno di investire molto lavoro per renderle utili e possono sempre essere estese dopo il fatto.

Un'altra caratteristica presente in Weppy tipicamente associata a un framework più pesante è il supporto all'internazionalizzazione. Le stringhe nei modelli possono essere tradotte in base ai file locali forniti con l'applicazione, che sono semplici dizionari Python. La scelta della lingua può essere impostata anche analizzando la richiesta del browser (ovvero, l'intestazione HTTP Accept-Language) o associando una traduzione a un percorso specifico.

La documentazione di Weppy ha lo stesso sapore del framework stesso. È pulito, leggibile e scritto per essere consumato dagli esseri umani. A parte il solito esempio di app "ciao mondo", include un bel tutorial dettagliato che ti consente di creare un sistema di microblogging come progetto iniziale.

I piani a lungo termine per Weppy includono il supporto di async e socket come entità di primo livello di basso livello. Gli sviluppatori di Weppy prevedono di introdurre queste funzionalità nella versione 2.0 e quindi di richiedere Python 3.7 o superiore per tutte le future versioni di Weppy.

Scorecard Capacità nativa (20%) Gestione (20%) Installazione (20%) Documentazione (20%) Sicurezza (10%) Scalabilità (10%) Punteggio complessivo (100%)
Bottiglia 0.12 8 10 10 8 7 7 8.6
CherryPy 17.0.0 7 9 9 9 8 8 8.4
CubicWeb 3.26.4 10 8 7 10 9 7 8.6
Django 2.1 10 8 8 10 10 10 9.2
Falcon 1.4.1 7 10 8 8 7 7 8.0
Flask 1.0.2 8 9 8 9 8 8 8.4
Piramide 1.9.2 8 8 8 10 9 7 8.4
Tornado 4.3 8 9 9 8 8 7 8.3
Web.py 0.39 8 8 10 8 9 8 8.5
Web2py 2.16.1 10 9 7 10 9 8 8.9
Weppy 1.2.11 10 8 9 9 10 9 9.1
Wheezy.web 0.1.485 9 9 8 8 8 8 8.4
Zope2 2.13.24 10 8 7 9 9 9 8.6