flask design patterns
Questo tutorial spiega alcuni dei modelli di progettazione Flask comuni e le migliori pratiche da seguire durante la progettazione di applicazioni Web con esempi:
La progettazione dell'applicazione è un aspetto essenziale dello sviluppo del software. Una progettazione di un'applicazione non pianificata si traduce in un debito tecnico insormontabile. Pertanto, ogni volta che vogliamo ridimensionare la nostra applicazione, allora va bene provare modelli di progettazione testati nel tempo.
La comunità di Flask ha molti di questi esempi che possono ispirarti e influenzare le tue decisioni di progettazione quando vuoi provare alcuni modelli per la tua applicazione. Flask è così disinvolto e flessibile che potresti voler combinare concetti dai modelli esistenti e crearne uno nuovo.
=> Visita qui per imparare Flask da zero
Cosa imparerai:
Modelli di progettazione boccetta
Per esempio, Troverai molti esempi dal pattern MVC alle applicazioni a pagina singola al pattern SAAS. Dai un nome al paradigma del design, ed è già lì provato da qualcuno nella comunità ed è disponibile gratuitamente per te per provare le tue mani.
Di seguito sono elencati alcuni dei repository che vale la pena guardare.
Flusk
Flusk è un esempio che puoi utilizzare per creare grandi applicazioni Flask che includono SQLAlchemy, Docker e Nginx. Ha una bellissima separazione logica per creare backend, dominio, viste e modelli nei rispettivi livelli.
Ha un uso eccellente di Flask Blueprints e segue il modello di progettazione Factory. È facile creare estensioni in Flusk ed è ancora più semplice containerizzare l'applicazione utilizzando Docker. Dai un'occhiata al suo codice sorgente Qui .
Boccetta Cookiecutter
Cookiecutter Flask è un modello di fiasco con funzionalità come raggruppamento di risorse e minimizzazione con webpack. Ha modelli di avvio per la registrazione / autenticazione dell'utente ed è basato su Bootstrap 4.
Cookiecutter è un'utilità della riga di comando per creare un progetto di pacchetto Python. Significa che se usi questo modello, puoi pubblicare anche la tua applicazione Flask come PyPI. Questo progetto è in fase di sviluppo attivo.
Vale la pena valutare a questo link .
Pallone pieno
Flask full è un altro boilerplate potente che utilizza Celery, MongoEngine, Signals, comandi Shell, WebSocket ed eventlet. È abbastanza ben integrato con la documentazione dell'API Swagger e la documentazione di Sphinx.
Valuta questo progetto come fonte. È disponibile gratuitamente Qui .
Flasky
Per creare applicazioni leggere, potresti prendere in considerazione Flasky. Il codice sorgente di Flasky è disponibile Qui . Questo repository è stato creato da Miguel Grinberg, che ha oltre 25 anni di esperienza nello sviluppo web.
Ha creato Flasky per fornire esempi di codice per i concetti discussi nel suo libro chiamato Sviluppo Web Flask .
Qualunque sia il Framework o il modello che scegli, tutti questi hanno alcune funzionalità standard e ne parlano a modo loro. Di seguito elenchiamo alcune di queste funzionalità e le discutiamo e implementiamo quelle che utilizzano Flask-Appbuilder nella nostra applicazione di esempio di questa serie di tutorial.
Questo tutorial discute alcuni modelli più comuni che troverai in quasi tutte le applicazioni web oggi e che è bello avere nel kit di uno sviluppatore web.
Esempio di accesso a Flask
Un'applicazione Web di solito richiede agli utenti di registrarsi e accedere alla parte riservata dell'applicazione in base ai privilegi assegnati. Gli utenti hanno ruoli basati sulle autorizzazioni. Per esempio, un utente pubblico non dispone dell'autorizzazione per creare un altro utente. Tuttavia, un utente amministratore dispone di tali autorizzazioni.
A volte, le applicazioni Web automatizzano la registrazione dell'utente e la creazione dell'utente assegnando loro le autorizzazioni predefinite o predefinite.
Crea utente offline
Creiamo un utente utilizzando il comando flask fab create-user. Dopo aver utilizzato questo comando, verranno visualizzati i prompt della riga di comando per fornire i dettagli dell'account utente. Fornisci dettagli simili a quelli mostrati di seguito e il tuo utente è creato.
Role [Public]: Username: user1 User first name: User1 User last name: Last1 Email: user1@sthwebsite.com Password: Repeat for confirmation: ## various logs 2020-06-21 13:55:01,053:INFO:flask_appbuilder.security.sqla.manager:Added user user1 User user1 created.
Si noti che alla fine dell'output del comando, sqla.manager stampa i messaggi di conferma per la creazione dell'utente.
Ora accedi all'applicazione e accedi con i dettagli che hai appena inserito. Se hai creato l'utente nel database di produzione, trasmetti questi dettagli alla persona per la quale hai creato questo account.
Passa a http: // localhost: 8080 / login e vedrai il modulo di accesso come mostrato di seguito.
Una volta che l'utente1 effettua l'accesso, l'utente può visualizzare il messaggio di benvenuto.
Crea utente online
Potrebbe essere impossibile per noi creare tutti gli utenti offline. Inoltre, potrebbe essere necessaria una maggiore esperienza tecnica per utilizzare il comando flask fab create-user nell'ambiente di produzione. Potrebbe essere richiesto di rimuovere un po 'di carico di lavoro da un amministratore, che è il più delle volte incaricato della creazione dell'utente.
Pertanto, nella nostra applicazione web di esempio, permettiamo agli utenti di registrarsi.
Utilizziamo il servizio reCAPTCHA di Google per impedire a malintenzionati di accedere alle parti limitate dell'applicazione.
Innanzitutto, registriamo il nostro dominio sul servizio reCAPTCHA di Google e acquisiamo la chiave SITE e la chiave SECRET.
Passo 1: Installa Flask-Mail utilizzando il comando seguente.
pip install Flask-Mail
Vai a https://www.google.com/recaptcha/intro/v3.html e accedi come amministratore utilizzando il tuo account Google.
Passo 2: Scegli il tipo di reCaptcha.
Passaggio 3: fornisci il dominio per il quale desideri utilizzare reCaptcha di Google.
Inoltre, aggiungi l'host locale nell'elenco dei domini consentiti per questa chiave, accetta i termini e inviali. Puoi rimuoverlo in seguito dopo lo sviluppo di questa funzione.
Passaggio 4: Annotare la SITE KEY, nota anche come chiave pubblica.
Passaggio 5: Annotare la CHIAVE SEGRETA, nota anche come chiave privata.
Una volta annotate le chiavi come menzionato sopra, è meglio memorizzarle in un luogo in cui possono essere consultate e lette nella configurazione. Per questo tutorial, abbiamo salvato i valori come variabili di ambiente come SITE_KEY e SECRET_KEY.
Ora apri il file config.py e aggiornalo come mostrato di seguito.
# Will allow user self registration AUTH_USER_REGISTRATION = True# The default user self registration role AUTH_USER_REGISTRATION_ROLE = 'Public'# Config for Flask-WTF Recaptcha necessary for user registration RECAPTCHA_PUBLIC_KEY = os.environ.get('SITE_KEY', None) RECAPTCHA_PRIVATE_KEY = os.environ.get('SECRET_KEY', None) # Config for Flask-Mail necessary for user registration MAIL_PORT = 587 MAIL_USE_SSL = False MAIL_SERVER = 'smtp.gmail.com' MAIL_USE_TLS = True MAIL_USERNAME = 'sthtestmail@gmail.com' MAIL_PASSWORD = 'Passw0rdqwerty' MAIL_DEFAULT_SENDER = 'sthtestmail0@gmail.com'
Potrebbe essere necessario abilitare un accesso meno sicuro al tuo account Google. Abilita l'accesso all'account agli URL seguenti se rimani bloccato in problemi relativi alla posta elettronica.
- https://accounts.google.com/DisplayUnlockCaptcha
- https://support.google.com/mail/?p=BadCredentials
Ora nella pagina di accesso, possiamo vedere un pulsante di registrazione utente aggiuntivo. Dopo aver fatto clic sulla registrazione, possiamo vedere molti campi insieme alla sfida reCaptcha.
Dopo esserti registrato con la tua email e aver superato la sfida reCaptcha, vedrai un messaggio di conferma, come mostrato di seguito.
Se l'e-mail che hai fornito durante la registrazione è valida, riceverai l'e-mail di attivazione dell'account simile a quella mostrata nell'immagine sottostante.
Amministratore Flask
Se hai letto gli altri tutorial in questa serie di tutorial Flask, noterai che abbiamo sfruttato la sicurezza integrata fornita con Flask-Appbuilder. Le visualizzazioni che abbiamo aggiunto utilizzando add_view_no_menu non sono protette. Tuttavia, le visualizzazioni che abbiamo aggiunto in base a DataModels sono automaticamente protette per un utente amministratore.
In alternativa, potremmo utilizzare Flask-Admin, che per lo più avrebbe ottenuto un risultato simile. Anche Flask-Admin, definiamo le visualizzazioni in modo orientato agli oggetti. Una pagina web sul frontend rappresenta un metodo su una classe di visualizzazione che aggiungiamo esplicitamente all'interfaccia.
In questo tutorial, non utilizziamo Flask-Admin. Invece, intraprendiamo la strada per ottenere gli stessi risultati con più velocità e saltare la necessità di conoscere la sicurezza costruita intorno a Login, Auths, Roles e Permessi. È stato possibile poiché abbiamo utilizzato Flask-Appbuilder.
Sia Flask-Appbuilder che Flask-Admin hanno i loro pro e contro. Nel caso di Flask-Admin, dobbiamo sapere che non ci sono presupposti di sicurezza esistenti e puoi creare app in base al tuo modello di sicurezza. Per saperne di più su Flask-Admin, visita Qui e passare attraverso esempi appropriati.
Caricamento file pallone
Quasi tutte le applicazioni web oggigiorno hanno i requisiti per archiviare e servire file. Un modello tipico per loro è salvare i file in un percorso sul Server, con alcune informazioni per eseguire l'operazione sul file memorizzato e mantenerli in Modelli e viste dell'applicazione.
Lavoreremo su un esempio simile. Modifichiamo il nostro modello di brano con funzionalità aggiuntive.
Nel file models.py inserisci il seguente codice.
from flask import Markup, url_for from flask_appbuilder.models.mixins import FileColumn from flask_appbuilder.filemanager import get_file_original_name from flask_appbuilder import Model from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship class Song(Model): id = Column(Integer, primary_key=True) title = Column(String(200), nullable=False) rating = Column(Integer) album_id = Column(Integer, ForeignKey('album.id')) # for storing MP3 file of the song song_file = Column(FileColumn, nullable=False) album = relationship('Album') def __str__(self): return self.title def download(self): return Markup( ' Download ' ) def file_name(self): return get_file_original_name(str(self.song_file))
Abbiamo modificato il nostro modello di Song creato in precedenza aggiungendo una nuova colonna di tipo FileColumn. Inoltre, abbiamo aggiunto altre due colonne che verranno aggiunte a SongsView per visualizzare il nome del file e un collegamento per scaricare il file caricato.
Il metodo Flask url_for è stato utilizzato insieme a Markup per visualizzare il download come collegamento. Inoltre, abbiamo utilizzato il metodo get_file_original_name da Flask-Appbuilder poiché il nome del file viene memorizzato concatenandolo con un UUID per evitare collisioni tra gli stessi nomi di file.
Modificare views.py con il codice indicato di seguito per aggiornare il SongsView corrispondente.
class SongsView(ModelView): datamodel = SQLAInterface(Song) label_columns = {'file_name' : 'File Name', 'download': 'Download'} list_columns = ['title', 'file_name', 'download'] show_columns = ['title', 'file_name', 'download']
Nella classe SongsView, abbiamo menzionato le nuove etichette che devono essere visualizzate e vogliamo elencare solo le colonne menzionate nell'elenco specificato.
Qui è necessario ricordare che abbiamo modificato un modello di database aggiungendo una colonna al modello. La tabella corrispondente nel database non ha questa nuova colonna. Pertanto, rimuoveremo il file app.db, poiché stiamo lavorando sul database SQLite dall'ultimo tutorial.
In alternativa, potremmo anche utilizzare il comando flask db migrate e apportare le modifiche necessarie al file della versione e utilizzare flask db upgrade per aggiornare la tabella. Tuttavia, la modifica che abbiamo introdotto è minima e possiamo ricreare il database dell'applicazione e l'utente.
Si consiglia in produzione di considerare l'utilizzo dei comandi Flask-Migrate ogni volta che si apportano modifiche allo schema del database dell'applicazione.
Utilizzare i comandi seguenti per rimuovere il file di database e creare nuovamente l'utente amministratore.
rm app.db flask fab create-db flask fab create-admin
Ora accedi all'applicazione con le credenziali di amministratore e vedrai SongsView modificato come mostrato nell'immagine sottostante.
Aggiungi una canzone con un file.
Dopo aver salvato il file, le colonne nella vista appariranno come mostrato di seguito.
Notare i seguenti valori in config.py. I file caricati verranno archiviati in questo percorso sul server. Per questo tutorial, verrà caricato sulla macchina su cui stiamo sviluppando questa applicazione di esempio.
Controlla il percorso di caricamento, come menzionato in config.py. I file vengono memorizzati con l'UUID, come mostrato di seguito.
Flask HTTPS
Per quanto riguarda lo sviluppo, possiamo continuare a eseguire la nostra applicazione Flask in esecuzione senza HTTPS. Dal punto di vista della sicurezza, HTTPS garantisce che la comunicazione avvenga tra client e server legittimi.
Questa comunicazione crittografata richiede che venga stabilita una fiducia tra un client e un server, utilizzando un certificato firmato da una CA con una coppia di chiavi pubbliche e private. Si prega di leggere di più al riguardo Qui
In questo tutorial, ti faremo conoscere i metodi per sviluppare siti Web basati su Flask utilizzando HTTP durante lo sviluppo.
Il modo più rapido e semplice per includere HTTPS durante lo sviluppo è utilizzare un ssl_context ad hoc, come indicato di seguito in run.py. Tuttavia, installa pyopenssl usando pip nell'ambiente.
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context='adhoc')
Dopo aver aggiunto ssl_context, quando si accede a https: // localhost: 8080 /, verrà visualizzato un avviso che solleva dubbi sulla validità del certificato utilizzato in questa comunicazione. Inoltre, la navigazione su http: // localhost: 8080 / non funzionerà più.
Pertanto, questo approccio è un po 'macchinoso e richiederà di continuare ad accettare questa richiesta ogni volta che riavvii il server di sviluppo.
È necessario fare clic su accesso non sicuro per continuare a lavorare, come mostrato di seguito.
In alternativa, per sviluppare con le funzionalità https, possiamo passare il percorso al certificato e la chiave in una tupla Python al parametro ssl_context nel metodo run. Tuttavia, per adottare questo approccio, dovrai generare un certificato autofirmato e una chiave utilizzando il comando seguente.
openssl req -x509 -newkey rsa:4096 -nodes -out mycert.pem -keyout mykey.pem -days 365
Fornire valori appropriati per le query richieste.
Abbiamo lasciato tutti i valori predefiniti. Ora arresta il server di sviluppo e passa il certificato del percorso e il percorso della chiave come mostrato di seguito.
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context=('mycert.pem', 'mykey.pem'))
Questo approccio è anche simile al metodo precedente di utilizzo di Adhoc ssl_context. Tuttavia, in questo caso, i dettagli persistono per un tempo più lungo. Abbiamo parlato di 365 giorni. Puoi specificare la scadenza ai giorni che ti servono. Inoltre, questi file possono essere condivisi con gli altri membri del team se stai sviluppando in un team.
Nell'ambiente di produzione, i certificati vengono emessi dalla CA e Miguel Grinberg discute alcuni casi d'uso Qui . Ti consigliamo di leggere maggiori dettagli in quella pagina.
Conclusione
In questo tutorial, abbiamo discusso alcuni modelli che gli sviluppatori Web seguono durante lo sviluppo di funzionalità relative a Flask Login, Flask Admin, Flask File Upload e Flask HTTPS. Abbiamo fornito esempi di codice e anche i lettori possono provarlo.
Nel nostro prossimo tutorial, tratteremo i concetti di estensione di Flask e vedremo come creare funzionalità basate su API REST. Inoltre, discuteremo di come utilizzare l'API di Twitter all'interno di Flask.
dove si trova la chiave di sicurezza di rete
=> Esplora la serie Flask Training qui
Lettura consigliata
- Modelli di design in Java: Singleton, Factory e Builder
- Python Flask Tutorial - Introduzione a Flask per principianti
- Esercitazione sull'API Flask con esempio | Flask estensibile con API
- Flask App e layout del progetto Flask con Blueprint e Bootstrap
- Django Vs Flask Vs Node: quale framework selezionare
- Le 31 domande più popolari dell'intervista a Python Flask con risposte
- I 10 migliori strumenti di progettazione di database per creare modelli di dati complessi
- Le 11 principali tendenze di design dell'interfaccia utente / UX: cosa aspettarsi nel 2021 e oltre