[MUSIK SPELA] EZRA Zigmond: Hej, alla. Tack för att ni kom ut idag. Detta seminarium är "Python Web Apps med Flask. " Så jag kommer att tala lite om varför kanske du vill använda kolv att göra webbappar med Python, i motsats till vissa andra ramar där ute, som Django, som är den mest välkända. Undertiteln är "och peewee ", som är något vi kommer att prata om hur att interagera med SQL-databaser. Det gör det verkligen trevligt. Så, här är bara en snabb genomgång av vad jag vill gå över. Så först, bara en bild det kommer att vara Snabbstart, vilket är hur man får allt ställa upp på din dator. Jag kommer att demonstrera detta på min lokala Mac maskin, bara för att det är där jag har gjort detta innan, jag är mest bekväm med det, men det är definitivt möjligt på CD50 IDE. Så, efter det, vill jag införa vad Flask är, och övertyga dig varför du bör använda det i första hand. Sedan ska jag ge en snabb exempel på vad du kan göra i kolv, ett snabbt exempel av vad du kan göra i peewee, och då kommer jag visa dig en mer fullständig exempel ansökan att jag satte ihop att vi kan gå igenom tillsammans. Och sedan slutligen, i den sista bilden har jag några resurser som du ser på nätet för mer information. Detta är inte en komplett handledning om hur man använder kolv. Och jag hoppas att lämna lite tid för frågor. Någon tittar lokalt, bara liknande, skrika ut i mitten om du har några frågor. Så snabb installation grejer, Om du vill följa, eller om du vill få detta upp på din egen maskin, Jag kommer att använda Python 2.7.10. Flask fungerar med Python 3, men jag gillar använder Python 2, eftersom det finns vissa Python paket som fungerar inte med 3 ännu. Om du pip har installerat, som är en Python pakethanterare, Jag tror att om din Python är större än eller lika med 2.7.9, du har det installerat redan, det är super lätt att installera dessa paket. Du kan inte installera pip Kolv, PIP installera peewee, vanligtvis måste du köra sudo bara så att behörighet träna. Och om du använder en super gammal version av Python, Jag rekommenderar att du uppdaterar din Python, eller använda Easyinstall att installera pip. Så, nästa fråga är, vad är Flask? Och jag antar att, först en rimlig fråga undrade jag under en lång tid är, vad är en webb app? Eftersom det är ett ord som jag tror kastas runt en hel del att jag inte riktigt visste. Och jag tror att det bästa exempel på vad en web app är, verkligen är CS50 Finance, där det är egentligen inte bara en hemsida, men det är något som du kunde slags interagera med. Det finns användarkonton och alla typer av olika saker. Så, exakt var du ritar Gränsen mellan vad som är en webbplats, och vad är en webbapplikation, är slags godtycklig, men jag antar att tanken, Det är något mer än en webbplats och det är en användbar applikation. Så, är kolv ett ramverk för gör webbprogram med hjälp av Python. Och förhoppningsvis i slutet av detta kommer jag övertyga dig att du faktiskt kan skriva något som CS50 Finance använder Python, som jag som en mycket bättre än PHP, personligen. Så, Flask är, de kallar en microframework, genom vilken, De menar att det är mycket enkel, men töjbar. Så har det precis vad du behöver, men om du vill ha fler funktioner, Det är lätt att ta in dem. Men bara för att det är en microframework, inte innebär att det är bara för små projekt. Jag har en länk här som säger att Obama använde Flask 2012 för hans kampanj webbplats, vilket förhoppningsvis, är något av en påskrift. Men det som jag verkligen tycker om Flask är att det inte verkligen göra någon form av beslut för dig. Bara för att vi är talar om webbprogram, Jag måste jämföra det med Ruby on Rails och Django, som båda är stora ramar, men de båda gör antaganden om hur du vill interagera med databaser, hur du vill presentera ditt vyer, och de är definitivt goda aspekter till det. Till exempel, Ruby on Rails har denna aktiva registreringssystem, som är en riktigt nice sätt att interagera med data, men om du vill använda Ruby on Rails, du typ av bundna till det. Men med kolv, som jag ska visa med peewee, Du kan använda vilken sorts av databas du vill, och du kan bara dra det i som en förlängning till kolv. Så det är därför jag verkligen som kolv, det är att det inte göra antaganden för dig baserat på saker du inte behöver egentligen. Så, varför ska du använda Flask? Fördelarna är det bara har verkligen kärnfunktioner inbyggd i det som du behöver. Så behöver du inte oroa dig för förstå en massa saker att du egentligen inte behöver. Du behöver inte oroa dig om att stänga av funktioner att du egentligen inte behöver. Och, som jag nämnde, det är super lätt att lägga in extensions saker att du inte behöver. Några av dem har Flask sitt eget stöd för det. Så det finns något som kallas Flask admin, vilket speglar att admin panel som Django ger, som ger dig ett trevligt visuellt sätt att administrera din webbplats. Men återigen, om du är gör något enkelt, du behöver antagligen inte en stor admin panel, så jag tror att det är super trevligt. Och nackdelarna är, att du har mindre makt ur lådan. Så när du först öppnar upp Flask, och i Python-program, du bara skriva från Flask import *, eller vad som helst, du inte exakt få alla de funktioner du kanske vill. Och så du måste tydligare lista de funktioner du vill ha. Så det är en nackdel, men jag tror att för att bygga små webben program som jag kommer att visa du, det är egentligen inte ett problem. Och vad det sista är ska säga, vilket är ett stavfel, är att det finns mindre standardiserade konventioner för hur man använder kolv, bara för att det inte är så många människor som använder det professionellt jämfört med Django. Så, om du tittar något liknande, "Hur gör jag x" i Django, du kommer förmodligen hitta den. Det finns god design mönster som du kan använda, men med kolv, det sorts gå din egen väg, bara för att det är en ganska litet bibliotek. Så de är nackdelar, men jag tror att det fortfarande är ett bra bibliotek för att använda. Så låt oss bara hoppa rakt in Flask. Detta är definitivt inte kommer att vara en komplett handledning, men det är för att ge dig en idé om hur man kan strukturera saker, och så att du känner dig bekväm att gå av och titta på dokumentationen och ta reda på mer. Så, låt mig att öppna upp en riktigt enkelt exempel i början, och visa dig vad det ser ut, och sedan ska vi bryta ner det lite mer. Så det här, låt mig få det att fungera. Så har jag nu min program körs. Jag kommer att öppna upp Safari, och det körs på min lokala värden. Så jag bara kommer att göra detta större. Men localhost: 5000 Och så, just nu, gör allt detta är, när du besöker webbplatsen, det skriver ut "Hej Flask" som inte är super bra, men jag tycker det är coolt att i denna lilla filen här, Vi har en webbserver körs som skriver ut något. Så, låt oss faktiskt ser på koden för en andra, och bryta ner det lite. Är storleken bra för alla här? Så förhoppningsvis du är något bekväm med Python. Jag antar att vi kan titta på Python och läste igenom det. Om du har några frågor om något, jag kan också gå över det. Så den första raden är från kolv, vi importerar, kolv med ett kapital "F" som är typ av alla viktiga funktioner som du behöver. När du skriver en fil och använda kolv, du kommer att vilja importera den, bara för att det har alla viktiga saker. Nästa sak vi gör är att vi kalla denna funktion kolv, precis att skapa en app objekt, och du är alltid kommer att vilja göra det. Och sedan, hoppar ner till botten snabbt, här är denna del, "if_name _ ==" _ main_ "" som är sorts Python konvention. Så det här kommer bara att köra om du köra den här filen direkt med Python. Sedan vi kallar app.run, vilket kommer faktiskt börja appen går. Så, det är huvudstrukturen som du har i alla kolv ansökan, är du kommer att ha denna app = Kolv (_name_), och sedan app.run. Så, de två saker som jag har här är vad vi kallar rutter. Så, låt oss tala om routing lite mer. Jag ska gå tillbaka till bilden. Så den mest grundläggande koncept i Flask är routing. Och det är tanken att du tilldela funktioner i Python till särskilda adresser på din hemsida. Så, när du vill att skapa en ny rutt, du använder den här @ app.route funktion dekoratör. Så, om du är obekant med funktions dekoratörer i Python, Det är detta begrepp som låter dig ta en funktion och omge det med något annat. Så egentligen, vad detta dekoratör gör, är att det tar funktionen under det, och det lägger in mer information till det, men vad Flask faktiskt gör det hända är inte super avgörande, men vad som är viktigt, är att innan rutten, du sätta detta @ app.route, och sedan adressen av rutten, så slash är vad vi såg när vi öppnar bara upp webbsidan. Så det är hemsidan. Det är bara snedstreck vägen. Och då du har den här funktionen. Namnet på funktionen kan vara vad du vill. Det behöver inte nödvändigtvis har att göra med rutten. Och sedan, oavsett funktionen återkomst, funktionen ska returnera en sträng. Och den strängen kan innehåller HTML eller något, och det är faktiskt vad som kommer att få tillbaka till din webbläsare som HTML, och det kommer att göra det. Så det här är samma kod som var från exemplet att jag bara sprang, så när vi besöker snedstreck, man kallar en Hello World funktion, som bara returnerar en sträng, Hej kolv, och som blir tryckt på skärmen. Så det är ett annat exempel, vilket är, när du besöker / hej, det skriver ut Hej Word, som egentligen borde säga, Hello World, men låt oss låtsas att var avsiktligt. Så låt oss dra det verkliga snabbt upp. Så om du går till localhost / hej, Det kommer nu att skriva ut något annat. Så det är bara en snabb exempel på hur Du kan skapa två olika vägar. Så, så länge detta inte super bra, det finns inte en hel del du kan göra, kan du bara göra allt detta med med olika HTML-sidor, och när du besöker en viss sidan det bara laddar sidan. Så låt oss se lite mer användbara saker du kan göra. Så, en sak som du kan ha märkt i exemplet som jag drog upp, är att jag hade app.run (debug = sant). Och så, vad detta debug argument gör, är att när du kör din webbserver, när du är i din ansökan, Om du ändrar en fil, kommer det automatiskt ladda servern. Och så du inte verkligen måste omstart Python, som är super användbart. Jag kan visa det. Låt mig dra upp min kod med stavfel i det, och låtsas att stavfel lades dit avsiktligt för lärosyfte. Så låt oss lägga till den här igen. Så nu står Hello World. Jag kommer att spara det. Och om vi drar tillbaka upp terminalen, kommer du säger att det är att starta, eftersom det upptäcktes en förändring, och så nu när vi ladda om sidan, det kommer att skriva ut rätt sak. Så debug är super bra för det. Dessutom, om du har några typ av en krasch, så Låt mig göra detta programkrasch genom att det inte returnera en sträng. Så, låt oss bara få det retur Inga av någon anledning. Och sedan när jag besöker denna sida, kommer det bara att krascha, men servern inte bara kraschar, det faktiskt ger dig en super bra back spår av allt som gick fel. Och vad är riktigt nice, är att vid varje steg i detta tillbaka spår, du kan öppna upp ett interaktivt skal här, och sorts skriva ut vad variabler som du vill ta en titt på. Och så felsökning är verkligen användbar för att räkna ut vad som händer med din server, snarare än att bara se något i PHP som en 500 internt serverfel, som är super värdelös. En sak att vara medveten om, är att om du sätter din app på nätet så det är synlig för allmänheten, du aldrig vill lämna felsökningsläge, eftersom människor kan faktiskt använda den konsol som jag visade dig att köra godtycklig kod. Så de kan skriva ut som alla hemliga koder du har där, De kan titta på exakt hur din webbplats fungerar. Så det är verkligen användbart för att testa, men alltid se till att ta det innan du publicerar något på nätet. Så när du använder något som PHP, det är denna idé att du kan passera informationsutbyte mellan webbsidor genom att den information som faktiskt i webbadressen, vilket är en begäran GET, men i kolv, kan du faktiskt göra något slags sånt, genom att ha en rutt som har en variabel som en del av den. Så om du tittar på detta exempel på skärmen här, vi har en väg som är ('/ hello /'), och så, om du besöker / hello / något, att något kommer att faktiskt få fylld in namnet variabeln. Och lägg märke till att funktionen som kommer med den vägen måste ta i parametern namn, så att det kommer faktiskt får passera in i funktion. Och sedan, när du är insidan av den funktionen, du kan behandla det som en normal Python variabel, och så då kommer det skriva ut Hej, och det fyller i namnet med hjälp någon sträng formatering. Så för att lägga till rörliga delar till en routing, du använder vinkeln märkning. Och eventuellt kan du använda vad som kallas en omvandlare. Och så, om du sätter denna annotering med kolon, Du kan ange att det är en int, eller en flottör, eller stig, och det kommer automatiskt konvertera det. Du kan också göra konverteringen inom Python-funktionen, bara genom att använda en gjuten, men ibland om du vill se till att det är en int, du kan sätta det omräkningsregeln där. Så låt oss dra upp ett exempel av vissa variabla regler. Så här har det samma grundläggande struktur med från Flask import Kolv, App = Flask (_name_), och sedan det körs i slutet. Vi har dessa två olika variabla vägar här. Och det första en, är det som jag visade i bilden, nämligen att det tar bara i en sträng namn och det kommer att skriva ut Hej Name. Och sedan, den andra man använder konverteringen. Så det här kommer automatiskt konvertera det till en int, och sedan dubbla int, och skriva ut det. Och gör vi inte någon form av omvandling inom det eftersom Flask tar hand om det. Så låt oss få detta igång. När du har en kolv program som körs, Du kan styra-C av det för att stoppa server som kör. Och då kommer jag köra variablerna. Så låt oss gå till localhost / hello / Esra och Förhoppningsvis kommer detta att säga hej till mig. Så det tog i mitt namn, i variabeln rutt, och det fyllde den här. Så jag ska också visa en sammanfattning exempel på en fördubbling. Så om du går till / dubbel / 3, det kommer att skriva ut 6. Så detta tog hand om omvandlingen för oss. Så du kan också göra det med flyta, och något speciellt, om du behöver ange något i stil en väg, som gör det accepterar snedstreck, men det borde inte brukar vara ett problem. Hittills har vi fortfarande ha just återvänt strängar, vilket inte är mycket intressant. Vi kunde faktiskt tillbaka bokstav HTML-strängen. Så i koden kan vi sätta in något som b-taggen för att göra det djärvt, men de flesta den tid du egentligen inte vill vara att skriva HTML-kod i Python-kod. Det blir riktigt rörigt, och det är inte en bra tid. Flask tillåter oss att separera ut HTML i vad som kallas Mall, och så om du funderar i termer av MVC-modellen att du är bekant med, förhoppningsvis, från att arbeta med CS50 Finance lite, du kan tänka på Python-filer som mer av Controller, där de interagerar med vad datamodell du kan ha. Och sedan de ropa till Visningar och vidarebefordrar information till denna uppfattning att fylla i uppgifter i HTML som den behöver. Och vad vi kallar dessa Visningar är Mallar i klassen. Så Flask använder annan Python modul som det automatiskt installeras när du PiP installera Flask heter Jinja, som låter dig lägga till dessa anteckningar till HTML som du ser på skärmen, kan det du sätter in saker som villkors, och loopar i HTML. Så det ser ut lite som hur du kan använda PHP i en HTML-fil, men detta är bara då kolven server serverar HTML-filen, det kommer att köras den här mallmotor och analysera igenom det här och fyll saker. Så kolv har en render_template funktion att du kan se längst ner här. Och så när du besöker denna sida, det skulle göra detta hello.html Mall, och sedan fylla i denna HTML-sida. Så låt oss bara köra denna verkliga snabb, och se hur det ser ut, och sedan ska jag gå igenom en lite mer i detalj. Så, är dina mallar går att gå i en mappen Mallar. Det kommer automatiskt att leta i Mallar mapp för den mallen. Så låt oss öppna denna. Så ska jag köra mallhantering exempel. Så om jag går till / hello / ezra, har denna fruktansvärda, vidrig tält tagg som jag satte in. Mycket trevligt, mycket dynamisk. Jag är ett stort fan. Men vad händer om Jag går bara till / hej? Så det bara säger Hello World. Jag ville inte ge det ett namn och det fyllde automatiskt. Så låt oss se hur det gjorde det, och hur vi kan bli av med den markeringsramen kanske. Så här är den här sortens ett intressant exempel på, om du är bekant med hur switch uttalanden arbeta på ett språk. Säg detta är ungefär som, den sortens ett fall genom, där du faktiskt fäst två olika vägar till samma funktion. Så vi fäster / hello rutt och den / hello / namn väg till Hello, och vi anger using-- Python låter dig ange standardfunktion arguments-- så om det inte finns något namn, så om vi går bara / hej, Det kommer automatiskt att filtrera att nämna är lika med None. Alltså, vi göra Mall med name = namn, så det kommer att passera i parametern name lika med detta namn funktionsparameter, i mallen. Det fortfarande inte förklara hur är fattar beslut om att skriva ut Hello World, eller skriva ut mitt namn. Så låt oss faktiskt ser i själva mallen, och se vart det kommer ifrån. Så, i denna mall, vi faktiskt har en del villkorslogik, som vissa människor skulle argumentera, du faktiskt bör inte ha en massa villkorad logik inom din mall själv. Det bör vara mer inom Controller, men för detta exempel det är något ganska små. Så här kontrollerar vi, om namn, så om namnet inte är lika med None, om ett namn är faktiskt passerade, då kommer vi säger Hej Name med header och tält, allt detta normalt HTML, annars kommer vi skriva ut Hello, World bara normalt. Så ett par saker att lägga märke till här om hur du formaterar mall, är att, alla dessa villkorssatser, ungefär som hur vi PHP när du vill infoga någon PHP, du använder mindre än fråga märke, det är typ av analogt här med {%. Så här har vi vår villkorlig kod. Och sedan, när du faktiskt vill bokstavligen utvärdera något, och skriva ut ut till skärmen, du Använd dubbla hängslen. Så här är de dubbla hängslen, och ange sedan vi namn, så inom den, kommer det att utvärdera till variabelnamn, vilket leddes in från render mall funktion, snarare än bara utskrift ut, om vi fick bli av med dessa, Det skulle bara skriva ut ordet "namn." Så, det är något att se upp för. Så en annan sak att meddelande är att när vi vill använda render_template funktion, vi faktiskt måste importera uttryckligen från Flask. Och detta är ett exempel på modulariteten hos kolv, att du inte behöver importera saker som du inte behöver. Du kan bara ta in funktioner du faktiskt behöver, som ibland trevligt, så att du inte måste ha alla dessa funktioner sitta som du inte använder, men också, om du glömmer att du behöver importera render_template, du kommer förmodligen att få en varning som låter dig veta om det. Så, är det schablon. Så har vi visat hur man göra enkla webbsidor, och lägga till lite mer logik det, i termer av den variabla dirigering. Den låter dig göra olika saker baserat på vilken webbadress du går till, och även då, ge HTML lite mer mening det gäller hur du vill göra saker. Du behöver inte lägga alla HTML i Python, men för ganska mycket varje webbapplikation, du kommer att vilja något slags av datamodellen i samband med det. Och så traditionellt, skulle detta vara något som en SQL-databas. Och du kan bara interagera direkt med SQL. Python har, tror jag det heter. SQLite 3. Du kan bara importera SQLite 3 och köra SQL-frågor direkt, men jag vet inte om dig, men jag verkligen inte gillar, bara, skriva ut SQL-frågor. Det tenderar att bli riktigt lång och komplicerad. Och så, något som Jag gillar att använda är vad känd som en ORM, som är en objektrelationsmappning. Och poängen med en objektrelationsmappning, är att det finns två olika sätt du kan tänka på databaser. Så exempel som Professor Malan vanligtvis använder i klassen, är Excel-tabellen, där du har dessa rader och dessa kolumner, och det är verkligen användbart för hur den skall företrädas i SQL och hur du interagerar med det, men ett annat sätt att det faktiskt nyttigt att tänka på det ibland, är i form av klasser och objekt. Så istället för att tänka i varje tabell som har den här raden som har vissa information kan du faktiskt tänka på det som varje bord är en klass, och sedan varje instans av klass har vissa egenskaper. Så i det här exemplet, förekomster av klassen är de rader i tabellen, och sedan varje fastighet skulle vara en kolumn i tabellen. Så, ORM som jag gillar att använda kallas peewee. Det är verkligen små, ungefär som kolv. Jag tror att de går bra ihop, men det finns en hel del andra ORMS som du kan använda. En mer populär man är känd som SQLAlchemy, och jag kan inte komma ihåg varför jag ursprungligen valde peewee över SQLAlchemy, eller jag skulle berätta varför jag tror att det är den bästa, men vi kommer bara att använda detta eftersom jag vet hur man använder den. Så, är en fråga, varför ska du bry använder en ORM, istället för att bara direkt skriver SQL-frågor? Och jag tror att det bästa fall är att du egentligen inte måste skriva SQL-frågor. Det är mycket lättare, eftersom jag ska visa dig, gör saker som val, införande, radering, särskilt skapa tabeller. Det är mycket lättare att skriva ett klasstruktur, än det är att strukturera en Skapa Tabell uttalande, men en sak att vara medveten om, är att ORM kommer att försöka sitt bästa att räkna ut vad det mest effektiv SQL-fråga skulle vara, men ibland blir det fel. Och särskilt om du är arbetar med en stor databas, Du kan märka att en fråga som bör vara igång snabbt, faktiskt tar längre tid. Och om man tittar under huven på hur ORM tolkar det till SQL, det kan göra något verkligen löjligt, bara för att det slags gest era avsikter fel. Och har det funnits tillfällen där Jag har haft att åsidosätta den, och bara köra mina egna SQL-frågor, bara eftersom det var parsning på ett märkligt sätt. Så finns det vissa overhead, precis på det sätt att det sammanställer din uttalanden ner i SQL. Så, låt oss titta super snabbt på ett enkelt exempel på en datamodell som du kan använda. Så detta är Python-kod, och så första du vill göra är från peewee import *. Så, till skillnad från kolv, där du har alla dessa enskilda moduler, och du vill importera kolv, och skriva en mall, och några andra att vi kommer att se senare, från peewee, Du kan bara importera allt, eftersom det är en ganska litet bibliotek. Så, är det första du vill göra, är faktiskt skapa denna databasobjektet. Så, har du db = SqliteDatabase, och sedan namnet på din databas. Och detta kommer faktiskt skapa en databasobjekt att du kan interagera med, med peewee. Och sedan har vi den faktiska modell som vi vill skapa. Så tabellen vi vill skapa. Så inom peewee, har varje klass sin egen tabell i din databas. Så, alla klasser ärva från basmodellen, och kapital M-modellen är något som definieras i peewee. Så, alla dina modeller ska ärva som högsta super, de bör ärva från modell, men vad är riktigt coolt, är att du faktiskt kan få din modeller ärver från varandra. Och en stor del av tiden, din datamodeller inte nödvändigtvis göra en fin arvshierarkin, men tider där de gör, det är verkligen trevligt, eftersom du har modellen inneboende från varandra. Så definierade vi denna klass "elev", som ärver en modell, och den har tre egenskaper. Den har ett ID, som är en PrimaryKeyField, som är något som tillhandahålls genom peewee, är namnet en Charfield, och en klass är en IntegerField. Så detta kan eller inte kan vara hur CS50 faktiskt lagrar alla elevernas betyg. Det är inte, men det är hur jag skulle göra det. Och då har det, inom denna klass, och detta är något du kan göra med Python, kan du få kapslade klasser. Och detta är något som behövs av peewee. Så, denna klass Meta, har du att ange att databasen är lika med föremålet att vi skapade ovan. Och det säger vad filen är den här tabellen faktiskt kommer att ingå i. Så detta är något som du har att göra inom alla dina modeller. Du måste bara ange inom denna Meta klass att databasen är lika med db. Så vad jag brukar göra, om jag har ett gäng olika modeller, är att jag har en bas modell, som jag brukar bara kallar "basmodellen" som har Meta klassen, och det sätter databasen är lika med db. Och sedan alla mina efterföljande modeller kommer att ärva från den basklass. Och då jag inte behöver oroa om hur Meta klassen. Så när detta faktiskt blir samman ner i en SQL-sats, Det ser ut så här otäck sak ner här "Skapa tabell studentlegitimation heltal, " vad som helst. Och jag tror att det är kortare, denna SQL-fråga här, men om man tittar på den här klassen här du kan se exakt vad som händer. Du kan se vilka typer av fält Det finns, vad de kallas, och så, jag tror att titta på denna Python-kod är mycket mer lättläst än försöker skriva denna SQL-frågan. Så, för att verkligen använda databasen, Vi måste ansluta till den inom Python. Så jag brukar skriva en funktion som kallas initialize_db som gör två saker. Det tar i databasen objekt db och det ansluter till den, som bara öppnas upp avsnitt till databasen. Om du bara kör om webbplats på den lokala datorn, Det är inte en super stor sak att oroa om att ansluta och koppla, men om du kör det på en webbplats, du vill vara säker på att, när en användare ansluter till den, när de stänger ute hemsidan, de kopplar så att du inte har en massa människor som är anslutna till din databas på en gång. Och sedan, när du ansluta till databasen, du vill ringa db.create_tables, och en förteckning över de modeller för vad du vill att skapa tabeller. Så här, jag vill bara skapar det för denna elev. Och sedan, vad som är viktigt, är att ange säker = Sant mest tid. Så vad detta uttalande kommer att göra, är att det skapar tabeller för elev modell, men endast om tabellen har inte skapats redan. Det är vad de säkra anger. Så det kommer inte att skriva över din befintliga tabellen, Det kommer bara att skapa en ny tabell om det inte finns där. Så kan du bara skapa tabellerna en gång med hjälp av SQL. Och sedan har databasen sammanträde där, och sedan ansluta till varje gång, men det är oftast trevligt bara lägger i detta create_tables samtal så att, om du någonsin ta bort databasen när du kör din webb app igen, kommer det att återskapa den. Så, bara se till att säkra specificeras för att vara sant, eller hittar du dina uppgifter bara få clobbered varje gång. Och då kan du bara ringa initialize_db att etablera en anslutning, och skapa tabeller vid behov. Så, den vanligaste sak att du kommer att vilja göra, eller en av de vanligaste aktiviteterna, är att faktiskt sätta in saker i din databas. Och så, i stället för att att skriva en insats INTO meddelande med alla de värden som anges, du faktiskt kan ringa funktionen på studentklassen. Så, när du skapar en klass som ärver från modellen, det har denna skapa metod. Så gör du klass name.create, och du anger parametrarna som du vill passera. Så, om jag vill lägga till några studenter till vår CS50 klass bok exempel, Jag ska sätta in David, som har en mycket bra kvalitet, har han en 95. Och jag själv, vem gör inte så bra i CS50, jag har ett 50. Och så, den fina vad detta skapar funktionen gör, är att den returnerar exempel, eller den rad, att det skapas i tabellen, och så då du lagra den i en variabel, och arbete med det senare. Du kan ändra runt, vilket Jag ska visa ett exempel på. Lägg märke till att jag inte måste ange ID, eftersom eftersom det är PrimaryKeyField, kommer den automatiskt öka det om du inte anger det. Och i själva verket har du förmodligen bör inte ange det, eftersom du kanske av misstag clobber någon annans ID. Och du vill göra säker på att det är unikt. Så, faktiskt, den mest gemensam sak du vill göra, förmodligen välja ut av databasen när du har en hel del information i det. Och så, om du vill få allt, så motsvarar den valda stjärnan från studenter uttalande, det skulle bara vara student.select. Och det kommer att ge dig tillbaka en array med alla studenten objekt i det att du iterera över du vill. Du kan få saker ur det. Och för det mesta, du inte bara vill göra välja, du verkligen vill ange något. Och så kan du kedja ihop dessa funktionsanrop, som hur du skulle kedja tillsammans uttalandena i SQL. Så du kan göra student.select (). Där i detta exempel. Och sedan kan du fastställa villkoren, bara använda normal Python Booleans att kontrollera saker. Så i det här fallet, vill du begränsa vad du väljer till där student.grade är lika med 50, och student.name är lika med Ezra, så det kommer bara få mig ur det. Och lägg märke till, en riktigt subtila sak här är att om du vill ange en och / och eller ett eller / eller, i Python, skulle du normalt använder, Jag tror att ordet "och" faktiskt, men här du använder enda et-tecken, som normalt är en bitvis operatör, men i detta speciella fall, precis som peewee gör det, du använder enda et-tecken för att ange "och." Det är något som Jag får blandas upp en hel del, men det kommer inte upp så mycket i praktiken. Och sedan, när du har alla eleverna ut ur databasen, när du har gjort du väljer och din slitage eller vad som helst, du kan använda en foreach loop, precis som vanligt i Python, med någon form av iterator eller med någon form av matris. Så du kan göra, för s i student.select (). whe re (Student.grade <75), och så detta kommer iterera över varje elev i tabellen vars kvalitet är mindre än 75, som i det här fallet, är fortfarande bara mig. Och då kan du göra något inom slingan, som skicka mig ett mail och berätta att faktiskt lämna in mina Problem set. Så, en annan sak du kan gör, är det är verkligen lätt att uppdatera rader i tabellen. Så kom ihåg tillbaka hit, din när jag in, Jag tog det värde som var returneras av student.create, och jag tilldelat den till namnet heter Ezra. Och så nu kan du ändra värden inom det fallet precis som du skulle en normal klass i Python. Så du kan ställa in ezra.grade = 95 och som kommer att uppdatera den lokala kopian, men om du verkligen vill åtar sig att förändring databas du måste ringa ezra.save, så att du ringde .save metod på instansen. Och så nu har jag har ändrats min egen klass i databasen. Så, låt oss säga att jag fastnar ändra min klass i databasen. Professor Malan är förmodligen kommer att vilja ta bort mig från klassen, och så att du kan ringa .delete förekomstmetod bara på den saken. Så, om du ville gå tillbaka in i denna slinga här, och faktiskt, i stället för att skicka e-post alla av studenterna vars kvalitet är mindre än 75, ville att du skulle ta bort dem, inom denna slinga du kan Ring s.delete instans. Och den allra sista sak du vill göra, är när du upprätta en anslutning, och du är klar med ditt arbete, du vill ringa db.close, där db är att databasen invända att vi hade tidigare. Och du vill vara säker på att allt blir stängs av. Häftigt. Så nu har jag ett exempel ansökan. Jag har typ av pre-gjort allt bara så att det inte blir någon levande kodning misstag, men vi kan gå igenom det och se hur du skulle sätta Flask och Peewee tillsammans, och göra en enkel app. Jag kallar det CS50 rant, och det är en slags enkel blogg plattform. Så först ska jag köra det och visa hur det ser ut, och då kan vi titta mer i koden. Okej, så låt oss bara köra detta. Cool, jag ska göra det här lite mindre. Det är inte mycket vacker, bara för att Jag ville inte göra en massa CSS, men vad det gör är, det har denna databas av blogginlägg, och det går igenom alla dem, och det kommer att visa dem på sidan i den ordning de senaste. Och så dessa är bara några inlägg att jag hade sparat i databasen. Så om vi vill skapa en ny post, kan vi gå till Lägg till ett nytt inlägg, och vi kan komma in i titeln på post, så något liknande, CS50 seminarium. Wow, verkligen njuta av seminariet. Häftigt. Då du trycker på stolpen och det kommer omdirigera dig tillbaka till startsidan, och sedan ser du att det senaste inlägget tillsattes. Och vi har fortfarande alla de där. Så nu, låt oss gå igenom alla de koden och se hur detta genomförs. Så jag tror att det första som låter ta en titt på är faktiskt modellerna. En stor del av tiden, när du skapar något, du vill tänka först på hur du kommer att representera dina data, och sedan utforma saker runt det, så att allt är vettigt. Och det är faktiskt hur jag gjorde det när jag gjorde detta, Jag satte mig ner och tänkte, vad vill jag i ett inlägg. Så här har vi samma struktur att jag nämna tidigare, där vi gör db = Sqldatabase (posts.db "). I själva verket, förmodligen du inte vill hårt kod i ditt namn databaser. Det bör nog vara en parameter som lagras någonstans, kanske i en konfigurationsfil, men i ett litet exempel som detta, det är okej att hårt kod som i. Så nu har vi detta inlägg klass, som ärver från basmodellen. Och det har, återigen, den ID = PrimaryKeyField. Egentligen, om du inte anger, om jag faktiskt blev av med detta, då Peewee vi tar hand om automatiskt skapa det ID-fältet, och det kommer automatiskt gör det till en primarykey, som Jag tycker är riktigt nice, eftersom vanligtvis, det är något du vill ha, men jag gillar att uttrycka det i synnerhet bara så jag kommer ihåg att det finns där. Men om du inte anger det, som kommer att vara det automatiskt. Alltså, jag har ett datum som är en DateTimeField, och alla dessa olika områden, om du titta på den peewee dokumentation, Det ska ge dig en lista över de olika typer av fält som du kan använda. För det mesta är det analoga vad du skulle se i SQL. Så det finns en Charfield, en VarCharFields, textfält, vilka är särskilt länge texter, som ett blogginlägg potentiellt DateTimeFields, DoubleFields, FloatFields, alla saker som. Och du kan passera i andra argument till det, som jag inte ange här. Säg till exempel, som du inte vill tillåta två tjänster för att ha samma titel, du kan ange något som unikt = Sant, och det är bara en extra parameter till fältet som när den sammanställer det ner i SQL, kommer det ange att det måste vara unikt. Du kan också ange något liknande inte noll och alla andra saker du normalt gör i SQL. Så detta är en ganska enkel modell som har datum. Lägg märke till här, inom DateTimeField, Jag specificerade vad standard är. Jag specificerade att det är datetime.datetime.now, grund av det sätt som Detta blir utvärderas det faktiskt utvärderar den datetime.now när det blir införd i databasen. Jag tror att jag skulle ha att dubbelkolla detta, men om du gjorde något sådant, då det faktiskt skulle utvärdera det en gång, och sedan Datetime skulle alltid vara densamma. Så, bara om du gör något med datetimes, dubbelkolla att det är att utvärdera när faktiskt blir insatt, annars du skulle kunna förväxlas. Titeln är bara en Charfield, där det finns fler argument som ni kan passera att specificera exakt hur länge du vill att det ska vara, men här, det gjorde egentligen ingen roll. Och Text kommer att bli texten av hela inlägget, och det kommer att bli en Textfield bara för att du vill ha att låta det vara en ganska lång sträng. Sedan har vi det här Meta underklass som bara anger att vi vill att databasen där detta faktiskt öppnas upp i att vara db objekt som vi har här. Och sista vi har här är just denna funktion att vi kommer att använda från våran app att initiera databasen för att ansluta till den, och sedan för att skapa den Post tabellen. Nu, låt oss titta på huvud app själv. Så detta är en ganska lite längre än de att vi har sett förut, men förhoppningsvis inte alltför illa. Så låt mig sträcka ut detta. Okej. Så märker och toppen Jag importerade en hel massa andra saker från Flask att vi inte verkligen sett förut. Och förhoppningsvis kan vi gå igenom var och en av dessa en efter en och prata lite mer om dem, sorterade efter exempel. Så har vi Flask, och render_template, som vi har sett förut, denna begäran objekt, som kommer upp när vi tittar på hur den form som jag visade faktiskt fabrik. Omdirigera, vilket gör att du kan omdirigera tillbaka från Skapa Nytt inlägg tillbaka till den ursprungliga hemsida, och sedan URL, vilket är något som låter dig räkna ut var på webbplats en viss sida är. Alltså, nästa jag gör, är jag import all information från modeller filer som vi bara tittar på. Och, ja. Så, något annat nytt som kommer när du arbetar med, speciellt databaser, är att du kan ange en funktion som anropas innan varje begäran, och funktion som får uppkallad efter varje begäran, med hjälp av denna Funktionen dekoratör app.before begäran. Och så detta kommer att få utföras varhelst denna funktion är. Detta behöver inte vara kallas före begäran, men oftast det är något klokt att kalla det. Du kan ange vad funktion du vill få kallas där, så jag angav detta initialize_db funktion som vi hade tillbaka i modeller fil, så innan varje begäran du vill ansluta till databasen. Det finns två olika sätt du kan göra detta. Du kan göraapp., I tror att det är after_request. Och skillnaden mellan after_request och teardown_request, är att after_request bara kommer att ske om begäran var faktiskt giltigt. Och så, endast om begäran lyckades, Om något gick fel, men teardown_request händer i fallet med en lyckad begäran, eller i fallet med ett fel. Så, vanligtvis du vill att använda teardown_request, om du inte vill göra något, särskilt annorlunda i fallet med ett fel. Men bara för att stänga databasen, om det lyckas eller om det misslyckas, Vi vill du koppla från databasen. Så det heter, db.close på db-objektet. Lägg märke till att teardown_request tar i ett undantag. Så du kan kontrollera om det fanns faktiskt ett fel när den stänger ner, men här, förhoppningsvis, det inte en hel del fel, så vi bara sorts ignorera det. Okej, och resten av det är inte så illa. Så, när vi går till hemsidan, Vi framförde denna home.html Mall som kommer att öppna upp. Passet är i tjänst lika med och vad detta gör är, kom ihåg att vi har det här inlägget modell, så vi markera alla inlägg, och sedan en annan sak du kan göra, Du kan ange WHERE, Du kan ange en beställning av, och så tar vi alla de tjänster som få utvalda, och sedan vi beställa dem av post.date.descending. Och det kommer att specificera när de faktiskt komma ut, den senaste kommer att vara mycket första en. Och sedan, passerar vi det till den home.html mallen, så låt oss faktiskt öppna upp som mall verkligen snabb, och ta en titt på hur det fungerar. Och det är inte bra HTML, men förhoppningsvis kan vi fokusera på Python. Så det finns en länk till Lägg till ny Post, och så detta anger vägen inom Flask som vi definiera, vilket är rätt här. Detta är den nya postvägen, och vi ange att upp här. Och så det är en länk som då kommer att gå till denna flyglinje inom Flask-servern. Ju mer intressant sak är detta för loop här. Så vi ange att post parameter som bringades att passera in i den render_template funktion, för varje inlägg i Postens objekt som får passeras i. Vi vill skriva ut anslagets titel, i H1, och då under vi vill skriva ut inläggets text i ett stycke. Och här kan vi faktiskt ringa en Python-funktion, så vi kan kalla strftime, ST-RF-tid, och du kan passera i formatsträngen som du vill skriva ut data i. Så det är är ganska trevligt att du kan faktiskt kalla denna Python funktion inifrån här. Du behöver inte göra formateringen på styrenheten sida, eftersom verkligen, formatera datum är något som du vill ta itu inom View. Och alla dessa procent saker är inte super viktigt. Om du tittar upp dokumentationen för strftime funktion i Python, det anger alla dessa saker, men det är hur, när vi letade på hemsidan här, Det formaterar detta med en trevlig datum, och det anger AM eller PM, men normalt, om vi hade inte detta här, du kommer förmodligen få lite skräp datum som inte ser mycket bra. Och sedan vi anger post.text, och jag kunde har lagt ett par radbrytningar här, bara att ställa några mellanrum mellan varje inlägg. Så jag tror det viktigaste sak i detta exempel, är att du kan använda detta för loop. Och detta är analogt med saker du kan göra i PHP. Du kan iterera igenom, allt blir gått in, och så, i stället för att behöva göra kopiera / klistra in, kopiera / klistra in all HTML, du måste bara skriva det en gång, och sedan Du kan iterera över alla inlägg. Och detta är något vanligt att du vill att göra, när du har en hel del uppgifter, är att för allt i dina data, du vill göra en liknande sak. Och sedan, kom bara ihåg att när du vill skriva ut något explicit i HTML använder du de dubbla hängslen här, men sedan när du vill ange lite information om ett tillstånd, eller om en for-loop, du använd procent fästet. Så, gå tillbaka till Python kod, så att förklarar vad som händer i huvud rutt, när vi åker dit, det bara visar alla inlägg, men då frågan är, hur vi faktiskt få tjänster till databasen, som är lite mer intressant. Så när du klickar på Ny Post länk, som vi såg här, det omdirigeringar dig till detta formulär. Och det är bara en enkel uppmaning till render_template funktion, som sedan passerar den nya tjänsten i HTML-formulär. Så låt oss ta en titt på det. Så det här är ganska enkel. Det har en enkel HTML-formulär, som ser lite bekant, baserat på blanketterna i CS50 Finance. Och så, vi anger här åtgärden. Och här, om du arbetar med PHP, normalt det skulle vara något liknande, create.PHP, men här vi faktiskt ange en rutt inom Flask-servern. Och så denna linje motsvarar till skapa rutten som vi har här, som vi kommer att gå in i en sekund. Och så, vi ange att Det är en post metod, eftersom vi vill skicka denna formulärdata, och oftast när du skickar data från ett formulär, kanske du vill använda en post begäran, bara så att du inte hamnar med denna stora, otympliga webbadress. Men du kan också använda en begäran GET, och låta det gå i med variabel routing, men för formulär, det är trevligt till en tjänst förfrågan här. Och så då, precis som du skulle göra med HTML och PHP, Du kan ange dessa textingångar, och du kan ange namnet på dem, och det är det namn som kommer att få passerat in begäran objekt inom Flask. Och då har vi en Skicka knappen som säger Post. Och här är Post namnet på knappen, eftersom det är ett blogginlägg, men här är post begäran metoden. Så de är samma ord men faktiskt orelaterade. Ja Att gå tillbaka till Python-kod, när vi ringde skapa metoden, märker här att du kan faktiskt anges inom rutten Om begäran metoder som du vill acceptera, och så här, jag ange att jag bara vill acceptera en Post metod. Så, om jag verkligen försöker att besöka sidan direkt, som använder en begäran GET, Det kommer att berätta "Method inte tillåtet." Och så har du sidor, ungefär som detta skapa sida, vilket jag bara verkligen använder som ett sätt för formuläret för att få in, Du kan ange att du inte vill att folk ska kunna åka dit direkt via en begäran GET, eller om du inte vill, av någon anledning, en Post begäran, Du kan bara ange FÅ här, men i detta exempel, vi bara vill Post begäran att gå ut. Så när create_post heter, när Vi besöker den via Post begäran när du går till en viss rutt, det finns denna begäran objekt, och vi var tvungna att importera förfrågningar på högst upp, men det finns denna begäran objekt som får passeras i, och du kan få tillgång till formulärdata, som automatiskt få fylld när du skickar en begäran från ett formulär. Och sedan, vad jag tror är riktigt cool, är att formulärobjekt för att få godkänt i, är bara en Python lexikon som innehåller, om du access-- så här, låt mig dra upp HTML bredvid den, bara så att du kan ha det som referens, ja, så de namn som vi anger här för olika områden, så titeln och texten, vi sedan bara använda dem hit som index i formulärdata. Så det är super bekvämt. Så då vi kallar post.create, som kommer att skapa och automatiskt sätta in denna nya tjänst föremål i databasen. Och jag tror att detta skapar funktion här är en riktigt cool exempel på hur kraftfull Flask är och arbeta med detta, eftersom om du gjorde något i PHP, kan du behöva göra en hel del validering, du måste då upprätta en databas anslutning, du måste då köra SQL-fråga, men här har vi just denna trevliga post.create, som vi kan då bara få ut informationen av begäran objektet och sedan skicka den till en ny posta att vi skapar. Och sedan, den allra sista som vi vill göra, är att omdirigera användaren tillbaka till hemmet. Och så använder vi det här Flask omdirigera funktion. Och något som vi inte hade sett tidigare var denna URL funktion. Så URL för funktionen kan du passerar in egentligen namnet en funktion i din Python-kod, snarare än det speciella sättet att det är på. Så jag kunde ha lika lätt omdirigeras en användare att hugga, vilket skulle skicka det tillbaka hem, men med hjälp av webbadressen till funktionen är trevligt, för om du ändrar plats där saker och ting är, så låt oss säga att jag ändrar hem för att vara / hemma istället, Detta skulle fortfarande sedan återvända / home, eftersom det faktiskt går och tittar upp namnet på funktionen, och det kommer att ge dig tillbaka webbadressen för det. Så, typ av på antagandet att du är mer benägna att förändra där saker är än namnen på funktionerna. Du kan använda detta verkligen trevligt URL för funktion. Och en sak att vara medveten om det är lite knepigt, är att du tror att du kunde bara ringa omdirigera på webbadressen för, men faktiskt alla rutter har att återvända någon sorts text och HTML, så du har faktiskt returnera omdirigerings samtalet. Annars kommer du få något ogiltigt om inte återvänder en sträng, eftersom alla dessa har att återvända HTML du verkligen vill göra. Och så, när du ringer omdirigeringen det omdirigeringar dig till sidan, men det faktiskt returnerar HTML du behöver för att utföra det redirect. Gå tillbaka till startsidan. Så vi har dessa två olika vyer. Vi har startvyn. Eller, jag antar att jag borde säga mallar. Vi har dessa två mallar, hemma mall som visar alla våra tjänster, och då har vi den här annonsen sak, och när du klickar på posten, går det till en ny rutt i Flask, men den vägen inte nödvändigtvis ha en motsvarande mall. Du behöver inte se något, men du kan fortfarande har detta arbete pågår bakom kulisserna. Och sedan får du omdirigeras tillbaka till startsidan. Och definitivt, är det lätt att arbeta i vissa trevligare CSS i mallen och gör detta ser mycket trevligare, men alla huvudlogik finns det i Python. Eventuella frågor om detta exempel? Jag vet att det finns en hel del olika saker som händer där, en massa saker som vi inte hade sett förut, men som allt. Ja. PUBLIK 1: Har du att göra något speciellt att skrubba de data som är kommer in från formen? Jag märkte att du just sa "skapa" EZRA Zigmond: Ja, så det är faktiskt, det är en riktigt bra poäng. Så frågan var, gör du måste kontrollera och se till att uppgifterna är giltiga, och gör någon form av skur att se till att det är giltigt, för som ni kan se här, Jag gör inte det. Så låt oss se vad som händer om jag lägger något tomt. Så kommer det faktiskt bara göra en blank post och fyll i Datetime. Så i verkligheten, skulle du förmodligen vill göra något liknande, kanske ange om titeln är lika med den tomma strängen, sedan inte gör det. Eller, bara göra det om titeln är inte är lika med den tomma strängen. Så det faktiskt inte automatiskt ta hand om det skrubb för dig, så du måste fortfarande göra det. Ja, bra fråga. PUBLIK 2: Gör det scrub för fortsättning injektionen? Vet du? EZRA Zigmond: Förhoppningsvis PeeWee gör det. Jag tror att det skulle verkligen vara en ganska dålig biblioteket om det inte gör det. Jag vet inte exakt. Jag skulle behöva titta på fråga att det genereras. Jag tror att om jag skrev i en blogginlägg den sortens såg som en SQL-injektion attack, ungefär så här, om detta är som ett lösenordsfält eller något, du kan göra något sånt här. Jag tror att det kommer fortfarande får bokstavligen skrivit, men jag tror att peewee gör någon form av skrubb av data innan det faktiskt utför det. PUBLIK 1: Att textfält är utformad för att ta oformaterad text, eller hur? EZRA Zigmond: Ja, det är det. Ja. Så jag tror att alla, så det här är korrekt beteende, som kommer att göra det, men jag tror att peewee förhoppningsvis gör någon form av skydd på deras ände. Och om du ville dubbelkolla att det finns sätt när du skapar en fråga. så att du inte behöver verkställa det direkt. Jag skulle behöva ta en titta på dokumentation, men du kan faktiskt se SQL att den genererar, och ta en titt på det, och göra Se till att det strömmar ut saker. En annan anledning till varför du kanske vill titta på SQL att peewee matar ut, är om saker verkar gå riktigt långsamt, du kan ta en titt och se hur det är faktiskt gör, eftersom det är ibland lätt att av misstag lägga i det sätt du skriver det, Du kan av misstag ha det markera hela databasen först, och sedan göra något slags operation på det, när du verkligen tänkt att välja en delmängd. Och så, om saker och ting inte helt går rätt, det är bra att ta en titt på begäran det är faktiskt få genereras. Ja. PUBLIK 2: När du började, du sätter i hamnen som 5000. EZRA Zigmond: Ja. PUBLIK 2: Är standard med peewee, eller är det något du kan ändra? EZRA Zigmond: Ja, så port är standard med Flask. Om du kör det utan specificera något, Det kommer automatiskt att göra det. Jag tror, ​​jag skulle ha att dubbelkolla detta, men du kan ange att i app.run, Jag tror att du kan göra något liknande, port = 8080. Låt oss ge det ett försök riktigt snabbt. Ja, så kan du bara ange port = 8080, och det kommer att köras det där, som jag tror, ​​om du ville köra det på IDE, har jag inte provat detta, men jag tror att om du körde det på port 8080, du förmodligen skulle kunna att få tillgång till servern, precis som du var för webbplatsen. Ja, men det lätt att ändra på det om du har någon form av liknande port vidarebefordran saker som du behöver göra. Alla andra frågor? Ja? PUBLIK 1: Så såg jag i modeller som, som du nämnde, du måste ange databas för varje objekt. Råkar du veta, gör som gör det riktigt enkelt om du har massor av SQLite databaser som du vill använda för en enda web app, att du bara kan ange ett gäng av olika listor i din modell? EZRA Zigmond: Ja, låt mig öppna upp det riktigt snabbt. Så du säger, om du vill ha ett gäng olika något, kanske gillar och studenterna, för vissa Därför nåt sånt? Ja, så tror jag att du fortfarande, varje modell skulle behöva fortfarande ha bara en databas tilldelats, men om du ville ha olika modeller som har olika databasobjekt tilldelas till det, kan du definitivt göra det. Så, om jag skapade en ny, något som det här, och nu detta är en student som ser konstigt ut som ett blogginlägg, Jag kunde ange att databasen är lika med db_2 här. Så jag tror det är huvudsakliga sättet du kan göra det. Häftigt. Alla andra frågor? Så bara för att avsluta lite bit, här är några resurser, och dessa bilderna kommer att publiceras på nätet så att du kan faktiskt få dessa länkar. De bästa resurserna är verkligen dokumentationen för Flask och Peewee själva. De är skrivna riktigt bra, tror jag. Så är Flask hemsida här, och de har en snabbstart handledning som kommer att gå igenom liknande saker för vad jag gick igenom, men om du vill ha någon form av översyn av de saker som jag gick över, eller du trodde att jag förklarade något på ett förvirrande sätt, de kommer att ha liknande exempel där. Peewee har dokumentation, och de har en snabbstart handledning som går över de viktigaste parametrarna som du skulle vilja använda. Så de saker som jag talade om med de unika, och specificera defaults, de olika typer av områden som du kan använda, som alla skulle vara där. Dessutom, om du har frågor om PeeWee, och du lägger dem på Stackoverflow, killen som gjorde peewee faktiskt fortsätter och svarar dem ibland. Om du har en fråga, förhoppningsvis Han kommer att kunna svara på det, eftersom han skrev hela. Jag tror att det är allt Jag ville täcka. Tack för att ni kom ut.