flask design patterns
Aquest tutorial explica alguns dels patrons de disseny de Flask habituals i les pràctiques recomanades a seguir mentre es dissenyen aplicacions web amb exemples:
El disseny d’aplicacions és un aspecte essencial del desenvolupament de programari. Un disseny d’aplicacions no planificat comporta un deute tècnic insalvable. Per tant, sempre que vulguem escalar la nostra aplicació, està bé provar patrons de disseny provats en el temps.
La comunitat Flask té molts exemples d’aquest tipus que us poden inspirar i afectar les vostres decisions de disseny quan vulgueu provar alguns patrons per a la vostra aplicació. Flask és tan desinteressat i flexible que us pot agradar combinar conceptes dels patrons existents i crear-ne un de nou.
=> Visiteu aquí per aprendre Flask des de zero
Què aprendreu:
Patrons de disseny de matràs
Per exemple, Trobareu molts exemples des del patró MVC fins a aplicacions de pàgina única al patró SAAS. Nomeneu el paradigma del disseny, i algú de la comunitat ja ho ha provat i està disponible de manera gratuïta perquè pugueu provar-ho.
A continuació, es detallen alguns dels repositoris que val la pena mirar.
Flusk
Flusk és un exemple que podeu utilitzar per crear aplicacions Flask grans que incloguin SQLAlchemy, Docker i Nginx. Té una bonica separació lògica per crear backend, domini, vistes i models a les seves capes respectives.
Té un ús excel·lent de Flask Blueprints i segueix el patró de disseny de fàbrica. És fàcil crear extensions a Flusk i, a més, és fàcil contenir l’aplicació mitjançant contenidors mitjançant Docker. Mireu-ne el codi font aquí .
Flascó Cookiecutter
Cookiecutter Flask és una plantilla de flascó amb funcions com l’agrupació d’actius i la minificació amb paquets web. Té plantilles d’inici per al registre / autenticació d’usuaris i està basat en Bootstrap 4.
Cookiecutter és una utilitat de línia d'ordres per crear un projecte de paquet Python. Vol dir que si utilitzeu aquesta plantilla, també podeu publicar la vostra aplicació Flask com a PyPI. Aquest projecte està en desenvolupament actiu.
Val la pena avaluar-lo a aquest enllaç .
Flascó ple
Flask full és una caldera més plena de potència que fa ús d’api, MongoEngine, senyals, ordres Shell, WebSocket i eventlet. Està força ben integrat amb els documents de l'API Swagger i els documents Sphinx.
Avalueu aquest projecte com a font. Està disponible gratuïtament aquí .
Flasky
Per crear aplicacions lleugeres, us recomanem que tingueu en compte Flasky. El codi font de Flasky està disponible aquí . Aquest dipòsit va ser creat per Miguel Grinberg, que té més de 25 anys d’experiència en desenvolupament web.
Va crear Flasky per proporcionar exemples de codi per als conceptes comentats al seu llibre anomenat Desenvolupament web Flask .
Sigui quin sigui el marc, la plantilla o la plantilla que trieu, totes elles tenen algunes funcions estàndard i en parlen a la seva manera. Aquí enumerem algunes d'aquestes funcions i les comentem, i les implementem amb Flask-Appbuilder a la nostra aplicació de mostra d'aquesta sèrie de tutorials.
Aquest tutorial tracta alguns patrons més comuns que trobareu a gairebé totes les aplicacions web actuals i que és bo tenir-los al kit d'un desenvolupador web.
Exemple d’inici de sessió de Flask
Una aplicació web sol requerir que els usuaris es registrin i accedeixin a la part restringida de l'aplicació en funció dels privilegis assignats. Els usuaris tenen funcions basades en permisos. Per exemple, un usuari públic no té permís per crear-ne un altre. Tot i això, un usuari d'administrador té aquests permisos.
De vegades, les aplicacions web automatitzen el registre i la creació d’usuaris assignant-los els permisos predeterminats o predeterminats.
Crea l'usuari fora de línia
Creem un usuari mitjançant l'ordre flask fab create-user. Un cop utilitzeu aquesta ordre, rebreu indicacions de línia d'ordres per donar els detalls del compte d'usuari. Doneu els detalls similars als que es mostren a continuació i es crea el vostre usuari.
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.
Fixeu-vos que al final de la sortida de l'ordre, sqla.manager imprimeix missatges de confirmació per a la creació de l'usuari.
Ara accediu a l'aplicació i inicieu la sessió amb les dades que acabeu d'introduir. Si heu creat l’usuari a la base de dades de producció, transmeteu aquestes dades a la persona per a qui heu creat aquest compte.
Aneu a http: // localhost: 8080 / login i veureu el formulari d’inici de sessió com es mostra a continuació.
Un cop l’usuari 1 hagi iniciat la sessió, l’usuari pot veure el missatge de benvinguda.
Crea l'usuari en línia
Pot ser que sigui impossible crear tots els usuaris fora de línia. A més, pot ser que calgui més experiència tècnica per utilitzar l’ordre fab flask create-user a l’entorn de producció. És possible que tingueu un requisit per treure una mica de càrrega de treball a un administrador, a qui la majoria de les vegades tenen la tasca de crear un usuari.
Per tant, a la nostra aplicació web d’exemple, permetem als usuaris registrar-se.
Utilitzem el servei reCAPTCHA de Google per evitar que actors maliciosos accedeixin a les parts restringides de l’aplicació.
En primer lloc, registrem el nostre domini al servei reCAPTCHA de Google i adquirim la clau SITE i la clau SECRET.
Pas 1: Instal·leu Flask-Mail mitjançant l'ordre següent.
pip install Flask-Mail
Aneu a https://www.google.com/recaptcha/intro/v3.html i inicieu la sessió com a administrador mitjançant el vostre compte de Google.
Pas 2: Trieu el tipus de reCaptcha.
Pas 3: proporcioneu el domini per al qual voleu utilitzar reCaptcha de Google.
A més, afegiu el localhost a la llista de dominis permesos per a aquesta clau i accepteu els termes i envieu-los. Podeu eliminar-la més tard després de desenvolupar aquesta funció.
Pas 4: Anoteu la clau del lloc, que també es coneix com a clau pública.
Pas 5: Anoteu la clau SECRET que també es coneix com a clau privada.
Un cop anoteu les claus tal i com s'ha esmentat anteriorment, és millor guardar-les en un lloc on es puguin consultar i llegir a la configuració. Per a aquest tutorial, hem desat els valors com a variables d'entorn com SITE_KEY i SECRET_KEY.
Ara obriu config.py i actualitzeu-lo com es mostra a continuació.
# 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'
És possible que hagueu d’habilitar un accés menys segur al vostre compte de Google. Habiliteu l'accés al compte als URL següents si teniu problemes de correu electrònic.
- https://accounts.google.com/DisplayUnlockCaptcha
- https://support.google.com/mail/?p=BadCredentials
Ara, a la pàgina d’inici de sessió, podem veure un botó de registre d’usuari addicional. Un cop feu clic al registre, podem veure molts camps juntament amb el repte reCaptcha.
Un cop us registreu amb el vostre correu electrònic i passareu el repte reCaptcha, veureu un missatge de confirmació, tal com es mostra a continuació.
Si el correu electrònic que vau proporcionar durant el registre és vàlid, rebreu el correu electrònic d’activació del compte similar al que es mostra a la imatge següent.
Administrador de Flask
Si heu llegit els altres tutorials d’aquesta sèrie de tutorials de Flask, notareu que hem aprofitat la seguretat integrada que inclou Flask-Appbuilder. Les visualitzacions que hem afegit mitjançant add_view_no_menu no estan protegides. Tot i això, les visualitzacions que hem afegit basades en DataModels es protegeixen automàticament per a un usuari administrador.
Alternativament, podríem fer servir Flask-Admin, que majoritàriament hauria aconseguit un resultat similar. Flask-Admin també, definim les visualitzacions de manera orientada a objectes. Una pàgina web al frontend representa un mètode en una classe de visualització que afegim explícitament a la interfície.
En aquest tutorial, no fem servir Flask-Admin. En lloc d’això, prenem el camí d’aconseguir els mateixos resultats amb més velocitat i saltant-nos la necessitat de conèixer la construcció de seguretat al voltant de l’inici de sessió, autenticacions, rols i permisos. Va ser possible ja que vam utilitzar Flask-Appbuilder.
Tant Flask-Appbuilder com Flask-Admin tenen els seus pros i els seus contres. En el cas de Flask-Admin, hem de saber que no hi ha supòsits de seguretat existents i que podeu crear aplicacions segons el vostre model de seguretat. Per obtenir més informació sobre Flask-Admin, visiteu aquí i passa per exemples adequats.
Càrrega del fitxer Flask
Actualment, pràcticament totes les aplicacions web tenen els requisits d’emmagatzemar i publicar fitxers. Un patró típic per a ells és desar els fitxers en un camí del servidor, amb alguna informació per fer l'operació al fitxer emmagatzemat i guardar-la als models d'aplicacions i a les vistes.
Anem a treballar en un exemple similar. Modifiquem el nostre model de cançó amb funcions addicionals.
Al fitxer models.py introduïu el codi següent.
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))
Hem modificat el nostre model de cançó creat anteriorment afegint una nova columna de tipus FileColumn. A més, hem afegit dues columnes més que s'afegiran a SongsView per mostrar el nom del fitxer i un enllaç per descarregar el fitxer carregat.
S'ha utilitzat el mètode Flask url_for juntament amb el marcatge per mostrar la baixada com a enllaç. A més, hem utilitzat el mètode get_file_original_name de Flask-Appbuilder ja que el nom del fitxer s’emmagatzema concatenant-lo amb un UUID per evitar col·lisions entre els mateixos noms de fitxers.
Modifiqueu views.py amb el codi que es mostra a continuació per actualitzar el SongsView corresponent.
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')
A la classe SongsView, hem esmentat les etiquetes noves que cal mostrar i volem enumerar només les columnes esmentades a la llista especificada.
Aquí heu de recordar que hem modificat un model de base de dades afegint una columna al model. La taula corresponent de la base de dades no té aquesta nova columna. Per tant, eliminarem el fitxer app.db, ja que estem treballant a la base de dades SQLite des de l’últim tutorial.
Com a alternativa, també podríem utilitzar l'ordre flask db migrate i fer els canvis necessaris al fitxer de versió i utilitzar l'actualització de flask db per actualitzar la taula. No obstant això, el canvi que hem introduït és mínim i podem recrear la base de dades de l'aplicació i l'usuari.
Us recomanem que, durant la producció, tingueu en compte l'ús de les ordres Flask-Migrate sempre que feu canvis a l'esquema de base de dades de l'aplicació.
Utilitzeu les ordres següents per eliminar el fitxer de base de dades i tornar a crear l'usuari administrador.
rm app.db flask fab create-db flask fab create-admin
Ara inicieu sessió a l'aplicació amb les credencials d'administració i veureu el SongsView modificat tal com es mostra a la imatge següent.
Afegiu una cançó amb un fitxer.
Un cop hàgiu desat el fitxer, les columnes de la vista es mostraran com es mostra a continuació.
Tingueu en compte els valors següents a config.py. Els fitxers carregats s’emmagatzemaran en aquest camí al servidor. Per a aquest tutorial, es penjarà a la màquina on desenvolupem aquesta aplicació de mostra.
Comproveu el camí de pujada, tal com s'esmenta a config.py. Els fitxers s’emmagatzemen amb els UUID, tal com es mostra a continuació.
Flascó HTTPS
Pel que fa al desenvolupament, podem continuar executant la nostra aplicació Flask sense HTTPS. Des del punt de vista de la seguretat, HTTPS garanteix que la comunicació es produeixi entre client i servidor legítims.
Aquesta comunicació xifrada requereix que s’estableixi confiança entre un client i un servidor, mitjançant un certificat signat per la CA amb un parell de claus públiques i privades. Llegiu-ne més informació aquí
En aquest tutorial, us farem saber els mètodes per desenvolupar llocs web basats en Flask mitjançant HTTP durant el desenvolupament.
La forma més ràpida i senzilla d'incloure HTTPS durant el desenvolupament és utilitzar un ssl_context adhoc, tal com s'esmenta a continuació a run.py. Tot i això, instal·leu pyopenssl mitjançant pip a l’entorn.
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context='adhoc')
Després d’afegir ssl_context, quan navegueu a https: // localhost: 8080 /, rebreu un avís que us generarà dubtes sobre la validesa del certificat que s’utilitza en aquesta comunicació. A més, la navegació a http: // localhost: 8080 / ja no funcionarà.
Per tant, aquest enfocament és una mica feixuc i us requerirà que continueu acceptant aquesta sol·licitud sempre que reinicieu el servidor de desenvolupament.
Per continuar treballant, heu de fer clic a l'accés no segur, tal com es mostra a continuació.
Com a alternativa, per desenvolupar-vos amb les funcions https, podem passar el camí al certificat i la clau en una tupla Python al paràmetre ssl_context del mètode d'execució. Tot i això, per adoptar aquest enfocament, haureu de generar un certificat autosignat i una clau mitjançant l'ordre següent.
openssl req -x509 -newkey rsa:4096 -nodes -out mycert.pem -keyout mykey.pem -days 365
Doneu els valors adequats per a les consultes realitzades.
Hem deixat tots els valors per defecte. Ara atureu el servidor de desenvolupament i passeu el certificat de camí d'accés i el camí clau com es mostra a continuació.
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context=('mycert.pem', 'mykey.pem'))
Aquest enfocament també és similar al mètode anterior d’utilitzar Adhoc ssl_context. No obstant això, en aquest cas, els detalls persisteixen durant més temps. Hem esmentat 365 dies. Podeu especificar la caducitat fins als dies que necessiteu. A més, aquests fitxers es poden compartir amb els altres membres de l'equip si esteu desenvolupant-vos en equip.
A l’entorn de producció, els certificats són emesos per la CA i Miguel Grinberg discuteix alguns casos d’ús aquí . Us recomanem que llegiu més detalls en aquesta pàgina.
Conclusió
En aquest tutorial, hem parlat d'alguns patrons que segueixen els desenvolupadors web mentre desenvolupen funcions relacionades amb Flask Login, Flask Admin, Flask File Upload i Flask HTTPS. Hem proporcionat exemples de codi i els lectors també poden provar-ho.
Al nostre següent tutorial, tractarem els conceptes d’estendre Flask i veurem com crear funcions basades en l’API REST. A més, parlarem de com podem utilitzar l'API de Twitter a Flask.
Preguntes i respostes d’entrevistes de bases de dades sql
=> Exploreu aquí la sèrie d'entrenament de Flask
Lectura recomanada
- Patrons de disseny a Java: Singleton, Factory i Builder
- Python Flask Tutorial: Introducció a Flask per a principiants
- Tutorial API de Flask amb exemple | Ampliant Flask amb API
- Aplicació de Flask i disseny del projecte Flask amb Blueprint & Bootstrap
- Django Vs Flask Vs Node: quin marc triar
- Top 31 de les preguntes més populars amb entrevistes de Python Flask amb respostes
- Top 10 eines de disseny de bases de dades per crear models de dades complexos
- Les 11 principals tendències en disseny UI / UX: què esperar el 2021 i més enllà