[MUSIC SPILLE] EZRA zigmond: Hei, alle sammen. Takk for at du kom ut i dag. Dette seminaret er "Python Web-apper med Flask. " Så, jeg skal snakke litt om hvorfor kan det være lurt å bruke Flask å gjøre web apps med Python, i motsetning til noen andre rammer der ute, som Django, som er den mest kjente. Undertittelen er "og PeeWee ", som er noe vi kommer til å snakke om hvordan å interagere med SQL-databaser. Det gjør det veldig hyggelig. Så, her er bare en rask oversikt av hva jeg ønsker å gå over. Så, først, bare ett lysbilde som kommer til å være quickstart, som er hvordan å få alt satt opp på datamaskinen din. Jeg kommer til å demonstrere dette på min lokale Mac-maskin, bare fordi det er der jeg har gjort dette før, jeg er mest komfortabel med det, men dette er definitivt mulig på CD50 IDE. Så, etter at jeg ønsker å presentere hva Flask er, og overbevise deg hvorfor du bør bruke det i første omgang. Deretter vil jeg gi en rask eksempel på hva du kan gjøre i Flask, en rask eksempel om hva du kan gjøre i peewee, og da vil jeg vise deg en mer komplett eksempel søknad at jeg satt sammen at vi kan gå gjennom sammen. Og til slutt, etter det siste lysbildet, har jeg noen ressurser som du ser på nettet for mer informasjon. Dette er ikke en komplett tutorial på hvordan du bruker Flask. Og jeg skal håpe å forlate litt tid for spørsmål. Noen ser lokalt, bare lignende, rope ut i midten hvis du har spørsmål. Så rask installasjon ting, Hvis du ønsker å følge med, eller hvis du ønsker å få dette opp på din egen maskin, Jeg kommer til å bruke Python 2.7.10. Flask gjør arbeidet med Python tre, men jeg liker Python to, fordi det er noen Python pakker som fungerer ikke med 3 ennå. Hvis du har pip installert, som er en Python pakkebehandler, Jeg tror at hvis din Python er større enn eller lik 2.7.9, du har det installert allerede, er det super enkelt å installere disse pakkene. Du kan gjøre pip installere Flask, pip installere peewee, vanligvis må du kjøre sudo bare slik at tilgangen trene. Og, hvis du bruker en super gammel versjon av Python, Jeg anbefaler å oppdatere Python, eller ved hjelp av Easyinstall å installere pip. Så, det neste spørsmålet er, hva er Flask? Og jeg tror, ​​først en rimelig spørsmål jeg lurte på i lang tid er, hva er en web-app? Fordi det er et ord som jeg Think er kastet rundt mye at jeg ikke egentlig vet. Og jeg tror at den beste eksempel på hva en web-app er, egentlig er CS50 Finance, hvor det er egentlig ikke bare en nettside, men det er noe som du kunne liksom samhandle med. Det er brukerkontoer og alle slags forskjellige ting. Så, hvor du tegner linjen mellom hva som er en nettside, og hva er en web-app, er liksom vilkårlig, men jeg tror ideen, det er noe mer enn en nettside og det er et nyttig program. Så, er Flask et rammeverk for lage web apps som bruker Python. Og forhåpentligvis innen utgangen av dette, vil jeg overbevise deg at du faktisk kan skrive noe som CS50 Finans bruker Python, som jeg som mye bedre enn PHP, personlig. Så, Flask er, kaller de en microframework, ved hvilken, de mener det er svært enkel, men utvidbar. Så har det akkurat det du trenger, men hvis du vil ha flere funksjoner, det er lett å ta dem inn. Men bare fordi det er en microframework, ikke mener at det er bare for små prosjekter. Jeg har en link her som sier at Obama brukte Flask i 2012 for sin kampanje nettside, som forhåpentligvis er noe av en påtegning. Men det som jeg virkelig liker med Flask er det, betyr det ikke egentlig gjøre noen form for avgjørelser for deg. Bare fordi vi er snakker om web apps, Jeg må sammenligne det med Ruby on Rails og Django, som begge er gode rammer, men de begge gjøre antagelser om hvordan du vil samhandle med databaser, hvordan du ønsker å presentere din synspunkter, og de er definitivt gode aspekter til det. For eksempel, Ruby on Rails har denne aktive journalsystemet, som er en veldig fin måte å samhandle med data, men hvis du ønsker å bruke Ruby on Rails, du liksom bundet inn i den. Men med Flask, som jeg skal vise deg med peewee, du kan bruke hva slags av databasen du vil, og du kan bare dra det i som en forlengelse inn Flask. Så det er derfor jeg virkelig som Flask, er det at det gjør ikke forutsetninger for deg basert på ting du ikke trenger egentlig. Så, hvorfor skal du bruke Flask? Fordelene er, det bare har egentlig kjernefunksjonene bygget inn det du trenger. Så, trenger du ikke å bekymre deg for forstå en hel haug med ting at du egentlig ikke trenger. Du trenger ikke å bekymre deg om å slå av funksjoner at du egentlig ikke trenger. Og, som jeg nevnte, er det super enkelt å legge inn utvidelser av ting som du trenger. Noen av dem har Flask sin egen støtte for det. Så det er noe som heter Flask admin, som speiler at admin panel som Django gir, som gir deg en fin visuell måte å administrere ditt nettsted. Men igjen, hvis du er lage noe enkelt, du sannsynligvis ikke trenger en stor admin panel, så jeg tror det er super fin. Og ulempene er at du har mindre effekt ut av boksen. Så, når du først åpner opp Flask, og i Python-programmet, du bare skrive fra Flask import *, eller hva, du trenger ikke akkurat få alle funksjonene du måtte ønske. Og så må du mer eksplisitt liste de funksjonene du ønsker. Så det er en ulempe, men jeg tror at for å bygge små web apps som jeg kommer til å bli vist du, det er egentlig ikke et problem. Og hva er det siste er ment å si, som er en skrivefeil, er at det er mindre standardisert konvensjoner for hvordan du bruker Flask, nettopp fordi det ikke er så mange folk som bruker det profesjonelt sammenlignet med Django. Så, hvis du ser noe sånt, "hvordan gjør jeg x" i Django, vil du sannsynligvis finne den. Det er god design mønstre du kan bruke, men med Flask, er det liksom gå din egen vei, bare fordi det er en ganske lite bibliotek. Så de er det ulemper, men jeg tror at det er fortsatt et godt bibliotek å bruke. Så la oss bare hoppe rett inn Flask. Dette er definitivt ikke kommer å være en komplett tutorial, men det er for å gi deg en idé hvordan å strukturere ting, og slik at du føler deg komfortabel å gå av og se på dokumentasjonen og finne ut mer. Så, la meg åpne opp en virkelig enkelt eksempel i starten, og viser deg hva som ser ut, og så får vi bryte det ned litt mer. Så dette her, la meg få den i gang. Så, jeg har nå mitt program kjører. Jeg kommer til å åpne opp Safari, og det kjører på min lokale vert. Så jeg skal bare gjøre dette større. Men localhost: 5000 Og så, akkurat nå, gjør alt dette er, når du besøker nettstedet, det skrives ut "Hello Flask," som ikke er super nyttig, men jeg synes det er kult at i denne lille fil her, vi har en webserver som kjører som skriver ut noe. Så, la oss faktisk ser på koden for en andre, og bryte det ned litt. Er størrelsen bra for alle her? Så, forhåpentligvis, du er noe komfortabel med å bruke Python. Jeg antar at vi kan se på Python og lese gjennom den. Hvis du har spørsmål om noe, kan jeg også gå over det. Så den første linjen er, fra Flask, vi importerer, Flask med stor "F" som er liksom alt viktige funksjoner som du trenger. Når du skriver en fil, og ved hjelp av kolbe du kommer til å ønske å importere det, bare fordi det har alle de viktigste tingene. Det neste vi gjør, er vi kalle denne funksjonen Flask, bare å lage en app objekt, og du er alltid kommer til å ønske å gjøre det. Og deretter hoppe ned til bunn raskt, her er denne delen, 'if_name _ == "_ main_" "som er liksom en Python-konvensjonen. Så dette vil bare kjøre hvis du kjøre denne filen direkte ved hjelp av Python. Deretter kaller vi app.run, som vil faktisk starte programmet kommer. Så, det er hovedstrukturen som vil du ha i noen Flask søknad, er du vil ha denne app = Flask (_NAME_), og deretter app.run. Så de to tingene som jeg har her inne, er det vi kaller ruter. Så, la oss snakke om ruting litt mer. Jeg skal gå tilbake til raset. Så det mest grunnleggende konsept i Flask er ruting. Og det er ideen om at du tilordne funksjoner i Python til bestemte adresser på nettsiden din. Så, når du vil å opprette en ny rute, du bruker denne @ app.route funksjon dekoratør. Så, hvis du er ukjent med funksjons dekoratører i Python, det er dette konseptet som lar deg ta en funksjon og omslutter den med noe annet. Så egentlig, hva dette dekoratør gjør, er at det tar funksjonen under den, og det gir mer informasjon til det, men hva Flask faktisk gjør det skje er ikke super avgjørende, men hva som er viktig, er at før ruten, du sette dette @ app.route, og deretter adressen til ruten, så skråstreken er det vi så når vi bare åpne opp nettsiden. Så det er på hjemmesiden. Det er bare slash ruten. Og så har denne funksjonen. Navnet på funksjonen kan bli hva du vil. Det behøver ikke nødvendigvis har å gjøre med ruten. Og så, uansett funksjonen avkastning, funksjonen skal returnere en streng. Og at strengen kan inneholder HTML eller noe, og det er faktisk det får tilbake til nettleseren som HTML, og det vil gjengi det. Så dette er den samme koden som var fra eksempelet at jeg bare løp, så når vi besøker slash, det kaller en Hello World-funksjonen, som bare returnerer en streng, Hello Flask, og som blir skrevet ut på skjermen. Så det er et annet eksempel, som er, når du besøker / hallo, det skrives ut Hei Word, som bør faktisk si, Hello World, men la oss late som var tilsiktet. Så la oss trekke det opp virkelig rask. Så hvis du går til localhost / hallo, det vil nå skrive ut noe annet. Så det er bare en rask eksempel på hvordan du kan lage to forskjellige ruter. Så, så langt dette ikke er super nyttig, det er ikke mye du kan gjøre, du bare kunne gjøre alt med har forskjellige HTML-sider, og når du besøker et bestemt siden det bare laster siden. Så la oss se litt mer nyttige ting du kan gjøre. Så, en ting som du kan ha merke til i eksemplet som jeg trakk opp, er at jeg hadde app.run (debug = True). Og så, hva dette debug argument gjør, er at når du drive din web server, når du er i programmet, Hvis du endrer en fil, vil det automatisk reload serveren. Og så du ikke egentlig trenger å restart Python, som er super nyttig. Jeg kan vise det. La meg trekke opp min kode med skrivefeil i den, og late som om skrivefeil ble lagt der forsettlig for læreformål. Så la oss legge denne tilbake igjen. Så nå står det Hello World. Jeg vil lagre det. Og hvis vi trekker opp igjen terminalen, vil du si at det er å starte på nytt, fordi det oppdaget en endring, og så nå når vi reload denne siden det vil skrive ut den riktige tingen. Så debug er super nyttig for det. Også, hvis du har noen liksom en krasj, så la meg gjøre dette programmet krasjer ved å ha den ikke returnere en streng. Så, la oss bare ha det returnere Ingen annen grunn. Og så når jeg besøker denne side, vil det bare krasje, men serveren ikke bare krasje, det faktisk gir deg en super nyttig tilbake spor av alt som gikk galt. Og hva er egentlig fint, er at på alle trinn i dette tilbake spor, du kan åpne opp en interaktiv skallet her, og liksom skrive ut hva variablene du ønsker å ta en titt på. Og så debugging er virkelig nyttig for å finne ut hva som skjer med din server, i stedet for bare å se noe i PHP som en 500 interne server error, som er super ubrukelig. En ting å være klar over, er at hvis du setter din app online så det er synlig for publikum, du aldri vil forlate feilsøkingsmodus på, fordi folk faktisk kan bruke den konsollen som jeg viste deg å kjøre vilkårlig kode. Slik at de kan skrive ut som en hvilken som helst hemmelige koder du har i det, de kan se på akkurat hvordan nettstedet ditt fungerer. Så det er veldig nyttig for testing, men alltid sørg for å ta den ut før du publiserer noe på nettet. Så når du bruker noe som PHP, det er denne ideen at du kan passere informasjon mellom websider ved å sette den informasjon faktisk i nettadressen, som er en GET forespørsel, men i Flask, kan du faktisk gjøre noe liksom sånn, ved å ha en rute som har en variabel som en del av det. Så hvis du ser på denne eksempel på skjermen her, vi har en rute som er ('/ hallo /'), og så, hvis du besøker / hei / noe, at noe kommer til å faktisk få fylt inn navnet variabel. Og legg merke til at funksjonen som kommer med den ruten må ta i parameter navn, slik at det faktisk vil får gått inn i funksjonen. Og så, når du er innsiden av den funksjonen, du kan behandle det som en normal Python variabel, og så deretter, vil det skrive ut Hallo, og det vil fylle ut navnet med noen streng formatering. Så for å legge variable deler til en routing, du bruker vinkelparentes merking. Og eventuelt, kan du bruke det som kalles en omformer. Og så, hvis du setter dette annotering med kolon, kan du oppgi at det er en int, eller en dupp, eller bane, og det vil automatisk konvertere det. Du kan også gjøre konverteringen innenfor Python-funksjonen, bare ved hjelp av en støpt, men noen ganger hvis du ønsker å sikre at det er en int, du kan sette det regel konvertering i det. Så la oss trekke opp et eksempel av enkelte variable regler. Så her, har dette den samme grunnleggende struktur med fra Flask import Flask, app = Flask (_NAME_), og så er det å kjøre på slutten. Vi har disse to forskjellige variable ruter her. Og den første, er den som jeg viste i raset, som var at det bare tar i en streng navn og det vil skrive ut Hallo, Name. Og så, den andre en bruker konvertering. Så dette vil automatisk konvertere den til en int, og deretter doble int, og skrive det ut. Og gjør vi ikke noen form konvertering innenfor det fordi Flask tar seg av det. Så la oss få dette i gang. Når du har en Flask program er i gang, Du kan styre-C ut av det for å stoppe driften serveren. Og da vil jeg kjøre variablene. Så la oss gå til localhost / hei / Ezra og forhåpentligvis vil dette si hei til meg. Så tok det i mitt navn, i variabelen rute, og det fylte den inn her. Så jeg vil også vise en rask eksempel på dobling. Så hvis du går til / dobbel / 3, det vil skrive ut seks. Så dette tok seg av konverteringen for oss. Så du kan også gjøre det med float, og noe spesielt, Hvis du trenger å oppgi noe sånt en bane, som gjør at den aksepterer skråstreker, men det bør vanligvis ikke være et problem. Så langt har vi, har fortsatt bare vært tilbake strenger, som ikke er veldig interessant. Vi kunne faktisk tilbake bokstave HTML streng. Så i koden kan vi sette inn noe som b-tag for å gjøre den fet, men mest av tiden du ikke egentlig ønsker å være å skrive HTML-kode i Python-kode. Det blir veldig rotete, og det er ikke en god tid. Flask tillater oss å skille ut HTML inn det som kalles mal, og så hvis du tenker i form av MVC-modellen at du er kjent med, forhåpentligvis, fra arbeid med CS50 Finance litt, du kan tenke på Python-filer som mer av kontrollen, der de er i samspill med det datamodell du måtte ha. Og så er de roper til Views og sende informasjon til den visnings å fylle inn informasjon i HTML som den trenger. Og det vi kaller disse Views er maler i klassen. Så Flask bruker en annen Python modul som det vil automatisk installere når du PIP installere Flask kalt Jinja, som lar deg legge til disse merknader til HTML som du ser på skjermen, lar det du putter i ting som conditionals, og løkker inn i HTML. Så det ser litt ut som hvordan du kan bruke PHP i en HTML-fil, men dette er bare når Flask server serverer HTML-filen, det vil kjøre denne templating motor og analysere gjennom dette og fylle ting i. Så Flask har en render_template funksjon som du kan se nederst her. Og så når du besøker denne siden, det ville gjengi denne hello.html mal, og deretter fylle denne HTML-side. Så la oss bare kjøre denne real rask, og se hvordan det ser ut, og så skal jeg gå gjennom en Litt mer detaljert. Så, er dine Maler kommer å gå i en Maler mappe. Det vil automatisk søke innenfor Maler-mappen for at mal. Så la oss åpne opp dette. Så, jeg skal kjøre templating eksempel. Så hvis jeg går til / hei / Ezra, det har denne horrible, ytterst ubehagelig marquee tag at jeg satt i. Veldig hyggelig, veldig dynamisk. Jeg er en stor fan. Men hva skjer hvis Jeg bare gå til, / hallo? Så det bare sier Hello World. Jeg fikk ikke gi det et navn, og det fylt det inn automatisk. Så la oss se hvordan det gjorde det, og hvordan vi kan bli kvitt det telt kanskje. Så her, er denne typen et interessant eksempel på, hvis du er kjent med hvordan switch uttalelser jobbe i et språk. Sier dette er liksom som, den slags et fall gjennom, hvor du faktisk vedlagt to forskjellige ruter til den samme funksjonen. Så vi feste / hallo rute og den / hei / navn rute til Hei, og vi spesifiserer using-- Python lar deg spesifisere standardfunksjon arguments-- slik at hvis det ikke er noe navn, så hvis vi går til nettopp / hallo, det vil automatisk filtrere å nevne er lik Ingen. Så da vi gjengi Mal med name = navn, så det vil passere i navnet parameter lik dette navnet funksjon parameter, inn i malen. Som fortsatt ikke forklare hvordan er avgjøre om det skal skrives Hello World, eller skrive navnet mitt. Så la oss faktisk ser til selve malen, og se hvor det kommer fra. Så, i løpet av denne malen, vi faktisk har noen betinget logikk, som noen mennesker ville argumentere, du faktisk bør ikke ha mye betinget logikken i din mal selv. Det bør være mer innenfor Kontroller, men i dette eksemplet det er noe ganske liten. Så her kan vi sjekke, hvis navn, så hvis navn ikke er lik Ingen, hvis et navn er faktisk gått inn, så vi vil si Hei, navn med header og rulleteksten, alt dette vanlig HTML, ellers vil vi skrive ut Hello, World bare normalt. Så et par ting å legge merke til her om hvordan du formaterer templating, er at alle disse betinget utsagn, liksom som hvordan vi PHP det når du ønsker å sette inn noen PHP, du bruker mindre enn spørsmålet mark, det er liksom analogt her med {%. Så her har vi vår betinget kode. Og så, når du faktisk ønsker å bokstavelig evaluere noe, og print det ut til skjermen, du bruke de doble bukseseler. Så her er det doble tannregulering, og da vi spesifiserer navn, så innen det, vil det evaluere til variabelen navn, som ble vedtatt i fra gjengi mal funksjon, snarere enn bare utskrift ut, hvis vi ble kvitt disse, det ville bare skrive ut ordet "navn". Så, det er noe å se opp for. Så en annen ting å innkallingen er at når vi ønsker å bruke render_template funksjon, vi faktisk nødt til å importere det eksplisitt fra Flask. Og dette er et eksempel på modularitet av Flask, at du ikke trenger å importere ting som du ikke trenger. Du kan bare ta med i funksjonene du faktisk trenger, som noen ganger er hyggelig, slik at du ikke må ha alle disse funksjonene sitter rundt som du ikke bruker, men også, hvis du glemmer at du må importere render_template, du vil sannsynligvis få en advarsel som vil gi deg beskjed om det. Så, er at templating. Så har vi vist hvordan lage enkle websider, og legge litt mer logikk å den, i form av den variable ruting. Det kan du gjøre forskjellige ting basert på hva URL du går til, og også da, gi HTML litt mer fornuftig i forhold til hvordan du ønsker å gjengi ting. Du trenger ikke å sette alle HTML i Python, men for ganske mye hver webapplikasjon, du kommer til å ønske noe slag av datamodell assosiert med den. Og så tradisjonelt, ville dette være noe sånt som en SQL-database. Og du kan bare samhandle direkte med SQL. Python har, tror jeg det heter. SQLite tre. Du kan bare importere SQLite 3 og utføre SQL-spørringer direkte, men jeg vet ikke om deg, men jeg egentlig ikke liker, bare, skrive ut SQL-spørringer. Det har en tendens til å bli veldig lang og komplisert. Og så, noe som Jeg liker å bruke, er hva som er kjent som en ORM, som er en objektrelasjons kartlegging. Og poenget med en objektrelasjons kartlegging, er at det er to forskjellige måter du kan tenke på databaser. Så eksempelet som Professor Malan vanligvis bruker i klassen, er Excel-tabellen, der du har disse rader og disse kolonnene, og det er veldig nyttig for hvordan den er representert i SQL og hvordan du kommuniserer med det, men en annen måte at det er faktisk nyttig å tenke på det noen ganger, er i form av klasser og objekter. Så i stedet for å tenke av hvert bord som å ha denne raden som har visse informasjon, kan du faktisk Tenk på det som å være hver tabell er en klasse, og deretter hver forekomst av klasse har visse egenskaper. Så, i dette eksempelet, forekomster av klassen er radene i tabellen og deretter hver eiendom ville være en kolonne i tabellen. Så, ORM som jeg liker å bruke kalles peewee. Det er veldig lite, liksom som Flask. Jeg tror at de går godt sammen, men det er mange andre Orms som du kan bruke. En mer populær en er kjent som SQLAlchemy, og jeg kan ikke huske hvorfor jeg opprinnelig valgte peewee løpet SQLAlchemy, eller jeg ville fortelle deg hvorfor jeg tror det er den beste, men vi bare kommer til å bruke dette fordi jeg vet hvordan du bruker den. Så, er ett spørsmål, hvorfor bør du gidder å bruke en ORM, i stedet for bare direkte skrive SQL-spørringer? Og jeg tror den beste saken, er at du faktisk ikke må skrive SQL-spørringer. Det er mye lettere, som jeg skal vise deg, for å gjøre ting som valg, innsetting, sletting, spesielt lage tabeller. Det er mye lettere å skrive en klasse struktur, enn det er å strukturere en Lag Tabell uttalelse, men en ting å være klar over, er at ORM vil prøve sitt beste å finne ut hva de mest effektiv SQL-spørring ville være, men noen ganger blir det det galt. Og spesielt hvis du er å arbeide med en stor database, kan du legge merke til at en spørring som skal kjøre fort, faktisk tar lengre tid. Og hvis du ser under panseret på hvordan ORM er å tolke det i SQL, det kan være å gjøre noe virkelig latterlig, bare fordi det liksom gestikulerte dine intensjoner galt. Og, det har vært tider hvor Jeg har hatt til å overstyre det, og bare utføre mine egne SQL-spørringer, bare fordi det ble parsing på en merkelig måte. Så det er noen overhead, bare i måten at det kompilerer din uttalelser ned i SQL. Så, la oss se super raskt på et enkelt eksempel på en datamodell som du kan bruke. Så dette er Python-kode, og så første du vil gjøre er fra PeeWee import *. Så, i motsetning Flask, hvor du har alle disse individuelle moduler, og du vil importere Flask, og skrive en mal, og noen andre at vi skal se senere, fra PeeWee, du kan bare importere alt, fordi det er en ganske lite bibliotek. Så, det første du vil gjøre, er faktisk lage denne databasen objektet. Så har du db = SqliteDatabase, og deretter navnet på databasen. Og dette vil faktisk skape et databaseobjekt at du kan samhandle med, med peewee. Og så har vi den faktiske modell som vi ønsker å skape. Så tabellen vi ønsker å skape. Så, innen peewee, har hver klasse sitt eget bord i databasen. Så alle klassene arve fra grunnmodellen, og hovedstaden M-modellen er noe som er definert i peewee. Så, alle modellene skal arve som høyeste super, de skal arve fra modellen, men hva som er kult, er at du faktisk kan ha din modeller arve fra hverandre. Og mye av tiden din datamodeller ikke nødvendigvis lage en fin arv hierarki, men tider hvor de gjør det, er det veldig hyggelig, fordi du har modellen iboende fra hverandre. Så, definerte vi denne klassen "student", som arver en modell, og den har tre egenskaper. Den har en ID, som er en PrimaryKeyField, som er noe som er gitt av PeeWee, er navn en charfield, og en karakter er en IntegerField. Så dette kan eller ikke kan være hvordan CS50 faktisk lagrer alle elevenes karakterer. Det er ikke, men dette er hvordan jeg ville gjøre det. Og så det har, innenfor denne klassen, og denne er noe du kan gjøre med Python, kan du ha nestet klasser. Og dette er noe som kreves av peewee. Så, denne klassen Meta, har du å spesifisere at databasen er lik gjenstanden at vi opprettet ovenfor. Og dette sier hva filen er denne tabellen faktisk kommer til å ligge i. Så dette er noe som du må å gjøre innen alle dine modeller. Du trenger bare å spesifisere innenfor denne Meta klassen den databasen er lik db. Så det jeg vanligvis gjør, hvis jeg har en haug med forskjellige modeller, er at jeg har en base modell, som jeg vanligvis bare kalle "base-modellen" som har Meta klassen, og det setter databasen lik db. Og så alle mine påfølgende modeller vil arve fra at base klasse. Og så jeg ikke trenger å bekymre deg om å sette Meta klassen. Så, når dette faktisk blir kompilert ned i en SQL-setning, det ser ut som dette ekle ting ned her, "Lag tabell student ID heltall, " samme det. Og, jeg tror at det er kortere, denne SQL-spørring her, men hvis du ser på denne klassen her du kan se nøyaktig hva som skjer. Du kan se hva slags felt det er, hva de heter, og så tror jeg at ser på dette Python-kode er mye mer lesbar enn prøver å skrive denne SQL-spørring. Så, for å faktisk bruke databasen, vi må koble til den innen Python. Så, jeg vanligvis skrive en funksjon som heter initialize_db som gjør to ting. Det tar i databasen objekt db og det kobler seg til det, som bare åpner opp seksjon til databasen. Hvis du bare kjører skjønt nettside på din lokale maskin, det er ikke en super big deal å bekymre om tilkobling og frakobling, men hvis du kjører det på et nettsted, du vil være sikker på at når en bruker kobler seg til det, når de stenger ute nettsiden, koble de slik at du ikke har en haug med personer som er koblet til databasen på en gang. Og så, når du koble til databasen, du ønsker å ringe db.create_tables, og listen over de modellene for hva du vil å lage tabeller. Så her, jeg vil bare lage det for denne eleven. Og så, det som er viktig, er å spesifisere trygg = True mest tid. Så hva dette utsagnet vil gjøre, er at den skaper tabeller for student modell, men bare Hvis dette bordet har ikke blitt opprettet allerede. Det er hva de trygge spesifiserer. Så det vil ikke overskrive din eksisterende tabell, det vil bare skape en ny tabell hvis det ikke er der. I så fall kan du bare lage tabellene gang ved hjelp av SQL. Og så har den databasen sitte der, og deretter koble til hver gang, men det er som regel fint bare å satt i denne create_tables samtale, slik at hvis du noen gang sletter database når du drive din web app igjen, vil det gjenskape det. Så, bare sørg for at trygg er angitt til å være sant, eller vil du finne dine data bare får clobbered hver gang. Og så kan du bare ringe initialize_db å etablere en tilkobling, og skape bordene om nødvendig. Så, den mest vanlige ting som du vil ønske å gjøre, eller en av de mest vanlige ting, er å faktisk sette ting inn i databasen. Og så, i stedet for at å skrive en sette inn i uttalelse med alle verdiene angitt, du kan faktisk kalle funksjonen på studentklassen. Så, når du oppretter en klasse som arver fra modellen, den har dette skape metoden. Så, har du klasse name.create, og du spesifisere parametere som du ønsker å passere på. Så, hvis jeg ønsker å legge til noen studenter til vår CS50 karakter bok eksempel Jeg skal sette i David, som har en veldig god karakter, har han en 95. Og meg selv, hvem som ikke gjør så godt i CS50, jeg har en 50. Og så, det fine hva dette skape funksjonen gjør, er at den returnerer eksempel, eller rad, og den skapte i tabellen, og så da kan du lagre det i en variabel, og arbeidet med det senere. Du kan endre rundt, som Jeg skal vise et eksempel på. Legg merke til at jeg ikke gjorde det må spesifisere ID, fordi siden det er PrimaryKeyField, vil den automatisk øke den hvis du ikke spesifiserer det. Og, faktisk, har du sannsynligvis bør ikke spesifisere det, fordi du kanskje uhell clobber andres ID. Og du ønsker å gjøre sikker på at det er unikt. Så, faktisk den mest vanlig ting du ønsker å gjøre, er trolig velge ut av databasen når du har mye informasjon der. Og så, hvis du ønsker å få alt, så tilsvarer det velge stjerne fra studenter uttalelse, det ville bare være student.select. Og det vil gi deg tilbake en matrise med alle elev objekter i det at du iterere over du vil. Du kan få ting ut av det. Og mesteparten av tiden, du ikke bare ønsker å gjøre velger, du faktisk ønsker å spesifisere noe. Og så kan du kjede sammen disse funksjonskall, som hvordan du ville kjede sammen utsagnene i SQL. Så du kan gjøre student.select (). Der i dette eksempel. Og så kan du angi hvilke betingelser, bare å bruke normal Python Booleans å sjekke ting. Så, i dette tilfellet, vil du begrenser hva du velger å, hvor student.grade er lik 50, og student.name er lik Ezra, så det vil bare komme meg ut av det. Og legg merke til, en virkelig subtile ting her er at hvis du ønsker å spesifisere en og / og eller en eller / eller, i Python, ville du vanligvis bruker, Jeg tror ordet "og" faktisk, men her du bruker enkelt-tegn, som normalt er en bitvis operator, men i dette spesielle tilfellet, akkurat slik peewee gjør det, du bruker enkelt ampersand å angi "og". Det er noe som Jeg bli blandet opp mye, men det kommer ikke opp så mye i praksis. Og så, når du har alle studentene ut av databasen, når du har gjort du velger og din slitasje eller hva, du kan bruke en foreach loop, akkurat som vanlig i Python, med noen form for iterator eller med noen form for array. Så du kan gjøre, for s i student.select (). whe re (Student.grade <75), og så vil dette iterere over hver elev i tabellen hvis karakteren er mindre enn 75, som i dette tilfellet, er fortsatt bare meg. Og så kan du gjøre noe innen som loop, som sende meg en e-post og fortelle meg å faktisk slå i mitt problem Stiller. Så, en annen ting du kan gjør det, er det veldig lett for å oppdatere rader i tabellen. Så husk tilbake hit, når jeg satt inn, Jeg tok den verdien som var returneres av student.create, og jeg tildelt den til navn som heter Ezra. Og så nå, kan du endre verdier innen det tilfellet akkurat som du ville en normal klasse i Python. Så du kan stille ezra.grade = 95 og som vil oppdatere den lokale kopien, men hvis du faktisk ønsker å forplikte seg at endringen i databasen, du må ringe ezra.save, så du ringte .Lagre metode på forekomsten. Og så nå, jeg har nå endret min egen klasse i databasen. Ja, så la oss si at jeg blir tatt endre karakteren min i databasen. Professor Malan er trolig kommer å ønske å slette meg fra klassen, og så kan du ringe .delete instansmetode bare på at ting. Så, hvis du ønsket å gå tilbake i denne sløyfen her, og faktisk, i stedet for å sende e-poster alle av studentene som har karakteren er mindre enn 75, ville at du skulle slette dem, innenfor denne sløyfen du kunne kalle s.delete eksempel. Og det aller siste du ønsker å gjøre, er når du oppretter en tilkobling, og du er ferdig med arbeidet, du ønsker å ringe db.close, hvor db er at databasen innvende at vi hadde før. Og du vil være sikker på at alt blir stengt ute av. Kjølig. Så nå har jeg et eksempel søknad. Jeg har liksom pre-laget alt bare slik at det ikke blir noen levende koding feil, men vi kan gå gjennom det og se hvordan du ville sette Flask og PeeWee sammen, og lage en enkel app. Jeg kaller det CS50 rant, og det er liksom en enkel blogg plattform. Så, først, skal jeg kjøre den og viser hvordan det ser ut, og så kan vi se mer inn i koden. Ok, så la oss bare kjøre denne. Cool, jeg skal gjøre dette litt mindre. Det er ikke veldig pen, bare fordi Jeg gjorde ikke gjøre mye av CSS, men hva den gjør er, det har denne databasen av blogginnlegg, og den går gjennom alle dem, og det vil vise dem på siden i rekkefølgen av de nyeste. Og så dette er bare noen innlegg at jeg hadde lagret i databasen. Så hvis vi ønsker å skape en ny post, kan vi gå å legge et nytt innlegg, og vi kan gå inn i tittelen på post, så noe sånt, CS50 seminar. Wow, virkelig nyter seminaret. Kjølig. Deretter trykker du poster, og det vil omdirigere deg tilbake til hjemmesiden, og så vil du se at siste innlegg ble lagt. Og vi har fortsatt alle de som er der. Så nå, la oss gå gjennom alle de kode og se hvordan dette er implementert. Så, jeg tror det første som la oss ta en titt på, er faktisk modellene. Mye av tiden, når du designer noe, du ønsker å tenke først om hvordan du kommer til å representere dine data, og deretter utforme ting rundt det, slik at alt er fornuftig. Og det er faktisk slik jeg gjorde det da jeg var å gjøre dette, Jeg satte meg ned og tenkte: hva vil jeg i et innlegg. Så her har vi samme struktur at jeg var nevne tidligere, hvor vi gjør db = Sqldatabase ('posts.db'). I virkeligheten, har du sannsynligvis ikke vil til hard-kode i ditt navn databaser. Det bør nok være en parameter som er lagret et sted, kanskje i en config-fil, men i et lite eksempel som dette, det er greit å vanskelig kode som i. Så nå har vi denne Post klassen, som arver fra grunnmodellen. Og det har, igjen, ID = PrimaryKeyField. Egentlig, hvis du ikke angir, hvis jeg faktisk ble kvitt dette, da PeeWee vi vil ta vare på automatisk skape at ID-feltet, og det vil automatisk gjøre det en PrimaryKey, noe Jeg tror det er veldig hyggelig, fordi vanligvis, det er noe du vil ha, men jeg liker å sette den i spesifikt, bare så jeg husker at det er der inne. Men hvis du ikke angir det, som vil være der automatisk. Så da har jeg en date som er en DateTimeField, og alle disse ulike feltene, hvis du se på peewee dokumentasjon, det vil gi deg en liste over de forskjellige typer felt som du kan bruke. For det meste, er det analogt til hva du vil se i SQL. Så det er en charfield, en VarCharFields, textfields, som er på veldig lenge tekster, som et blogginnlegg potensielt, DateTimeFields, DoubleFields, FloatFields, alle ting som det. Og du kan passere i andre argumenter til det, som jeg ikke har angitt her. Si for eksempel at du ikke ønsker å tillate to innlegg å ha samme tittel, du kan spesifisere noe som unikt = Sant, og det er bare en ekstra parameter til feltet at når det sammenstiller det ned inn i SQL, vil det angi at det må være unikt. Du kan også angi noe sånt ikke null, og alle de andre tingene du vanligvis gjør i SQL. Så dette er en ganske enkel modell som har datoen. Legg merke til her, innenfor DateTimeField, Jeg spesifisert hva standard er. Jeg anga at det skal være datetime.datetime.now, på grunn av måten dette blir evaluert, det faktisk evaluerer den datetime.now når det blir satt inn i databasen. Jeg tror det, vil jeg ha å dobbeltsjekke dette, men hvis du gjorde noe sånt som dette, så det ville faktisk vurdere det en gang, og deretter Datetime vil alltid være den samme. Så, bare hvis du gjør noe med datetimes, dobbeltsjekke at det å vurdere når faktisk blir satt inn, ellers kan du bli forvirret. Tittelen er bare en Charfield, der det er flere argumenter du kan passere i spesifisere nøyaktig hvor lenge du vil den skal være, men her, det gjorde egentlig ingen rolle. Og tekst skal være teksten i hele innlegget, og som kommer til å være en Textfield bare fordi du vil å tillate det å være en ganske lang streng. Så har vi dette Meta underklasse som bare presiserer at vi ønsker databasen der dette er faktisk åpnet opp i å være den db objektet som vi har her. Og siste ting vi har her, er nettopp denne funksjonen at vi kommer til å bruke fra vår hoved app initialisere databasen for å koble til den, og deretter å skape den Post tabellen. Nå, la oss se på de viktigste app selv. Så dette er ganske litt lenger enn de som som vi har sett før, men forhåpentligvis ikke så ille. Så, la meg utvide dette ut. Greit. Så, merke og toppen Jeg importerte en hel haug med andre ting fra Flask at vi ikke har virkelig sett før. Og forhåpentligvis kan vi gå gjennom hver enkelt av disse en etter en og snakke litt mer om dem, sortert etter eksempel. Så har vi den Flask, og render_template, som vi har sett før, denne forespørselen objekt, som vil komme opp når vi ser på hvordan skjemaet som jeg viste faktisk fungerer. Omdirigere, som lar deg omdirigere tilbake fra Create New Post tilbake til den opprinnelige hjemmesiden, og deretter URL, som er noe som lar deg finne ut hvor på nettside en bestemt side er. Så da, neste Det jeg gjør, er jeg import all informasjonen fra modellene filer som vi bare ser på. Og, ja. Så, noe annet nytt som kommer opp når du arbeider med, spesielt databaser, er at du kan angi en funksjon som blir kalt før hver forespørsel, og funksjon som får kalt etter hver forespørsel, ved hjelp av denne funksjon dekoratør app.before forespørsel. Og så dette vil bli henrettet hvor er denne funksjonen. Dette trenger ikke å være kalt før anmodning, men vanligvis det er noe fornuftig å kalle det. Du kan spesifisere hva funksjonen du ønsker å bli kalt det, så jeg spesifiserte dette initialize_db funksjon som vi hadde tilbake i modellene fil, så før hver forespørsel, du ønsker å koble til databasen. Det er to forskjellige måter du kan gjøre dette. Du kan gjøreapp., Jeg tror det er after_request. Og forskjellen mellom after_request og teardown_request, er at after_request vil bare skje dersom anmodningen faktisk var gyldig. Og så, bare hvis forespørselen var vellykket, hvis noe gikk galt, men teardown_request skjer i tilfellet av en vellykket anmodning, eller i tilfelle av en feil. Så, vanligvis, vil du å bruke teardown_request, med mindre du ønsker å gjøre noe, spesielt annerledes i tilfelle av en feil. Men bare for lukking av database, om det lykkes eller hvis det mislykkes, vi gjør du vil koble fra databasen. Så det heter, db.close på db objektet. Legg merke til at teardown_request tar i et unntak. Så du kan sjekke om det faktisk var en feil da det ble stenge ned, men her, forhåpentligvis, det er ikke en hel masse feil, så vi er bare slags ignorere det. Okay, og resten av det er ikke så ille. Så, når vi går til hjemmesiden, vi gjengitt denne home.html Mal som vil åpne opp. Passet er i post lik, og hva denne gjør det, husker vi har dette innlegget modell, så vi velger alle innleggene, og deretter en annen ting du kan gjøre, du kan spesifisere WHERE-leddet, du kan spesifisere en bestille ved, og så tar vi alle innleggene som få valgt, og vi bestille dem ved post.date.descending. Og som vil angi når de faktisk kommer ut, det nyeste vil være svært første. Og så passerer vi det inn den home.html mal, så la oss faktisk åpne opp som mal virkelig rask, og ta en titt på hvordan det fungerer. Og dette er ikke stor HTML, men forhåpentligvis kan vi fokusere på Python. Så det er en link til Legg til ny Post, og så dette angir ruten innenfor Flask at vi definere, som er rett her. Dette er den nye post rute, og vi presisere at her oppe. Og så det er en kobling som vil da gå I tillegg rute innenfor kolbe serveren. Jo mer interessante ting er dette for loop her. Så vi presisere at dette post parameter som ble ledet inn i render_template funksjon, for hvert innlegg i stillingens objekt som blir sendt inn. Vi ønsker å skrive ut innlegget tittelen, i H1, og deretter under, vi ønsker å skrive ut innlegget tekst i et avsnitt. Og her, kan vi faktisk kalle en Python-funksjon, slik at vi kan ringe strftime, ST-RF-tid, og du kan passere i formatstrengen som du ønsker å skrive ut dataene ut i. Så det er ganske fint at du kan faktisk kalle dette Python funksjonen innenfra her. Du trenger ikke å gjøre formateringen på kontrolleren side, fordi egentlig, formatering av dato er noe som du ønsker å håndtere innenfor View. Og alle disse prosent ting er ikke super viktig. Hvis du ser opp dokumentasjonen for strftime funksjon i Python, det spesifiserer alle disse ting, men det er hvordan, når vi var ute på hjemmesiden her, det formaterer denne med en fin dato, og det angir AM eller PM, men vanligvis, hvis vi har ikke dette her, du vil sannsynligvis få noen søppel dato som ikke ser veldig bra. Og da vi spesifisere post.text, og jeg kunne har satt et par linjeskift her, bare å sette noen mellomrom mellom hvert innlegg. Så tror jeg det viktigste ting i dette eksemplet er at du kan bruke dette for loop. Og dette er analog til ting du kan gjøre i PHP. Du kan iterere gjennom, alt blir vedtatt i, og så, i stedet for å måtte gjøre kopier / lim inn, kopier / lim inn all HTML, du må bare skrive det en gang, og deretter du kan iterere over alle innleggene. Og dette er noe vanlig at du vil å gjøre, når du har mye data, er det for alt i dine data, du ønsker å gjøre en lignende ting. Og så, bare husk at når du ønsker å skrive ut noe eksplisitt i HTML, bruker du de doble bukseseler her, men så når du ønsker å spesifisere litt informasjon om en tilstand, eller om en for loop, du bruke prosent braketten. Så, gå tilbake til Python kode, slik som forklarer hva som skjer i hoved rute, når vi drar dit, det bare viser alle innlegg, men så er spørsmålet er, hvordan vi faktisk får innlegg i databasen, som er litt mer interessant. Så, når du klikker på Ny Post link, som vi så her, det sender deg til dette skjemaet. Og det er bare en enkel samtale til render_template funksjon, som deretter passerer i den nye post i HTML-skjemaet. Så la oss ta en titt på det. Så dette er ganske enkel. Den har en enkel HTML-skjema, som vil se litt kjent, basert på skjemaene i CS50 Finance. Og så, vi oppgir her, handlingen. Og her, hvis du jobber med PHP, normalt, det ville være noe sånt, create.PHP, men her vi faktisk angi en rute innenfor Flask server. Og så, denne rute korresponderer til å opprette rute som vi har her, som vi vil gå inn i et sekund. Og så oppgir vi at det er en post-metoden, fordi vi ønsker å sende denne formen data, og vanligvis når du sender data fra et skjema, kan det være lurt å bruke en post forespørsel bare så du ikke ender opp med denne store, uhåndterlige URL. Men du kan også bruke en GET forespørsel, og passerer det på med variabel ruting, men for skjemaer, er det fint i et innlegg forespørsel her. Og så da, akkurat som deg ville gjøre med HTML og PHP, du kan angi disse tekst innganger, og du kan angi navnet på dem, og det er navnet som vil bli passert inn forespørselen objekt i Flask. Og da har vi en Send knappen som sier Post. Og her, er Post navnet på knapp, fordi det er et blogginnlegg, men her er innlegget forespørselen metoden. Så de er det samme ordet men faktisk irrelevant. Yeah Gå tilbake til Python-kode, når vi kalte skape metoden, merke til her at du kan faktisk spesifiserer i rute forespørselen metoder at du vil godta, og så her, jeg presisere at jeg bare vil godta en Post-metoden. Så, hvis jeg faktisk prøve å besøke siden direkte, som ved hjelp av en GET-anmodning det vil si meg "Metode ikke tillatt." Og så har du sider, liksom som dette skape siden som jeg er bare virkelig bruker som en måte for skjemaet for å bli sendt, kan du oppgi at du ikke vil at folk skal være i stand til å gå dit direkte via en GET-forespørsel, eller hvis du ikke vil, for noen grunn, en Post forespørsel du kan bare spesifisere komme hit, men i dette eksemplet har vi bare Vil Post anmodning om å gå ut. Så, når create_post kalles, når vi besøker det via Post forespørsel, når du går til en bestemt rute, det er denne forespørselen objekt, og vi måtte importere forespørsler på toppen, men det er denne forespørselen objekt som blir sendt inn, og du kan få tilgang til skjemadata, som automatisk vil bli fylt når du sender en forespørsel fra et skjema. Og så, hva jeg tror er virkelig kult, er at formen objekt å bli passert i, er bare en Python ordbok som inneholder, hvis du access-- så her, la meg trekke opp HTML ved siden av det, bare slik at du kan ha det som en referanse, ja, så navnene som vi spesifiserer her for de forskjellige feltene, så tittelen og teksten, vi så bare bruke de over her som indekser i skjemaet data. Så det er super praktisk. Så da vi kaller post.create, som vil skape og sette inn automatisk denne nye innlegg objekt inn i databasen. Og jeg tror dette skape funksjonen her er et kult eksempel på hvordan kraftig Flask er og arbeider med dette, fordi hvis du gjorde noe i PHP, må du kanskje gjør mye av validering, du må da etablere en database tilkobling, du må da kjøre SQL-spørring, men her er vi bare har denne fine post.create, som vi kan da bare få informasjonen ut av anmodningen objekt, og før den inn i en ny innlegg som vi skaper. Og så, den aller siste ting vi ønsker å gjøre, er å omdirigere brukeren tilbake til hjemmet. Og så bruker vi denne Flask omdirigere funksjon. Og noe som vi ikke hadde sett før, dette var URL funksjonen. Så URL for funksjonen lar du passerer i faktisk navnet av en funksjon i din Python-kode, i stedet for den spesielle rute at den er på. Så jeg kunne ha like lett omdirigert en bruker å kutte, som ville sende den hjem, men bruker URL for funksjonen er fin, fordi hvis du endrer sted hvor ting er, så la oss si at jeg endrer hjem for å være på / hjemme i stedet, Dette vil likevel deretter returnere / home, fordi faktisk går og ser opp navnet på funksjonen, og det vil gi deg tilbake URL for det. Så, liksom på antagelsen om at du er mer sannsynlig å endre hvor ting er, enn navnene på funksjonene. Du kan bruke dette virkelig fint URL for funksjon. Og én ting å være klar over det er litt vanskelig, er at du tror du kan like kaller omdirigere på nettadressen for, men faktisk alle rutene har å returnere noen form for tekst og HTML, slik at du faktisk nødt til å returnere redirect samtalen. Ellers vil du få noe ugyldig om ikke å returnere en streng, fordi alle disse må returnere HTML du faktisk ønsker å gjengi. Og så, når du ringer viderekoblingen, den omdirigerer deg til siden, men det faktisk returnerer HTML du trenger for å gjennomføre den viderekobling. Gå tilbake til hjemmesiden. Så vi har disse to forskjellige visninger. Vi har den hjemme utsikt. Eller, jeg tror jeg skal si maler. Vi har disse to maler, hjemmet mal som viser alle våre innlegg, og så har vi denne annonsen ting, og når du klikker på innlegget, det går til en ny rute innenfor kolben men at ruten ikke nødvendigvis har en tilsvarende mal. Du trenger ikke å se noe, men du kan fortsatt har dette arbeidet kommer bak kulissene. Og så blir omdirigert tilbake til hjemmesiden. Og definitivt, det er lett å jobbe i noen finere CSS inn i malen og gjør dette ser mye bedre, men alle hovedlogikken er det i Python. Eventuelle spørsmål om dette eksemplet? Jeg vet det er mange forskjellige ting som skjer der, mange ting vi ikke hadde sett før, men liker noe. Yeah. PUBLIKUM 1: du trenger å gjøre noenting spesielt å skrubbe data som er kommer inn fra skjemaet? Jeg la merke til at du bare sa "skape" EZRA zigmond: Ja, så det er faktisk, det er et veldig godt poeng. Så spørsmålet var, gjør du trenger å kontrollere og sikre at at dataene er gyldige, og gjøre noen form for skrubbing å sørge for at det er gyldig, fordi som du kan se her, Jeg gjør ikke det. Så la oss se hva som skjer hvis jeg legger ut noe blankt. Så vil det faktisk bare lage en blank post og fyll i Datetime. Så i virkeligheten, ville du sannsynligvis ønsker å gjøre noe sånt, kanskje oppgi om tittelen er lik den tomme strengen, så ikke gjør dette. Eller bare gjøre det hvis tittelen er ikke lik den tomme strengen. Så det gjør faktisk ikke automatisk ta vare på det skrubbing for deg, slik at du fortsatt trenger å gjøre det. Ja, godt spørsmål. PUBLIKUM 2: Betyr det skrubb for oppfølgeren injeksjon? Vet du? EZRA zigmond: Forhåpentligvis PeeWee gjør det. Jeg tror det vil sikkert være en ganske dårlig biblioteket hvis det ikke gjorde det. Jeg vet ikke nøyaktig. Jeg måtte se på spørring at det genereres. Jeg tror at hvis jeg skrev i en blogginnlegg som slags så som en SQL-injeksjon angrep, noe sånt som dette, hvis dette er som et passordfelt eller noe, du kan gjøre noe som dette. Jeg tror det vil fortsatt får bokstavelig talt lagt ut, men jeg tror at PeeWee gjør noen form for skrubbing av data før det faktisk utfører den. PUBLIKUM 1: At tekstfeltet er designet for å ta ren tekst, ikke sant? EZRA zigmond: Ja, det er det. Yeah. Så jeg tror at alle, så dette er riktig atferd, vil det gjøre det, men jeg tror at peewee forhåpentligvis gjør gjøre noen form for beskyttelse på sin ende. Og hvis du ønsket å dobbeltsjekke at det finnes måter når du genererer en spørring. slik at du ikke trenger å kjøre den direkte. Jeg måtte ta en se på dokumentasjon, men du kan faktisk vise SQL at det genererer, og ta en titt på det, og gjøre sikker på at det er escaping ting. En annen grunn til at du kanskje ønsker å se på SQL at PeeWee sender ut, er hvis Ting ser ut til å gå veldig sakte, du kan ta en titt og se hvordan det er faktisk gjør, fordi det er noen ganger lett å tilfeldigvis legge i, slik du skriver det, du kan ved et uhell ha det Velg hele databasen først, og deretter gjøre en slags operasjon på at når du virkelig ment for å velge et delsett. Og så, hvis ting ikke er ganske går rett, det er godt å ta en titt på forespørsel som faktisk får generert. Yeah. PUBLIKUM 2: Når du først startet, du putter i havnen som 5000. EZRA zigmond: Yeah. PUBLIKUM 2: Er standard med peewee, eller er det noe du kan endre? EZRA zigmond: Ja, så det port er standard med Flask. Hvis du kjører den uten spesifisere noe, vil den automatisk gjøre det. Jeg tror jeg ville ha å dobbeltsjekke dette, men du kan angi at i app.run, Jeg tror du kan gjøre noe sånt, port = 8080. La oss gi den en prøve virkelig rask. Ja, så kan du bare angi port = 8080, og det vil kjøre det der, som jeg tror, ​​hvis du ønsket å kjøre den på IDE, jeg har ikke prøvd dette ut, men jeg tror at hvis du kjørte den på port 8080, du vil nok kunne for å få tilgang til serveren, akkurat som om du var for nettstedet. Ja, men det er lett å endre det hvis du har noen liksom som port-forwarding ting som du trenger å gjøre. Eventuelle andre spørsmål? Yeah? PUBLIKUM 1: Så, jeg så i ditt modeller som, som du nevnte, du må spesifisere database for hvert objekt. Du vet gjør, gjør som gjør det veldig enkelt hvis du har massevis av SQLite databaser som du ønsker å bruke for en enkelt web app, at du bare kan angi en haug av forskjellige dem i din modell? EZRA zigmond: Ja, la meg åpner det opp virkelig rask. Så, du sier, hvis du vil ha en haug med forskjellig noe, kanskje liker og studentene, for noen Derfor noe sånt? Ja, så jeg tror at du fortsatt, hver modell må fremdeles ha bare en database tildelt den, men hvis du ønsket å ha ulike modeller som har forskjellige databaseobjekter tilordnet til det, kan du definitivt gjøre det. Så, hvis jeg opprettet en ny, noe sånt som dette, og nå dette er en student som ser merkelig ut som et blogginnlegg, Jeg kunne spesifisere at database er lik db_2 her. Så jeg tror det er viktigste måten du kan gjøre det. Kjølig. Eventuelle andre spørsmål? Så bare for å gjøre ferdig en liten bit, her er noen ressurser, og disse lysbildene vil bli lagt ut på nettet slik at du faktisk kan komme til disse koblingene. De beste ressursene er virkelig dokumentasjonen for Flask og PeeWee seg. De er skrevet veldig bra, tror jeg. Så, er Flask hjemmeside her, og de har en quickstart tutorial som vil gå gjennom lignende ting til hva jeg gikk gjennom, men hvis du vil ha noen form for anmeldelse av de tingene som jeg gikk over, eller du trodde at jeg forklarte noe i en forvirrende måte, de vil ha lignende eksempler der. Peewee har dokumentasjon, og de har en quickstart tutorial som går over de viktigste parametrene som du ønsker å bruke. Så, det jeg snakket om med de unike, og angivelse mislighold, de forskjellige slags felt som du kan bruke, de ville alle være der. Også, hvis du har spørsmål om peewee, og du legger dem på Stackoverflow, fyren som gjorde peewee faktisk fortsetter og besvarer dem noen ganger. Hvis du har et spørsmål, forhåpentligvis han vil være i stand til å svare på det, fordi han skrev hele greia. Jeg tror det er alt Jeg ønsket å dekke. Takk for at du kom ut.