[Musik spiller] EZRA Zigmond: Hej, alle. Tak for at komme ud i dag. Dette seminar er "Python Web Apps med kolbe. " Så jeg har tænkt mig at tale en lille smule om, hvorfor du måske ønsker at bruge Flask til at gøre web apps med Python, i modsætning til nogle andre rammer derude, ligesom Django, som er den mest kendte. Undertitlen er "og peewee ", som er noget vi kommer til at tale om, hvordan at interagere med SQL-databaser. Det gør det virkelig rart. Så her er bare en hurtig gennemgang af, hvad jeg ønsker at gå over. Så først, kun et slide der kommer til at være quickstart, hvilket er, hvordan man får det hele oprettet på din computer. Jeg har tænkt mig at demonstrere dette på min lokale Mac-maskine, bare fordi det er her, jeg har gjort det før, jeg er mest tryg ved det, men dette er absolut muligt på CD50 IDE. Så efter det, jeg ønsker at indføre hvad Kolben, og overbevise dig, hvorfor du bør bruge det i første omgang. Derefter vil jeg give et hurtigt eksempel på, hvad du kan gøre i kolbe, et hurtigt eksempel af, hvad du kan gøre i peewee, og så vil jeg vise dig en mere komplet eksempel ansøgning at jeg sat sammen, at vi kan gå igennem sammen. Og derefter endelig i det sidste dias, jeg har nogle ressourcer, som du ser på online for mere information. Dette er ikke en komplet tutorial af hvordan man bruger Flask. Og jeg vil håbe at forlade lidt tid til spørgsmål. Enhver ser lokalt, lige lignende, råbe i midten hvis du har nogen spørgsmål. Så hurtig installation kram, hvis du ønsker at følge med, eller hvis du ønsker at få denne op på din egen maskine, Jeg har tænkt mig at bruge Python 2.7.10. Kolbe virker med Python 3, men jeg kan lide ved hjælp af Python 2, fordi der er nogle Python pakker, arbejder ikke med 3 endnu. Hvis du pip har installeret, som er en Python-pakke manager, Jeg tror, ​​at hvis din Python er større end eller lig med 2.7.9, du har det installeret allerede, det er super nemt at installere disse pakker. Du kan gøre pip installere Kolbe pip installere peewee, normalt du nødt til at køre sudo bare således at tilladelserne arbejde ud. Og hvis du bruger en super gammel version af Python, Jeg anbefaler at opdatere din Python, eller ved hjælp af EasyInstall at installere pip. Så det næste spørgsmål er, hvad er Flask? Og jeg tror, ​​først et rimelige spørgsmål, jeg spekulerede i lang tid er, hvad er en web-app? Fordi det er et ord, som jeg Think er kastet rundt en masse at jeg ikke rigtig kender. Og jeg tror, ​​at det bedste eksempel på, hvad en web-app er, virkelig CS50 Finans, hvor det er egentlig ikke bare en hjemmeside, men det er noget, du kunne slags interagere med. Der er brugerkonti og alle mulige forskellige ting. Så hvor præcist du trække linje mellem, hvad der er en hjemmeside, og hvad er en web-app, er en slags vilkårlig, men jeg gætter ideen, det er noget mere end en hjemmeside og det er en nyttig anvendelse. Så Kolbe er en ramme for gør web apps ved hjælp af Python. Og forhåbentlig ved udgangen af dette, vil jeg overbevise dig at du faktisk kunne skrive noget ligesom CS50 Finans hjælp Python, som jeg som en masse bedre end PHP, personligt. Så Kolbe er, de kalder en microframework, hvorved, de betyder det meget enkle, men strækbar. Så det har lige hvad du har brug for, men hvis du ønsker flere funktioner, det er nemt at bringe dem i. Men bare fordi det er en microframework, ikke betyder, at det er kun for små projekter. Jeg har et link her, der siger at Obama brugte Flask i 2012 for hans kampagne hjemmeside, som forhåbentlig, er noget af en påtegning. Men det, som jeg virkelig kan lide ved Flask er, at det ikke virkelig gøre nogen form for beslutninger for dig. Bare fordi vi er taler om web apps, Jeg er nødt til at sammenligne det med Ruby on Skinner og Django, som begge er store rammer, men de begge gøre antagelser om, hvordan du vil interagere med databaser, hvordan du vil præsentere din synspunkter, og de er helt sikkert gode aspekter til det. For eksempel, Ruby on Rails har denne aktive rekord-system, som er en virkelig rart måde at interagere med data, men hvis du ønsker at bruge Ruby on Skinner, du slags bundet til det. Men med kolbe, som jeg vil vise dig med peewee, du kan bruge uanset slags database, du ønsker, og du kan bare trække det i som en udvidelse i kolbe. Så det er derfor jeg virkelig Ligesom kolbe, er det, at det ikke gøre antagelser for dig baseret på ting, du ikke har brug for rigtig. Så hvorfor skal du bruge Flask? Fordelene er, det bare har virkelig de centrale funktioner bygget ind i det, du har brug for. Så behøver du ikke at bekymre dig om forstå en hel masse ting at du ikke virkelig har brug for. Du behøver ikke at skulle bekymre sig om at slukke funktioner at du ikke virkelig har brug for. Og som jeg nævnte, det er super nemt at tilføje i udvidelser af ting at du har brug for. Nogle af dem, har Flask deres egen støtte til det. Så der er noget, der hedder Flask admin, hvilket afspejler, at admin panel, der Django bestemmer, som giver dig en dejlig visuel måde til at administrere din hjemmeside. Men igen, hvis du er gør noget simpelt, du sandsynligvis ikke brug for en stor admin panel, så jeg tror, ​​det er super nice. Og ulemper er, at du har mindre effekt ud af kassen. Så når du først åbne op kolbe, og i din Python-program, du bare skrive fra Flask import *, eller hvad, behøver du ikke ligefrem få alle de funktioner, du måske ønsker. Og så er du nødt til mere eksplicit en liste over de funktioner, du ønsker. Så det er en ulempe, men jeg mener, at for at bygge lille web apps som jeg har tænkt mig at være at vise dig, det er egentlig ikke et problem. Og hvad det sidste, er skal sige, hvilket er en tastefejl, er, at der er mindre standardiserede konventioner for, hvordan man bruger Flask, bare fordi der ikke er så mange mennesker, der bruger det professionelt i forhold til Django. Så hvis du ser noget lignende, "hvordan gør jeg x" i Django, du skal nok finde det. Der er godt design mønstre, du kan bruge, men med kolbe, er det slags gå din egen måde, bare fordi det er en temmelig lille bibliotek. Så det er de ulemper, men jeg tror at det stadig er et godt bibliotek til at bruge. Så lad os bare hoppe direkte ind i kolbe. Dette er absolut ikke vil at være en komplet tutorial, men det er for at give dig en idé af hvordan man kan strukturere tingene, og så du føler dig tryg at gå off og kigge på dokumentationen og finde ud af mere. Så lad mig åbne op for en virkelig simpelt eksempel i starten, og vise dig, hvad der ser ud, og så vil vi bryde det ned en lille smule mere. Så dette her, lad mig få det kører. Så har jeg nu min ansøgning kørende. Jeg har tænkt mig at åbne op Safari, og det kører på min lokale vært. Så jeg bare at gøre det større. Men localhost: 5000 Og så, lige nu, alt dette gør er, når du besøger hjemmesiden, det udskriver "Hello kolbe," som ikke er super nyttigt, men jeg synes det er cool, at i denne lille fil her, vi har en webserver kørende der udskriver ud af noget. Så lad os faktisk ser på koden til en anden, og bryde det ned en lille smule. Er størrelsen god for alle her? Så forhåbentlig er du noget trygge ved at bruge Python. Jeg antager, at vi kan se på Python og læse igennem den. Hvis du har spørgsmål om noget, kan jeg også gå over det. Så den første linje er fra kolbe, vi importerer, Kolbe med stort "F" som er en slags alle centrale funktioner, som du har brug for. Når du skriver en fil og bruge kolbe, du vil ønsker at importere det, bare fordi der har alle de vigtigste ting. Den næste ting, vi gør, er, at vi kalder denne funktion kolbe lige at skabe en app objekt, og du er altid vil ønsker at gøre det. Og så, hoppe ned til den bunden hurtigt, denne del her er, 'if_name _ == "_ main_"', som er sortering af en Python konvention. Så dette vil kun udføre, hvis du køre denne fil direkte ved hjælp af Python. Derefter kalder vi app.run, som vil faktisk begynde app går. Så det er den vigtigste struktur, har du på nogen Flask ansøgning, er du vil have denne app = Flask (_NAME_) og derefter app.run. Så de to ting, som jeg har herinde, er det, vi kalder ruter. Så lad os tale om routing lidt mere. Jeg vil gå tilbage til dias. Så den mest fundamentale koncept i kolbe routing. Og det er den idé, at du tildele funktioner i Python til bestemte adresser på din webside. Så når du vil at oprette en ny rute, du bruger denne @ app.route funktion dekoratør. Så hvis du ikke er bekendt med funktion dekoratører i Python, Det er dette begreb kan du tage en funktion og omgive det med noget andet. Så virkelig, hvad denne dekoratør gør, er, at det tager funktionen under det, og det tilføjer mere information til det, men hvad Flask faktisk gør at ske, er ikke super afgørende, men hvad der er vigtigt, er, at før ruten, du sætte dette @ app.route, og derefter adressen på ruten, så skråstregen er, hvad vi så når vi bare åbner websiden. Så det er hjemmesiden. Det er bare den skråstreg rute. Og så har du denne funktion. Navnet på funktionen kan være hvad du vil. Det behøver ikke nødvendigvis har at gøre med ruten. Og så, hvad funktionens afkast, funktionen skal returnere en streng. Og at strengen kan indeholder HTML eller noget, og det er faktisk, hvad får returneret til din webbrowser som HTML, og det vil gøre det. Så det er den samme kode der var fra eksemplet at jeg bare løb, så når vi besøger skråstreg, den kalder en Hello World funktion, som bare returnerer en streng, Hej kolbe, og der bliver trykt på skærmen. Så der er et andet eksempel, hvilket er, når du besøger / hej, det udskriver Hej Word, som bør faktisk sige, Hello World, men lad os lade som var tilsigtet. Så lad os trække det op virkelig hurtig. Så hvis du går til localhost / hej, Det vil nu udskrive noget andet. Så det er bare en hurtig eksempel på, hvordan kan du oprette to forskellige ruter. Så indtil videre er det ikke super nyttigt, Der er ikke en hel masse, du kan gøre, du bare kunne gøre alt det med har forskellige HTML-sider, og når du besøger et bestemt side det bare indlæser siden. Så lad os se nogle flere nyttige ting, du kan gøre. Så en ting, som du måske har bemærket i det eksempel, at jeg trak op, er, at jeg havde app.run (debug = True). Og ja, hvad dette debug argument gør, er at når du kører din webserver, når du er i din ansøgning, hvis du ændrer en fil, vil det automatisk genindlæse serveren. Og så behøver du faktisk ikke behøver at Genstart Python, som er super nyttig. Jeg kan vise, at. Lad mig trække op min kode med tastefejl i det, og foregive, at tastefejl blev lagt der med vilje til lærerige formål. Så lad os tilføje denne igen. Så nu står Hello World. Jeg vil gemme det. Og hvis vi trække sig tilbage op terminalen, vil du siger, at det er at genstarte, fordi det detekteres en, og så nu når vi genindlæse denne side det vil udskrive den korrekte ting. Så debug er super nyttigt at. Også, hvis du har nogen sortering af et nedbrud, så lad mig gøre denne ansøgning nedbrud ved at have det ikke returnere en streng. Så lad os bare få det returnere Ingen anden grund. Og så når jeg besøger denne side, vil det bare gå ned, men serveren ikke bare gå ned, det faktisk giver dig en super anvendelig ryg spor af alt, hvad der gik galt. Og hvad er virkelig rart, er, at på ethvert skridt i denne ryg spor, du kunne åbne op et interaktivt shell her og sortering af udskrive hvad variabler, du ønsker at tage et kig på. Og så debugging er virkelig nyttigt for at finde ud af hvad der sker med din server, snarere end blot at se noget i PHP som en 500 intern serverfejl, som er super ubrugelig. Én ting at være opmærksom på, er at hvis du lægger din app online så det er synligt for offentligheden, du aldrig ønsker at forlade debug mode på, fordi folk kan faktisk bruge konsol, som jeg viste du at udføre vilkårlig kode. Så de kan printe ud som enhver hemmelige koder, du har derinde, de kan se på nøjagtig hvordan din hjemmeside virker. Så det er virkelig nyttigt til test, men altid sørge for at tage det ud før du udgiver noget online. Så når du bruger noget som PHP, der er denne idé at du kan passere oplysninger mellem websider ved at sætte oplysningerne faktisk i URL'en, som er en GET-anmodning, men i kolbe, kan du faktisk gøre noget lidt ligesom det, ved at have en rute, der har en variabel som en del af det. Så hvis man ser på det eksempel på skærmen her, vi har en rute, der er ('/ goddag / «), og så, hvis du besøger / hej / noget, at noget vil faktisk få fyldt i navnet variabel. Og bemærk, at funktionen der kommer med denne rute skal tage i parameteren navn, således at det rent faktisk komme videre i funktionen. Og så, når du er indersiden af ​​denne funktion, du kan behandle, at ligesom en normal Python variabel, og så da, vil det udskrive Hej, og det vil udfylde navnet ved hjælp nogle snor formatering. Så for at tilføje variable dele til en routing, du bruger den vinkel beslag mærkning. Og eventuelt kan du bruge hvad der kaldes en konverter. Og så, hvis du sætte dette annotation med colon, du kan angive, at det er en int eller en float, eller sti, og det vil automatisk konvertere det. Du kan også gøre konverteringen inden for Python-funktion, blot ved hjælp af et støbt, men nogle gange, hvis du ønsker at sikre, at det er en int, du kan sætte det konvertering regel derinde. Så lad os trække et eksempel nogle variable regler. Så her, har dette den samme grundlæggende struktur med fra kolbe import Kolbe app = Kolbe (_NAME_), og derefter det kører i slutningen. Vi har disse to forskellige variable ruter her. Og den første, er den, som jeg viste i det dias, som var, at det tager bare i en streng navn og det vil udskrive Hej, Navn. Og så, den anden man bruger konverteringen. Så dette vil automatisk konvertere det til en int, og derefter fordoble int, og udskrive det ud. Og, vi ikke gør nogen form konvertering inden det fordi kolbe tager sig af det. Så lad os få dette løb. Når du har en Flask program kørende, Du kan styre-C ud af det at stoppe server, der kører. Og så vil jeg køre variabler. Så lad os gå til localhost / goddag / Ezra og Forhåbentlig vil dette sige hej til mig. Så det tog i mit navn, i variablen ruten, og det fyldte det herinde. Så jeg vil også vise en hurtig eksempel på fordobling. Så hvis du går til / dobbelt / 3, det vil udskrive 6. Så dette tog sig af konverteringen for os. Så du kan også gøre det med flyde, og noget særligt, hvis du har brug for at angive noget som en sti, der lader den acceptere skråstreger, men det bør ikke normalt være et problem. Indtil videre har vi, stadig har netop blevet tilbage strenge, som ikke er meget interessant. Vi kunne faktisk vende tilbage bogstavelig HTML streng. Så i koden kan vi indsætte noget ligesom b-tag for at gøre det fed, men de fleste den tid, du ikke faktisk ønsker at skrive HTML-kode i din Python kode. Det bliver rigtig rodet, og det er ikke et godt tidspunkt. Kolbe giver os mulighed for at adskille den HTML i, hvad der kaldes den skabelon, og så hvis du tænker i form af MVC model at du er fortrolig med, forhåbentlig, fra at arbejde med CS50 Finance en lille smule, du kan tænke på de Python filer som værende mere af controlleren, hvor de interagerer med uanset datamodel, du måtte have. Og så ringer ud til visninger og videregive oplysninger til Vis at udfylde de oplysninger i HTML, som den har brug for. Og det, vi kalder disse synspunkter er skabeloner i klassen. Så Kolbe bruger en anden Python modul, vil det automatisk installere, når du pip installere Flask kaldet Jinja, som lader dig tilføje disse anmærkninger til HTML som du ser på skærmen, som lader du lægger i ting som betingede, og sløjfer i HTML. Så det ser lidt ligesom, hvordan du kan bruge PHP i en HTML-fil, men det er bare når Flask server serverer HTML-filen, det vil køre denne templating motor og parse igennem dette og udfylde tingene i. Så Kolbe har en render_template funktion at du kan se nederst her. Og så når du besøger denne side, er det ville gøre dette hello.html skabelon, og derefter udfylde denne HTML-side. Så lad os bare køre denne virkelige hurtig, og se, hvad det ser ud, og så vil jeg gå gennem en lidt mere detaljeret. Så er dine skabeloner går at gå i en mappe Skabeloner. Det vil automatisk kigge indenfor Skabeloner mappe for denne skabelon. Så lad os åbne denne op. Så vil jeg køre skabelonmidlet eksempel. Så hvis jeg går til / goddag / Ezra, det har denne forfærdelige, klamt telt tag, jeg sætter i. Meget flot, meget dynamisk. Jeg er en stor fan. Men hvad sker der, hvis Jeg bare gå til, / hej? Så det bare siger Hello World. Jeg vidste ikke give det et navn, og det fyldt det automatisk. Så lad os se, hvordan det gjorde det, og hvordan vi kan slippe af med det telt måske. Så her, det er slags et interessant eksempel på, hvis du er fortrolig med, hvordan kontakten udsagn arbejder på et sprog. Sige dette er lidt ligesom, den slags et fald igennem, hvor du faktisk knyttet to forskellige veje til samme funktion. Så vi vedhæfte / hej rute og den / goddag / navn rute til Hello, og vi angiver using-- Python lader dig specificere standard funktion arguments-- så hvis der er noget navn, så hvis vi går til lige / hej, det vil automatisk filtrere at nævne er lig med Ingen. Så, vi gør Skabelon med name = navn, så det vil passere i navnet parameter svarende til dette navn funktion parameter, ind i skabelonen. Det stadig ikke forklare, hvordan er beslutter, om der skal udskrives Hello World, eller udskrive mit navn. Så lad os faktisk ser ind i skabelonen selv, og se, hvor der kommer fra. Så inden for denne skabelon, vi faktisk har nogle betinget logik, som nogle mennesker ville argumentere, du rent faktisk bør ikke have en masse betinget logik i din skabelon selv. Det bør være mere i Controller, men i dette eksempel det er noget temmelig lille. Så her, vi kontrollere, hvis navn, så hvis navn er ikke lig med Ingen, Hvis et navn er faktisk bestået i, så vil vi sige Hej, navn med header og markeringsrammen, alt dette normalt HTML, ellers vil vi udskrive Hej, verden bare normalt. Så et par ting at bemærke her om, hvordan du formaterer templating, er, at alle disse betingede udsagn, lidt ligesom, hvordan vi PHP det, når du vil indsætte nogle PHP, du bruger mindre end spørgsmål mark, det er en slags analog her med {%. Så her har vi vores betingede kode. Og så, når du rent faktisk ønsker at bogstaveligt vurdere noget, og udskrive det ud til skærmen, du bruge de dobbelte seler. Så her er de dobbelte seler, og så vi angiver navn, så inden for denne, vil det evaluere til variabelnavnet, som blev vedtaget i fra gøre skabelonfunktion, snarere end blot udskrivning ud, hvis vi sluppet af disse, det ville bare udskrive ordet "navn." Så det er noget at holde øje med. Så en anden ting at varsel er, at når vi ønsker at bruge render_template funktion, vi faktisk nødt til at importere udtrykkeligt fra kolbe. Og dette er et eksempel på modularitet af kolbe, at du ikke behøver at importere ting, som du ikke har brug for. Du kan bare medbringe i funktioner, du faktisk har brug for, som undertiden nice, så du ikke nødt til at have alle disse funktioner sidder rundt, at du ikke bruger, men også, hvis du glemmer, at du nødt til at importere render_template, vil du sandsynligvis få en advarsel der vil lade dig vide om det. Så det er templating. Så har vi vist, hvordan man gøre simple websider, og tilføje en lille smule mere logik til det, i form af den variable routing. Det kan du gøre forskellige ting baseret på hvad URL du går til, og også da, giver HTML lidt mere mening i forhold til, hvordan du ønsker at gøre tingene. Du behøver ikke at sætte alle din HTML i din Python, men for stort set hver webapplikation, du vil ønsker en slags af datamodel forbundet med det. Og så traditionelt, ville dette være noget i en SQL-database. Og du kan bare interagere direkte med SQL. Python har, tror jeg det hedder. SQLite 3. Du kan bare importere SQLite 3 og udføre SQL-forespørgsler direkte, men jeg ved ikke, om dig, men jeg virkelig ikke kan lide, bare, skrive ud SQL-forespørgsler. Den tendens til at få virkelig lang og kompliceret. Og ja, noget der Jeg kan lide at bruge, er, hvad der er kendt som en ORM, hvilket er en objekt-relationel mapping. Og det punkt i en objekt-relationel mapping, er, at der er to forskellige måder, du kan tænke på databaser. Så det eksempel, Professor Malan normalt bruger i klassen, er Excel-tabellen, hvor du har disse rækker og disse kolonner, og det er virkelig nyttige for hvordan det er repræsenteret i SQL og hvordan du interagerer med det, men en anden måde, at det faktisk nyttigt at tænke over det til tider, er i form af klasser og objekter. Så i stedet for at tænke af hver tabel som havende denne række, der har en vis oplysninger, kan du faktisk tænk på det som værende hver tabel er en klasse, og derefter hver forekomst af klasse har bestemte egenskaber. Så i dette eksempel, forekomster af klassen er rækkerne i tabellen, og derefter hver ejendom ville være en kolonne i tabellen. Så ORM, som jeg kan lide at bruge kaldes peewee. Det er virkelig små, lidt ligesom Flask. Jeg tror, ​​at de går godt sammen, men der er en masse andre ORMs som du kan bruge. En mere populære er kendt som SQLAlchemy, og jeg kan ikke huske, hvorfor jeg oprindeligt valgte peewee løbet SQLAlchemy, eller jeg ville fortælle dig, hvorfor jeg synes det er den bedste, men vi bare kommer til at bruge denne en, fordi jeg ved, hvordan man bruger det. Så et spørgsmål er, hvorfor bør du gider at bruge en ORM, i stedet for bare direkte skrive SQL-forespørgsler? Og jeg tror, ​​den bedste fald er, at du faktisk ikke nødt til at skrive SQL-forespørgsler. Det er meget lettere, som jeg vil vise dig, at gøre ting som valg, indsættelse, deletion, især oprettelse af tabeller. Det er meget lettere at skrive en klassestruktur, end det er at strukturere en Opret Tabel erklæring, men én ting at være opmærksom på, er, at ORM vil prøve sit bedste at regne ud, hvad den mest effektiv SQL forespørgsel ville være, men nogle gange bliver det det forkert. Og især hvis du er arbejder med en stor database, du kan mærke, at en forespørgsel der bør kører hurtigt, er faktisk at tage længere tid. Og hvis man ser under kølerhjelmen på, hvordan ORM er fortolkningen af ​​denne ind i SQL, det kunne gøre noget virkelig latterligt, bare fordi det slags gestikulerede dine intentioner forkert. Og der har været tidspunkter, hvor Jeg har haft til at tilsidesætte den, og bare udføre mine egne SQL-forespørgsler, bare fordi det var parsing på en mærkelig måde. Så der er visse overhead, bare i vejen at det samler din erklæringer ned i SQL. Så lad os se super hurtigt på Et simpelt eksempel på en datamodel at du kan bruge. Så dette er Python-kode, og så første ting du vil gøre, er fra peewee import *. Så i modsætning til kolbe, hvor du har alle disse individuelle moduler, og du ønsker at importere Flask, og skrive en skabelon, og nogle andre at vi vil se senere, fra peewee, du kan bare importere alt, fordi det er en temmelig lille bibliotek. Så den første ting, du ønsker at gøre, er faktisk oprette denne database objekt. Så du har db = SqliteDatabase, og derefter navnet på din database. Og det vil faktisk oprette en database objekt at du kan interagere med, med peewee. Og så har vi den faktiske model, som vi ønsker at skabe. Så tabellen vi ønsker at skabe. Så inden peewee, hver klasse har sin egen tabel i din database. Så alle klasserne arver fra basismodellen, og stort M model er noget, der er defineret i peewee. Så alle dine modeller skal arver som højeste superklasse, de skal arve fra model, men hvad er virkelig cool, er, at du rent faktisk kan få din modeller arver fra hinanden. Og en stor del af tiden, din datamodeller ikke nødvendigvis gøre en dejlig arv hierarki, men tidspunkter, hvor de gør det, det er virkelig rart, fordi du har den model, iboende fra hinanden. Så vi definerede denne klasse "elev", som arver en model, og det har tre egenskaber. Det har et id, som er en PrimaryKeyField, som er noget, der er forudsat ved peewee, navn er en CharField, og en karakter er en IntegerField. Så dette kan eller ikke kan være hvordan CS50 faktisk gemmer alle de studerendes karakterer. Det er ikke, men det er sådan jeg ville gøre det. Og så har det, inden denne klasse, og dette er noget du kan gøre med Python, kan du have indlejrede klasser. Og det er noget der er krævet af peewee. Så denne klasse Meta, har du at angive, at databasen er svarende til objektet at vi skabte ovenfor. Og det siger, hvad filen er denne tabel faktisk vil være indeholdt i. Så det er noget, du har at gøre inden alle dine modeller. Du skal bare nødt til at angive inden for denne klasse Meta denne database er lig med db. Så hvad jeg plejer at gøre, hvis jeg har en masse forskellige modeller, er, at jeg har én base model, som jeg plejer bare ringe "base model" der har Meta klasse, og den sætter databasen svarende til db. Og så alle mine efterfølgende modeller vil arve fra denne base klasse. Og så har jeg ikke behøver at bekymre sig om indstilling af Meta klasse. Så når det rent faktisk får kompileret ned i en SQL-sætning, det ligner denne modbydelige ting ned her, "Opret tabel studiekort heltal, " hvad end. Og jeg tror, ​​at det er kortere, denne SQL-forespørgsel lige her, men hvis man ser på denne klasse her du kan se præcis, hvad der foregår. Du kan se, hvilke slags felter Der er, hvad de hedder, og så synes jeg, at ser på denne Python kode er meget mere læsbar end forsøger at skrive denne SQL-forespørgsel. Så for at rent faktisk bruge databasen, vi er nødt til at oprette forbindelse til dem i Python. Så jeg plejer at skrive en funktion kaldet initialize_db der gør to ting. Det tager i databasen objekt db og det forbinder til det, som netop åbner PUNKT til databasen. Hvis du bare kører selv hjemmeside på din lokale maskine, det er ikke en super big deal at bekymre om tilslutning og afbrydelse, men hvis du kører det på en hjemmeside, du ønsker at sikre, at når en bruger opretter forbindelse til det, når de lukker ud hjemmesiden, de afbryde så du har ikke en masse mennesker, der er forbundet til din database på én gang. Og så, når du forbindelse til databasen, du vil ringe db.create_tables, og en liste over de modeller for, hvad du vil at oprette tabeller. Så her, jeg vil bare gerne skabe det for denne elev. Og så, hvad der er vigtigt, er at specificere sikker = True meste tiden. Hvad dette udsagn, så vil gøre, er, at det skaber tabeller for studerende model, men kun hvis denne tabel ikke blevet oprettet allerede. Det er, hvad de sikre specificerer. Så det vil ikke overskrive din eksisterende tabel, det vil kun skabe en ny tabellen, hvis der ikke er en der. Så kan du bare oprette tabellerne én gang med SQL. Og så har denne database møde der, og derefter oprette forbindelse til hver gang, men det er som regel rart bare at sat i dette create_tables opkald, således at hvis du nogensinde slette din database, når du kører din web app igen, vil det genskabe det. Så bare sørg for, at sikker er angivet til at være sandt, eller vil du finde dine data bare få clobbered hver gang. Og så kan du bare ringe initialize_db at etablere en forbindelse, og opret tabeller om nødvendigt. Så den mest almindelige ting at du ønsker at gøre, eller en af ​​de mest almindelige ting, er rent faktisk at indsætte ting ind i din database. Og så, i stedet for at at skrive en indsats INTO erklæring med alle værdierne angivet, du rent faktisk kan kalde Funktionen af ​​den studerendes klasse. Så når du opretter en klasse der arver fra model, det har det skabe metode. Så du gør klasse name.create, og du angiver parametrene at du ønsker at passere i. Så hvis jeg ønsker at tilføje nogle elever til vores CS50 karakterbog eksempel Jeg vil sætte i David, som har en meget god kvalitet, han har en 95. Og mig selv, hvem der ikke gør så godt i CS50, jeg har en 50. Og så, det gode ved hvad det skabe funktion gør, er, at det returnerer eksempel, eller den række, at det skabte i tabellen, og så derefter du gemmer det i en variabel, og arbejdet med det senere. Du kan ændre rundt, hvilket Jeg vil vise et eksempel på. Bemærk, at jeg ikke nødt til at angive ID, fordi da det er PrimaryKeyField, vil det automatisk tilvækst det, hvis du ikke angiver det. Og i virkeligheden, har du sandsynligvis bør ikke angive det, fordi du måske ved et uheld tæske en andens id. Og du ønsker at gøre sikker på, at det er unikt. Så faktisk den mest fælles ting du ønsker at gøre, er formodentlig vælge ud af databasen, når du har en masse oplysninger i der. Og så, hvis du ønsker at få alt, så hvad der svarer til de udvalgte stjerne fra studerende erklæring, det ville bare være student.select. Og det vil give dig tilbage et array med alle de studerende objekter i det at du gentage over du ønsker. Du kan få tingene ud af det. Og det meste af tiden, du ikke bare ønsker at gøre vælge, du rent faktisk ønsker at angive noget. Og så kan du kæde sammen disse funktionskald, gerne, hvordan du ville kæde sammen udtalelserne i SQL. Så du kan gøre student.select (). Hvor i dette eksempel. Og så kan du fastsætte betingelserne, bare bruge almindelig Python Booleans at kontrollere ting. Så i dette tilfælde, du ønsker at begrænse, hvad du vælger til, hvor student.grade er lig med 50, og student.name er lig med Ezra, så vil bare få mig ud af det. Og læg mærke til, en virkelig subtile ting her er at hvis du vil angive en og / eller der ligger en eller / eller, i Python, ville du normalt bruger, Jeg tror, ​​at ordet "og" faktisk, men her du bruger enkelt-tegn, som normalt er en bitvis operatør, men i dette særlige tilfælde, bare den måde peewee gør det, du bruge single tegnet til at angive "og". Det er noget, Jeg bliver blandet op en masse, men det kommer ikke op så meget i praksis. Og så, når du har alle de studerende ud af databasen, når du har gjort, du er ved at vælge og din slid eller hvad, du kan bruge en foreach løkke, ligesom normale i Python, med nogen form for iterator eller med nogen form for array. Så du kan gøre, for s i student.select (). whe re (Student.grade <75), og så dette vil gentage over hver elev i tabellen hvis kvalitet er mindre end 75, som i dette tilfælde, er stadig bare mig. Og så kunne du gøre noget inden for at sløjfe, ligesom send mig en mail og fortælle mig at der faktisk vende i mit problem Sets. Så en anden ting du kan gør, er det er virkelig nemt at opdatere rækker i tabellen. Så husk tilbage her, din når jeg indsat, Jeg tog den værdi, der var returneret af student.create, og jeg tildelt det til navnet hedder Ezra. Og så nu, kan du ændre værdier inden for dette eksempel, ligesom du ville en normal klasse i Python. Så du kan sætte ezra.grade = 95 og der vil opdatere den lokale kopi, men hvis du rent faktisk ønsker at tilsagn om, at ændring af databasen, du skal kalde ezra.save, så du kaldte .save metode på forekomst. Og så nu, har jeg med succes skiftet min egen klasse i databasen. Ja, så lad os sige, at jeg bliver fanget ændre min klasse i databasen. Professor Malan er sandsynligvis vil at ønsker at slette mig fra klassen, og så kan du ringe til .delete instans metode bare på at ting. Så hvis du ønskede at gå tilbage i denne sløjfe her, og faktisk, i stedet for at sende e-mails alle af de studerende, hvis kvalitet er mindre end 75, du ønskede at slette dem, inden for denne løkke du kunne kalder s.delete instans. Og den allersidste ting du ønsker at gøre, er, når du opretter en forbindelse, og du er færdig med dit arbejde, du vil ringe db.close, hvor db er, at databasen indvende, at vi havde før. Og du vil være sikker på, at alt bliver lukket ud af. Afkøle. Så nu har jeg et eksempel ansøgning. Jeg har en slags pre-made alt bare således at der ikke vil være nogen levende kodning fejl, men vi kan gå igennem det og se, hvordan du ville sætte Flask og Peewee sammen, og gøre en simpel app. Jeg kalder det CS50 rant, og det er sortering af en simpel blog-platform. Så først vil jeg køre det og vise, hvad det ligner, og så kan vi se mere i koden. Okay, så lad os bare køre dette. Cool, jeg vil gøre dette lidt mindre. Det er ikke meget smuk, bare fordi Jeg har ikke gøre en masse CSS, men hvad det gør, er, har det denne database af blogindlæg, og det går gennem alle dem, og det vil vise dem på siden i den rækkefølge, det seneste. Og så disse er blot nogle stillinger at jeg havde gemt i databasen. Så hvis vi ønsker at skabe en ny post, kan vi gå til Tilføj et nyt indlæg, og vi kan komme ind i titlen på indlæg, så noget lignende, CS50 seminaret. Wow, virkelig nyder seminaret. Afkøle. Så du trykker på indlæg, og det vil omdirigere dig tilbage til startsiden, og så vil du se, at det seneste indlæg blev tilføjet. Og vi har stadig alle de der. Så nu, lad os gå gennem alle de kode og se, hvordan dette gennemføres. Så jeg tror, ​​den første ting, lad os tage et kig på, er faktisk modellerne. En stor del af tiden, hvor du designe noget, du ønsker at tænke først om, hvordan du kommer til at repræsentere dine data, og derefter designe ting omkring det, så alt giver mening. Og det er faktisk sådan jeg gjorde det, da jeg var at gøre det, Jeg satte mig ned og tænkte, hvad vil jeg i et indlæg. Så her har vi den samme struktur at jeg nævne tidligere, hvor vi gør db = Sqldatabase (posts.db «). I virkeligheden, har du sandsynligvis ikke ønsker til hårdt kode i dit navn databaser. Det burde nok være en parameter der er gemt et eller andet sted, måske i en config fil, men i et lille eksempel som dette, det er okay at hårdt kode, i. Så nu har vi dette indlæg klasse, der arver fra basismodellen. Og det har, igen, ID = PrimaryKeyField. Faktisk, hvis du ikke angiver, hvis jeg faktisk sluppet af dette, så Peewee vi vil tage sig af automatisk skaber den ID-felt, og det vil automatisk gøre det til en PrimaryKey, som Jeg mener er virkelig rart, fordi normalt, det er noget du vil have, men jeg kan lide at sætte det i specielt bare så jeg huske, at det er derinde. Men hvis du ikke angiver det, der vil være der automatisk. Så, jeg har en dato, som er en DateTimeField, og alle disse forskellige områder, hvis du se på peewee dokumentation, Det vil give dig en liste over de forskellige typer af felter, som du kan bruge. For det meste, er det analoge til, hvad du vil se i SQL. Så der er en CharField, en VarCharFields, tekstfelter, som er for meget længe tekster, som et blog-indlæg potentielt DateTimeFields, DoubleFields, FloatFields, alle sådan noget. Og du kan passere i andre argumenter til det, som jeg angav ikke her. Sig for eksempel, du ikke ønsker at tillade to stillinger for at have den samme titel, du kunne angive noget som unikt = True, og det er bare en ekstra parameter til det felt, når det samler den ned i SQL, angiver at det skal være unikt. Du kan også angive noget lignende ikke nul og alle de andre ting du normalt gør i SQL. Så det er en temmelig simpel model, der har dato. Bemærk her, i DateTimeField, Jeg specificeret, hvad standard er. Jeg specificeret det at være datetime.datetime.now, på grund af den måde, dette bliver evalueret, det faktisk vurderer den DateTime.Now når det bliver indsat i databasen. Jeg tror, ​​at, ville jeg have at dobbelttjekke dette, men hvis du gjorde noget som dette, så det rent faktisk ville vurdere, at når, og derefter DateTime vil altid være den samme. Så bare hvis du laver noget med datetimes, dobbelttjekke at det er en vurdering, når faktisk bliver indsat, ellers du kan blive forvirret. Titlen er blot en CharField, hvor der er flere argumenter, du kan passere i at specificere præcis hvor lang tid du ønsker det skal være, men her, det gjorde ikke rigtig noget. Og Tekst bliver teksten til hele indlæg, og det kommer til at være en TextField bare fordi du ønsker at lade det være en temmelig lang streng. Så har vi denne Meta underklasse, der bare angiver, at vi ønsker, at databasen hvor dette er faktisk åbnet op i at være den db objekt, som vi har her. Og sidste, vi har Her er netop denne funktion at vi kommer til at bruge fra vores vigtigste app at initialisere databasen til at oprette forbindelse til det, og derefter at skabe Post bordet. Lad os nu se på de vigtigste app selv. Så denne ene er en ganske lidt længere end dem at vi har set før, men forhåbentlig ikke alt for dårlig. Så lad mig forlænge denne ud. Okay. Så mærke og toppen jeg importerede en hel masse andre ting fra kolbe, som vi ikke har virkelig set før. Og forhåbentlig kan vi gå igennem hver enkelt af disse én efter én og snakke lidt mere om dem, sorteret efter f.eks. Så har vi den kolbe, og render_template, som vi har set før, denne anmodning objekt, som vil komme op, når vi ser på, hvordan den form, jeg var viser faktisk fungerer. Omdirigere, som lader du omdirigere tilbage fra Opret ny post tilbage til den oprindelige hjemmeside, og derefter URL, hvilket er noget, der lader dig regne ud, hvor på hjemmeside en bestemt side er. Altsaa, den næste ting jeg gør, er jeg import alle de oplysninger fra de modeller filer, som vi var bare at kigge på. Og, ja. Så noget andet nyt, der kommer op, når du beskæftiger sig med, især databaser, er, at du kan angive en funktion, der bliver kaldt før hver anmodning, og funktion, der får opkaldt efter hver anmodning, ved hjælp af denne funktion dekoratør app.before anmodning. Og så dette vil blive henrettet uanset hvor denne funktion er. Dette behøver ikke at være kaldt før anmodning men normalt det er noget fornuftigt at kalde det. Du kan angive, hvad funktion du ønsker at få kaldt der, så jeg angivet denne initialize_db funktion, som vi havde tilbage i modeller fil, så før hver anmodning, du vil oprette forbindelse til databasen. Der er to forskellige måder, du kan gøre dette. Du kan gøreapp., Jeg mener, det er after_request. Og forskellen mellem after_request og teardown_request, er, at after_request kun vil ske hvis anmodningen faktisk var gyldig. Og så, hvis den anmodning lykkedes, hvis intet gik galt, men teardown_request sker i tilfælde af et vellykket anmodning eller i tilfælde af fejl. Så normalt, du ønsker at bruge teardown_request, medmindre du ønsker at gøre noget, især forskellige i tilfælde af en fejl. Men bare for at lukke databasen, uanset om det lykkes, eller hvis det ikke lykkes, vi gør du vil afbryde fra databasen. Så det hedder, db.close på db objekt. Bemærk, at teardown_request tager i en undtagelse. Så du kan kontrollere, om der var faktisk en fejl, da det var ved at lukke ned, men her forhåbentlig der er ikke en hel masse fejl, så vi bare slags ignorere det. Okay, og resten af ​​det er ikke så slemt. Så når vi går til startsiden, Vi gjorde dette home.html skabelon der åbnes op. Passet er i post lig, og hvad det gør er, husk vi har dette indlæg model, så vi vælge alle de stillinger, og derefter en anden ting du kan gøre, du kan angive WHERE, du kan angive en bestille ved, og så tager vi alle de stillinger, der får valgt, og derefter vi bestille dem af post.date.descending. Og der vil angive, hvor de rent faktisk kommer ud, den seneste vil være meget første. Og så, vi passerer det ind den home.html skabelon, så lad os faktisk åbne at Skabelon virkelig hurtig, og tage et kig på, hvordan det fungerer. Og det er ikke store HTML, men Forhåbentlig kan vi fokusere på Python. Så der er et link til Tilføj ny Post, og så dette angiver ruten inden Flask at vi definere, hvilket er lige her. Dette er den nye indlæg rute, og vi specificere, at heroppe. Og så er et link, der vil derefter gå til denne rute inden for Flask server. Det mere interessante ting er det for-løkke her. Så vi angive, at dette indlæg parameter, som blev ført ind i render_template funktion, for alle indlæg i post s objekt, der bliver vedtaget i. Vi ønsker at udskrive stillingen titel, i 1. halvår, og så nedenfor, vi ønsker at udskrive stillingen tekst i et afsnit. Og her kan vi faktisk kalde en Python-funktion, så vi kan ringe strftime, ST-RF-tid, og du kan passere i strengen formatet at du ønsker at udskrive dataene i. Så det er temmelig rart, at du kan faktisk kalde dette Python-funktion indefra her. Du behøver ikke at gøre formateringen på controlleren side, fordi virkelig, formatering af dato er noget, du ønsker at beskæftige sig inden for View. Og alle disse procent ting er ikke super vigtigt. Hvis du ser op dokumentationen for strftime funktion i Python, det specificerer alle disse ting, men det er hvordan, hvornår vi ledte på hjemmesiden her, Det formaterer dette med en dejlig dato, og det angiver AM eller PM, men normalt, hvis vi havde ikke denne her, du skal nok få nogle skrald dato, der ikke ser meget godt. Og så har vi specificere post.text, kunne, og jeg har lagt et par linjeskift her, bare at sætte nogle mellemrum mellem hvert indlæg. Så jeg tror, ​​det vigtigste ting i dette eksempel, er, at du kan bruge dette til løkke. Og dette svarer til ting du kan gøre i PHP. Du kan gentage gennem, alt bliver vedtaget i, og så, i stedet for at skulle gøre copy / paste, copy / paste al HTML, du bare nødt til at skrive det én gang, og derefter du kan gentage over alle de stillinger. Og det er noget almindeligt, at du vil at gøre, når du har en masse data, er, at for alt i dine data, du ønsker at gøre en lignende ting. Og så, bare huske, at når du ønsker at udskrive noget eksplicit i HTML, du bruger de dobbelte seler her, men så når du ønsker at specificere nogle oplysninger om en tilstand, eller om en for-løkke, du bruge procent beslag. Så går tilbage til Python kode, så der forklarer hvad der sker i de vigtigste vej, når vi går der, det bare viser alle de indlæg, men så er spørgsmålet er, hvordan vi rent faktisk får stillinger til databasen, som er lidt mere interessant. Så når du klikker på Ny Indlæg link, som vi så her, det omdirigerer dig til denne form. Og det er bare en simpel opfordring til render_template funktion, som derefter passerer i den nye post i HTML-formular. Så lad os tage et kig på det. Så denne ene er ret enkel. Det har en simpel HTML-formular, som vil se en lille smule bekendt, baseret på formularerne i CS50 Finance. Og så, vi angiver her, handlingen. Og her, hvis du arbejder med PHP, normalt, det ville være noget lignende, create.PHP, men her vi faktisk angive en rute inden for Flask server. Og så denne rute svarer til at skabe rute at vi har her, som vi vil gå ind i en anden. Og så, vi angive, at det er en post-metoden, fordi vi ønsker at sende denne formular data, og som regel når du sender data fra en formular, du måske ønsker at bruge en post anmodning bare så du ikke ender med denne store, uhåndterlige URL. Men du kan også bruge en GET-anmodning, og videregive det ind med variabel routing, men for formularer, er det rart til en stilling anmodning her. Og så da, ligesom du ville gøre med HTML og PHP, kan du angive disse tekst input, og du kan angive navnet på dem, og det er det navn, der vil blive vedtaget i anmodningen objekt inden kolbe. Og så har vi en Indsend knap, der hedder Post. Og her, Post er navnet på den knap, fordi det er et blog-indlæg, men her, indlæg er anmodningen metode. Så dem er det samme ord men faktisk uafhængige. Ja Går tilbage til Python-kode, når vi kaldes skabe metoden, bemærke her, at du kan faktisk angive inden ruten anmodningen metoder at du ønsker at acceptere, og så her, jeg angive, at jeg kun vil acceptere en Post-metoden. Så hvis jeg rent faktisk forsøger at besøge siden direkte, hvilket bruger en GET-anmodning, det vil fortælle mig "Metode ikke tilladt." Og så har du sider, lidt ligesom denne oprette siden, som jeg kun virkelig bruge som en måde for formularen til at få indsendt, du kan angive, at du ikke ønsker, at folk skal kunne gå der direkte via en GET-anmodning, eller hvis du ikke ønsker, en eller anden grund, en anmodning Post, du bare kunne angive GET her, men i dette eksempel har vi lige ønsker anmodningen post til at gå ud. Så når create_post kaldes, når besøger vi, at via anmodningen Post, når du går til en bestemt rute, der er denne anmodning objekt, og vi havde til at importere anmodninger på toppen, men der er denne anmodning objekt, der bliver vedtaget i, og du kan få adgang til formulardata, som automatisk vil få fyldt når du sender en anmodning fra en formular. Og så, hvad jeg tror er virkelig cool, er at formen formål at få øjeblikkeligt i, er blot en Python ordbog, indeholder, hvis du access-- så her, lad mig trække op HTML siden af ​​det, bare så du kan have det som reference, ja, så de navne, vi angiver her for de forskellige områder, så titlen og teksten, vi så bare bruge dem over her som indeks i formularen data. Så det er super praktisk. Så vi kalder post.create, som vil oprette og automatisk indsætte denne nye stilling objekt i databasen. Og jeg tror, ​​det skabe funktion her er en virkelig cool eksempel på, hvordan kraftfulde kolbe og arbejde med det, fordi hvis du gjorde noget i PHP, skal du muligvis gøre en masse validering, du skulle da oprette en database forbindelse, du skulle da udføre SQL-forespørgslen, men her har vi bare have denne nice post.create, som vi kan så bare få de oplysninger ud af objektet anmodning og derefter sende den til en ny bogføre, at vi er ved at oprette. Og så den allersidste ting, vi ønsker at gøre, er at omdirigere bruger tilbage til hjemmet. Og så bruger vi denne Kolben omdirigere funktion. Og noget, som vi ikke havde set før, var denne URL funktion. Så webadressen for funktion kan du passerer i faktisk navnet af en funktion i din Python-koden, snarere end bestemt rute at det er på. Så jeg kunne have lige så let omdirigeret en bruger til at skråstreg, hvilket ville sende det tilbage hjem, men ved hjælp af URL'en for funktion er rart, fordi hvis du ændrer sted, hvor tingene er, så lad os sige, at jeg ændrer hjem for at være på / hjem i stedet, dette vil stadig derefter vende tilbage / hjem, fordi faktisk går og ser op navnet på den funktion, og det vil give dig tilbage webadressen for det. Så slags på antagelse, at du er mere tilbøjelige til at ændre, hvor tingene er, end navnene på de funktioner. Du kan bruge dette virkelig dejligt URL for funktion. Og én ting at være opmærksom på der er en lille smule tricky, er, at du tror, ​​du kunne bare kalder omdirigering på webadressen for, men faktisk alle ruterne har at returnere en slags tekst og HTML, så du faktisk nødt til at returnere redirect opkald. Ellers vil du få noget ugyldig om ikke at returnere en streng, Fordi alle disse er nødt til at vende tilbage HTML du rent faktisk ønsker at gøre. Og så, når du ringer omdirigeringen, det omdirigerer dig til siden, men det faktisk returnerer HTML du nødt til at udføre, at omdirigering. Gå tilbage til startsiden. Så vi har disse to forskellige synspunkter. Vi har den hjem visning. Eller, jeg gætte, jeg bør sige skabeloner. Vi har disse to skabeloner, hjemmet skabelon, som viser alle vores indlæg, og så har vi denne annonce ting, og når du klikker på posten, det går til en ny rute inden Flask, men at ruten ikke nødvendigvis har en tilsvarende skabelon. Du behøver ikke at se noget, men du kan stadig har dette arbejde vil bag kulisserne. Og så får du omdirigeret tilbage til hjemmesiden. Og helt sikkert, det er nemt at arbejde i nogle pænere CSS i skabelonen og gøre dette ser meget pænere, men alle de vigtigste logik er der i Python. Eventuelle spørgsmål om dette eksempel? Jeg ved, der er en masse forskellige ting foregår dér, en masse ting, vi ikke havde set før, men gerne noget. Ja. PUBLIKUM 1: Har du nødt til at gøre noget særligt at skrubbe de data, der er kommer ind fra formen? Jeg har bemærket, du lige sagde "skabe" EZRA Zigmond: Ja, så det er faktisk, det er en rigtig god pointe. Så spørgsmålet var, gør du nødt til at tjekke og sørg at data er gyldige, og gøre nogen form for skrubbe for at sikre, at det er gyldigt, fordi som du kan se her, Jeg er ikke at gøre det. Så lad os se hvad der sker hvis jeg sender noget tom. Så vil det faktisk bare lave en blank post og udfylde DateTime. Så i virkeligheden, ville du sikkert ønsker at gøre noget lignende, måske angive, om titlen er lig med den tomme streng, så skal du ikke gøre dette. Eller gør det kun, hvis titel er ikke lig med den tomme streng. Så det gør faktisk ikke automatisk tage sig af det skrubbe for dig, så du stadig nødt til at gøre det. Ja, godt spørgsmål. PUBLIKUM 2: Er det krat til efterfølger injektion? Ved du? EZRA Zigmond: Forhåbentlig peewee gør det. Jeg tror, ​​det ville helt sikkert være en temmelig dårlig bibliotek, hvis det ikke gjorde det. Jeg ved ikke præcis. Jeg ville have til at se på forespørge det genereres. Jeg tror, ​​at hvis jeg har skrevet i en blogindlæg slags set ligesom en SQL-injektion angreb, noget som dette, hvis det er som et felt adgangskode eller noget, du kan gøre noget som dette. Jeg tror, ​​der vil stadig får bogstaveligt udstationeret, men jeg tror, ​​at peewee gør, en slags skrubning af data før det rent faktisk udfører den. PUBLIKUM 1: At tekstfeltet er designet til at tage almindelig tekst, ikke? EZRA Zigmond: Ja, det er. Ja. Så jeg tror, ​​at alle de, så dette er korrekt adfærd, vil det gøre det, men jeg tror, ​​at peewee forhåbentlig gør gøre en slags beskyttelse på deres ende. Og hvis du ønsker at dobbelttjekke, at der er måder, når du genererer en forespørgsel. så du ikke behøver at udføre det direkte. Jeg ville have til at tage en se dokumentation, men du kan faktisk se den SQL, at det genererer, og tage et kig på det, og gøre sikker på, at det er flygter ting. En anden grund til, at du måske ønsker at se på SQL at peewee udsender, er, hvis ting synes at være at gå rigtig langsomt, du kan tage et kig og se, hvad det er faktisk gør, fordi det er nogle gange let at uheld tilføje på, den måde du skriver det, du kan ved et uheld have det vælge hele databasen først, og derefter gøre en slags operation på, at når du virkelig betød at vælge en delmængde. Og så, hvis tingene ikke er helt går til højre, det er godt at tage et kig på anmodning der er faktisk at få genereret. Ja. PUBLIKUM 2: Når du først startede, du lægger i havnen som 5000. EZRA Zigmond: Ja. PUBLIKUM 2: Er standard med peewee, eller er det noget, du kan ændre? EZRA Zigmond: Ja, så det havn er standard med kolbe. Hvis du kører det uden angivelse af noget, Det vil automatisk gøre det. Jeg tror, ​​jeg ville have at dobbelttjekke dette, men du kan angive, at der i app.run, Jeg tror, ​​du kan gøre noget lignende, port = 8080. Lad os give, at en prøve reelle hurtig. Ja, så kan du bare angive port = 8080, og det vil køre det der, som jeg tror, ​​hvis du ønsker at køre det på IDE, jeg har ikke prøvet det ud, men jeg tror, ​​at hvis du løb det på port 8080, du ville nok være i stand til få adgang til serveren, ligesom du var til hjemmesiden. Ja, men det er nemt at ændre det, hvis du har nogen slags ligesom port-forwarding ting, du skal gøre. Andre spørgsmål? Ja? PUBLIKUM 1: Så, jeg så i dit modeller, der, som du nævnte, du nødt til at angive database for hvert objekt. Har du tilfældigvis kender, gør der gør det virkelig let, hvis du har masser af SQLite databaser, som du vil bruge til en enkelt web-app, at du bare kan angive en flok af forskellige dem i din model? EZRA Zigmond: Ja, lad mig åbne det op virkelig hurtig. Så du siger, hvis du vil have en masse forskellige noget, måske gerne og de studerende, for nogle grund, sådan noget? Ja, så jeg tror, ​​at du stadig, hver model skulle stadig have lige en database, overdraget til det, men hvis du ønskede at have forskellige modeller, har forskellige databaseobjekter tildelt til det, kan du helt sikkert gøre det. Så hvis jeg oprettet en ny, noget som dette, og nu er det en elev, der ser underligt gerne en blog-indlæg, Jeg kunne angive, at database er lig med db_2 her. Så jeg tror det er den vigtigste måde du kan gøre det. Afkøle. Andre spørgsmål? Så bare for at slutte op lidt bit, her er nogle ressourcer, og disse dias vil blive offentliggjort online så du kan faktisk komme til disse links. De bedste ressourcer er virkelig dokumentationen for Kolbe og Peewee selv. De er skrevet rigtig godt, synes jeg. Så Flask hjemmeside er her, og de har en quickstart tutorial, vil gå gennem lignende ting til, hvad jeg gik igennem, men hvis du vil enhver form for revision af de ting, jeg gik forbi, eller du troede, at jeg forklarede noget i en forvirrende måde, de vil have lignende eksempler der. Peewee har dokumentation, og de har en quickstart tutorial der går over de vigtigste parametre som du ønsker at bruge. Så de ting, jeg talte om med de unikke, og specificerer defaults, de forskellige former for felter, du kan bruge, dem ville alle være der. Også, hvis du har spørgsmål om peewee, og du sende dem på StackOverflow, den fyr, der gjorde peewee faktisk bliver ved og besvarer dem nogle gange. Hvis du har et spørgsmål, forhåbentlig han vil være i stand til at svare på det, fordi han skrev det hele. Jeg tror, ​​det er alt Jeg ønskede at dække. Tak for at komme ud.