flask design patterns
Denna handledning förklarar några av de vanliga flaskdesignmönstren och de bästa metoderna att följa när du utformar webbapplikationer med exempel:
Applikationsdesign är en viktig aspekt av mjukvaruutveckling. En oplanerad applikationsdesign resulterar i oöverstigliga tekniska skulder. Därför, när vi vill skala vår applikation, är det okej att testa tidstestade designmönster.
Flaskgemenskapen har många sådana exempel som kan inspirera dig och påverka dina designbeslut när du vill prova några mönster för din applikation. Flaskan är så oönskad och flexibel att du kanske vill kombinera koncept från befintliga mönster och skapa ett nytt.
=> Besök här för att lära dig kolven från grunden
Vad du kommer att lära dig:
Flaskdesignmönster
Till exempel, Du hittar många exempel från MVC-mönstret till enstaka sidapplikationer till SAAS-mönster. Du heter designparadigmet och det är redan där försökt av någon i samhället och är fritt tillgängligt för dig att prova på.
Nedan finns några av förvaren som är värda att titta på.
Flusk
Flusk är ett exempel som du kan använda för att skapa stora Flask-applikationer som inkluderar SQLAlchemy, Docker och Nginx. Den har en vacker logisk separation för att skapa backend, domän, vyer och modeller i sina respektive lager.
Den har utmärkt användning av flaskritningar och följer fabriksmönstret. Det är enkelt att skapa tillägg i Flusk och det är dessutom lätt att containerisera applikationen med Docker. Ta en titt på källkoden här .
Cookiecutter-kolv
Cookiecutter Flask är en kolvmall med funktioner som tillgångsbuntning och minifiering med webbpaket. Den har startmallar för användarregistrering / autentisering och bygger på Bootstrap 4.
Cookiecutter är ett kommandoradsverktyg för att skapa ett Python-paketprojekt. Det betyder att om du använder den här mallen kan du också publicera din Flask-applikation som PyPI. Detta projekt är under aktiv utveckling.
Det är värt att utvärdera på den här länken .
Kolv full
Flask full är ytterligare en kraftfull pannplatta som använder Selleri, MongoEngine, Signaler, Shell-kommandon, WebSocket och eventlet. Det är ganska bra integrerat med Swagger API-dokument och Sphinx-dokument.
Utvärdera detta projekt som dess källa. Det är fritt tillgängligt här .
Flaskig
För att skapa lätta applikationer kanske du vill överväga Flasky. Flaskys källkod är tillgänglig här . Detta arkiv skapades av Miguel Grinberg, som har över 25 års erfarenhet av webbutveckling.
Han skapade Flasky för att ge kodexempel för de begrepp som diskuteras i sin bok Flask webbutveckling .
Oavsett vilket ramverk eller mall du väljer, alla dessa har några standardfunktioner och pratar om dem på sina egna sätt. Vi listar här några av dessa funktioner och diskuterar dem och implementerar dem som använder Flask-Appbuilder i vår exempelapplikation av denna handledningsserie.
Denna handledning diskuterar några vanligare mönster som du hittar i nästan alla webbapplikationer idag och är trevliga att ha i en webbutvecklare.
Exempel på kolvinloggning
En webbapplikation kräver vanligtvis att användare registrerar sig och får åtkomst till den begränsade delen av applikationen baserat på de tilldelade behörigheterna. Användarna har behörighetsbaserade roller. Till exempel, en offentlig användare har inte behörighet att skapa en annan användare. En administratörsanvändare har dock dessa behörigheter.
Ibland automatiserar webbapplikationer användarregistreringen och användarskapandet genom att tilldela dem standard- eller fördefinierade behörigheter.
Skapa användare offline
Låt oss skapa en användare med hjälp av flaskan fab create-user-kommandot. När du väl har använt det här kommandot får du kommandoradsuppmaningar för att ge information om användarkontot. Ge detaljer som liknar dem som visas nedan, och din användare skapas.
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.
Observera att i slutet av kommandoutmatningen skriver sqla.manager ut bekräftelsemeddelanden för användarskapande.
Gå nu till applikationen och logga in med informationen som du just angav. Om du har skapat användaren i produktionsdatabasen, skicka sedan informationen till den person för vilken du skapade det här kontot.
Navigera till http: // localhost: 8080 / login, så ser du inloggningsformuläret som visas nedan.

När användaren1 loggar in kan användaren se välkomstmeddelandet.

Skapa användare online
Det kan vara omöjligt för oss att skapa alla användare offline. Dessutom kan det kräva mer teknisk expertis för att använda kolven fab create-user-kommando i produktionsmiljön. Du kan få ett krav på att ta bort en del arbetsbelastning från en administratör, som oftast har till uppgift att skapa användaren.
Låt oss därför i vårt exempel på webbapplikation tillåta användare att registrera sig själva.
Vi använder Googles reCAPTCHA-tjänst för att förhindra skadliga aktörer från att komma åt de begränsade delarna av applikationen.
Låt oss först registrera vår domän på Googles reCAPTCHA-tjänst och förvärva SITE-nyckeln och SECRET-nyckeln.
Steg 1: Installera Flask-Mail med kommandot nedan.
pip install Flask-Mail
Gå till https://www.google.com/recaptcha/intro/v3.html och logga in som administratör med ditt Google-konto.
Steg 2: Välj typ av reCaptcha.

Steg 3: Ge den domän som du vill använda Googles reCaptcha för.
Lägg också till localhost i listan över tillåtna domäner för den här nyckeln och acceptera villkoren och skicka dem. Du kan ta bort det senare efter utvecklingen av den här funktionen.
Steg 4: Notera SITE KEY som också är känd som en offentlig nyckel.

Steg 5: Anteckna SECRET KEY som också kallas en privat nyckel.

När du väl noterat tangenterna som nämnts ovan är det bäst att lagra dem på en plats där dessa kan hänvisas och läsas i konfigurationen. För den här självstudien har vi sparat värdena som miljövariabler som SITE_KEY och SECRET_KEY.
Öppna nu config.py och uppdatera det enligt nedan.
# 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'
Du kan behöva aktivera mindre säker åtkomst till ditt Google-konto. Aktivera kontoåtkomst på nedanstående webbadresser om du fastnar i några e-postrelaterade problem.

- https://accounts.google.com/DisplayUnlockCaptcha
- https://support.google.com/mail/?p=BadCredentials
Nu på inloggningssidan kan vi se en ytterligare registreringsknapp för användare. När du klickar på registrering kan vi se många fält tillsammans med reCaptcha Challenge.

När du registrerar dig med din e-post och klarat reCaptcha-utmaningen kommer du att se ett bekräftelsemeddelande, som visas nedan.

Om e-postmeddelandet som du gav under registreringen är giltigt kommer du att få e-postmeddelandet för aktivering av kontot som liknar det som visas i bilden nedan.

Kolvadmin
Om du har läst de andra självstudierna i denna Flask-handledningsserie kommer du att märka att vi har utnyttjat den inbyggda säkerheten som kommer med Flask-Appbuilder. Synpunkterna som vi har lagt till med hjälp av add_view_no_menu är inte skyddade. De synpunkter som vi har lagt till baserade på DataModels skyddas dock automatiskt för en administratörsanvändare.
Alternativt skulle vi kunna använda Flask-Admin, som mest skulle ha uppnått ett liknande resultat. Flask-Admin också, låt oss definiera vyer på ett objektorienterat sätt. En webbsida på frontend representerar en metod på en visningsklass som vi uttryckligen lägger till i gränssnittet.
I denna handledning använder vi inte Flask-Admin. Istället tar vi vägen att uppnå samma resultat med mer hastighet och hoppa över behovet av att veta om säkerhetsbyggnad kring inloggning, Auths, roller och behörigheter. Det var möjligt eftersom vi använde Flask-Appbuilder.
Både Flask-Appbuilder och Flask-Admin har sina fördelar och nackdelar. När det gäller Flask-Admin måste vi veta att det inte finns några befintliga säkerhetsantaganden och att du kan skapa appar baserat på din säkerhetsmodell. För mer information om Flask-Admin, besök här och gå igenom lämpliga exempel.
Flaskfil uppladdning
Nästan alla webbapplikationer har idag krav på att lagra och betjäna filer. Ett typiskt mönster för dem är att spara filerna på en sökväg på servern, med lite information för att utföra operationen på den lagrade filen och behålla i applikationsmodeller och vyer.
Vi ska arbeta med ett liknande exempel. Låt oss ändra vår sångmodell med ytterligare funktioner.
Ange följande kod i filen models.py.
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))
Vi har modifierat vår tidigare skapade Song-modell genom att lägga till en ny kolumn av typen FileColumn. Dessutom har vi lagt till ytterligare två kolumner som kommer att läggas till i SongsView för att visa filnamnet och en länk för att ladda ner den uppladdade filen.
Flask url_for-metoden har använts tillsammans med Markup för att visa nedladdningen som en länk. Vi har också använt metoden get_file_original_name från Flask-Appbuilder eftersom filnamnet lagras genom att sammanfoga det med ett UUID för att undvika kollisioner mellan samma filnamn.
Ändra views.py med koden nedan för att uppdatera motsvarande SongsView.
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')
I SongsView-klassen har vi nämnt de nya etiketterna som behöver visas och vi vill bara lista de kolumner som nämns i den angivna listan.
Här måste du komma ihåg att vi har modifierat en databasmodell genom att lägga till en kolumn i modellen. Motsvarande tabell i databasen har inte den här nya kolumnen. Därför tar vi bort app.db-filen, eftersom vi arbetar med SQLite-databasen sedan den senaste självstudien.
Alternativt kan vi också använda kommandot flask db migrate och göra nödvändiga ändringar i versionsfilen och använda flask db-uppgradering för att uppdatera tabellen. Ändringen vi införde är dock minimal och vi kan återskapa applikationsdatabasen och användaren.
Vi rekommenderar att du i produktionen överväger att använda kommandona Flask-Migrate när du gör några ändringar i databasschemat för din applikation.
Använd kommandona nedan för att ta bort databasfilen och skapa administratörsanvändaren igen.
rm app.db flask fab create-db flask fab create-admin
Logga nu in i applikationen med administratörsuppgifterna så ser du den modifierade SongsView som visas i bilden nedan.

Lägg till en låt med en fil.

När du har sparat filen ser kolumnerna i vyn ut som visas nedan.

Lägg märke till följande värden i config.py. De uppladdade filerna lagras på den här sökvägen på servern. För den här självstudien laddas den upp till den maskin som vi utvecklar denna exempelapplikation på.
Kontrollera uppladdningsvägen, som nämns i config.py. Filerna lagras med UUID: erna, som visas nedan.

Kolv HTTPS
När det gäller utveckling kan vi fortsätta att köra vår flaskapplikation utan HTTPS. Ur säkerhetssynpunkt ser HTTPS till att kommunikation sker mellan legitim klient och server.
Denna krypterade kommunikation kräver att förtroende skapas mellan en klient och en server med hjälp av ett CA-signerat certifikat med ett par offentliga och privata nycklar. Läs mer om det här
I den här handledningen kommer vi att informera dig om metoderna för att utveckla flaskbaserade webbplatser som använder HTTP under utvecklingen.
Det snabbaste och enklaste sättet att inkludera HTTPS under utvecklingen är att använda en adhoc ssl_context, som nämns nedan i run.py. Installera dock pyopenssl med pip i miljön.
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context='adhoc')
När du har lagt till ssl_context, när du navigerar till https: // localhost: 8080 /, får du en varning som väcker tvivel om giltigheten för certifikatet som används i denna kommunikation. Dessutom fungerar inte navigering till http: // localhost: 8080 / längre.
Således är detta tillvägagångssätt lite besvärligt, och det kommer att kräva att du fortsätter att acceptera denna begäran när du startar om din utvecklingsserver.
Du måste klicka på osäker åtkomst för att fortsätta arbeta, som visas nedan.

Alternativt, för att utveckla med https-funktionerna, kan vi skicka sökvägen till certifikatet och ange en Python Tuple till parametern ssl_context i körmetoden. För att anta detta tillvägagångssätt måste du dock skapa ett självsignerat certifikat och en nyckel med hjälp av kommandot nedan.
openssl req -x509 -newkey rsa:4096 -nodes -out mycert.pem -keyout mykey.pem -days 365
Ge lämpliga värden för de frågade frågorna.

Vi har kvar alla standardvärden. Stoppa nu utvecklingsservern och skicka sökcertifikatet och nyckelvägen enligt nedan.
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context=('mycert.pem', 'mykey.pem'))
Detta tillvägagångssätt liknar också den tidigare metoden för att använda Adhoc ssl_context. I det här fallet kvarstår dock detaljerna under en längre tid. Vi har nämnt 365 dagar. Du kan ange utgången till de dagar du behöver. Dessutom kan dessa filer delas med de andra gruppmedlemmarna om du utvecklar ett team.
I produktionsmiljön utfärdas certifikaten av CA, och Miguel Grinberg diskuterar några användningsfall här . Vi rekommenderar att du läser mer information på den sidan.
Slutsats
I denna handledning har vi diskuterat några mönster som webbutvecklare följer när vi utvecklar funktioner relaterade till Flask Login, Flask Admin, Flask File Upload och Flask HTTPS. Vi har tillhandahållit kodexempel, och läsarna kan också prova det.
I vår nästa handledning kommer vi att täcka begreppen förlängning av Flask och se hur man skapar REST API-baserade funktioner. Dessutom kommer vi att diskutera hur vi kan använda Twitter API inuti Flask.
lista och förklara minst två saker du kan uppnå genom att testa programvara för säkerhetsfrågor.
=> Utforska Flask Training Series här
Rekommenderad läsning
- Designmönster i Java: Singleton, Factory And Builder
- Python Flask Tutorial - Introduktion till kolv för nybörjare
- Flask API-handledning med exempel | Utöka flaskan med API: er
- Flask-app och flaskprojektlayout med Blueprint & Bootstrap
- Django Vs Flask Vs Node: Vilket ramverk ska man välja
- Topp 31 populära Python Flask-intervjufrågor med svar
- Topp 10 databasdesignverktyg för att bygga komplexa datamodeller
- Topp 11 UI / UX-designtrender: Vad du kan förvänta dig 2021 och därefter