1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:03,227 [MUSIC SPILLE] 3 00:00:03,227 --> 00:00:04,705 4 00:00:04,705 --> 00:00:05,830 EZRA zigmond: Hei, alle sammen. 5 00:00:05,830 --> 00:00:08,020 Takk for at du kom ut i dag. 6 00:00:08,020 --> 00:00:10,660 Dette seminaret er "Python Web-apper med Flask. " 7 00:00:10,660 --> 00:00:14,510 >> Så, jeg skal snakke litt om hvorfor 8 00:00:14,510 --> 00:00:17,400 kan det være lurt å bruke Flask å gjøre web apps med Python, i motsetning 9 00:00:17,400 --> 00:00:21,556 til noen andre rammer der ute, som Django, som er den mest kjente. 10 00:00:21,556 --> 00:00:24,330 Undertittelen er "og PeeWee ", som er noe 11 00:00:24,330 --> 00:00:27,250 vi kommer til å snakke om hvordan å interagere med SQL-databaser. 12 00:00:27,250 --> 00:00:29,610 Det gjør det veldig hyggelig. 13 00:00:29,610 --> 00:00:32,390 >> Så, her er bare en rask oversikt av hva jeg ønsker å gå over. 14 00:00:32,390 --> 00:00:35,520 Så, først, bare ett lysbilde som kommer til å være quickstart, 15 00:00:35,520 --> 00:00:38,530 som er hvordan å få alt satt opp på datamaskinen din. 16 00:00:38,530 --> 00:00:41,760 Jeg kommer til å demonstrere dette på min lokale Mac-maskin, 17 00:00:41,760 --> 00:00:45,220 bare fordi det er der jeg har gjort dette før, jeg er mest komfortabel med det, 18 00:00:45,220 --> 00:00:48,510 men dette er definitivt mulig på CD50 IDE. 19 00:00:48,510 --> 00:00:52,050 >> Så, etter at jeg ønsker å presentere hva Flask er, 20 00:00:52,050 --> 00:00:55,089 og overbevise deg hvorfor du bør bruke det i første omgang. 21 00:00:55,089 --> 00:00:56,880 Deretter vil jeg gi en rask eksempel på hva du 22 00:00:56,880 --> 00:01:00,550 kan gjøre i Flask, en rask eksempel om hva du kan gjøre i peewee, 23 00:01:00,550 --> 00:01:05,010 og da vil jeg vise deg en mer komplett eksempel søknad 24 00:01:05,010 --> 00:01:07,520 at jeg satt sammen at vi kan gå gjennom sammen. 25 00:01:07,520 --> 00:01:10,040 >> Og til slutt, etter det siste lysbildet, har jeg 26 00:01:10,040 --> 00:01:12,730 noen ressurser som du ser på nettet for mer informasjon. 27 00:01:12,730 --> 00:01:15,560 Dette er ikke en komplett tutorial på hvordan du bruker Flask. 28 00:01:15,560 --> 00:01:18,140 Og jeg skal håpe å forlate litt tid for spørsmål. 29 00:01:18,140 --> 00:01:21,050 Noen ser lokalt, bare lignende, rope ut i midten 30 00:01:21,050 --> 00:01:22,340 hvis du har spørsmål. 31 00:01:22,340 --> 00:01:27,150 >> Så rask installasjon ting, Hvis du ønsker å følge med, 32 00:01:27,150 --> 00:01:29,240 eller hvis du ønsker å få dette opp på din egen maskin, 33 00:01:29,240 --> 00:01:32,440 Jeg kommer til å bruke Python 2.7.10. 34 00:01:32,440 --> 00:01:35,860 Flask gjør arbeidet med Python tre, men jeg liker 35 00:01:35,860 --> 00:01:38,660 Python to, fordi det er noen Python pakker som 36 00:01:38,660 --> 00:01:40,910 fungerer ikke med 3 ennå. 37 00:01:40,910 --> 00:01:44,800 Hvis du har pip installert, som er en Python pakkebehandler, 38 00:01:44,800 --> 00:01:48,190 Jeg tror at hvis din Python er større enn eller lik 2.7.9, 39 00:01:48,190 --> 00:01:52,220 du har det installert allerede, er det super enkelt å installere disse pakkene. 40 00:01:52,220 --> 00:01:54,990 >> Du kan gjøre pip installere Flask, pip installere peewee, 41 00:01:54,990 --> 00:01:58,600 vanligvis må du kjøre sudo bare slik at tilgangen trene. 42 00:01:58,600 --> 00:02:01,080 Og, hvis du bruker en super gammel versjon av Python, 43 00:02:01,080 --> 00:02:05,100 Jeg anbefaler å oppdatere Python, eller ved hjelp av Easyinstall å installere pip. 44 00:02:05,100 --> 00:02:09,180 45 00:02:09,180 --> 00:02:11,120 Så, det neste spørsmålet er, hva er Flask? 46 00:02:11,120 --> 00:02:13,280 Og jeg tror, ​​først en rimelig spørsmål jeg lurte på 47 00:02:13,280 --> 00:02:15,585 i lang tid er, hva er en web-app? 48 00:02:15,585 --> 00:02:17,960 Fordi det er et ord som jeg Think er kastet rundt mye 49 00:02:17,960 --> 00:02:19,240 at jeg ikke egentlig vet. 50 00:02:19,240 --> 00:02:22,340 Og jeg tror at den beste eksempel på hva en web-app er, 51 00:02:22,340 --> 00:02:26,960 egentlig er CS50 Finance, hvor det er egentlig ikke bare en nettside, 52 00:02:26,960 --> 00:02:29,320 men det er noe som du kunne liksom samhandle med. 53 00:02:29,320 --> 00:02:31,736 Det er brukerkontoer og alle slags forskjellige ting. 54 00:02:31,736 --> 00:02:35,010 Så, hvor du tegner linjen mellom hva som er en nettside, 55 00:02:35,010 --> 00:02:38,780 og hva er en web-app, er liksom vilkårlig, men jeg tror ideen, 56 00:02:38,780 --> 00:02:42,110 det er noe mer enn en nettside og det er et nyttig program. 57 00:02:42,110 --> 00:02:46,081 >> Så, er Flask et rammeverk for lage web apps som bruker Python. 58 00:02:46,081 --> 00:02:48,330 Og forhåpentligvis innen utgangen av dette, vil jeg overbevise deg 59 00:02:48,330 --> 00:02:52,210 at du faktisk kan skrive noe som CS50 Finans bruker Python, som jeg 60 00:02:52,210 --> 00:02:53,950 som mye bedre enn PHP, personlig. 61 00:02:53,950 --> 00:02:57,320 >> Så, Flask er, kaller de en microframework, ved hvilken, 62 00:02:57,320 --> 00:02:59,800 de mener det er svært enkel, men utvidbar. 63 00:02:59,800 --> 00:03:02,980 Så har det akkurat det du trenger, men hvis du vil ha flere funksjoner, 64 00:03:02,980 --> 00:03:04,522 det er lett å ta dem inn. 65 00:03:04,522 --> 00:03:06,480 Men bare fordi det er en microframework, ikke 66 00:03:06,480 --> 00:03:08,960 mener at det er bare for små prosjekter. 67 00:03:08,960 --> 00:03:12,590 Jeg har en link her som sier at Obama brukte Flask i 2012 68 00:03:12,590 --> 00:03:14,410 for sin kampanje nettside, som forhåpentligvis 69 00:03:14,410 --> 00:03:16,937 er noe av en påtegning. 70 00:03:16,937 --> 00:03:18,770 Men det som jeg virkelig liker med Flask 71 00:03:18,770 --> 00:03:22,401 er det, betyr det ikke egentlig gjøre noen form for avgjørelser for deg. 72 00:03:22,401 --> 00:03:24,150 Bare fordi vi er snakker om web apps, 73 00:03:24,150 --> 00:03:26,940 Jeg må sammenligne det med Ruby on Rails og Django, som begge 74 00:03:26,940 --> 00:03:30,450 er gode rammer, men de begge gjøre antagelser 75 00:03:30,450 --> 00:03:33,600 om hvordan du vil samhandle med databaser, 76 00:03:33,600 --> 00:03:36,900 hvordan du ønsker å presentere din synspunkter, og de er definitivt 77 00:03:36,900 --> 00:03:38,850 gode aspekter til det. 78 00:03:38,850 --> 00:03:41,490 >> For eksempel, Ruby on Rails har denne aktive journalsystemet, 79 00:03:41,490 --> 00:03:43,100 som er en veldig fin måte å samhandle med data, 80 00:03:43,100 --> 00:03:45,960 men hvis du ønsker å bruke Ruby on Rails, du liksom bundet inn i den. 81 00:03:45,960 --> 00:03:47,835 Men med Flask, som jeg skal vise deg med peewee, 82 00:03:47,835 --> 00:03:49,830 du kan bruke hva slags av databasen du vil, 83 00:03:49,830 --> 00:03:53,980 og du kan bare dra det i som en forlengelse inn Flask. 84 00:03:53,980 --> 00:03:56,350 >> Så det er derfor jeg virkelig som Flask, er det at det 85 00:03:56,350 --> 00:04:01,170 gjør ikke forutsetninger for deg basert på ting du ikke trenger egentlig. 86 00:04:01,170 --> 00:04:04,440 >> Så, hvorfor skal du bruke Flask? 87 00:04:04,440 --> 00:04:08,230 Fordelene er, det bare har egentlig kjernefunksjonene 88 00:04:08,230 --> 00:04:09,420 bygget inn det du trenger. 89 00:04:09,420 --> 00:04:11,980 Så, trenger du ikke å bekymre deg for forstå en hel haug med ting 90 00:04:11,980 --> 00:04:13,175 at du egentlig ikke trenger. 91 00:04:13,175 --> 00:04:15,060 Du trenger ikke å bekymre deg om å slå av funksjoner 92 00:04:15,060 --> 00:04:16,620 at du egentlig ikke trenger. 93 00:04:16,620 --> 00:04:21,082 >> Og, som jeg nevnte, er det super enkelt å legge inn utvidelser av ting 94 00:04:21,082 --> 00:04:21,790 som du trenger. 95 00:04:21,790 --> 00:04:24,700 Noen av dem har Flask sin egen støtte for det. 96 00:04:24,700 --> 00:04:28,230 Så det er noe som heter Flask admin, som speiler at admin 97 00:04:28,230 --> 00:04:32,060 panel som Django gir, som gir deg en fin visuell måte 98 00:04:32,060 --> 00:04:33,405 å administrere ditt nettsted. 99 00:04:33,405 --> 00:04:35,280 Men igjen, hvis du er lage noe enkelt, 100 00:04:35,280 --> 00:04:39,550 du sannsynligvis ikke trenger en stor admin panel, så jeg tror det er super fin. 101 00:04:39,550 --> 00:04:45,940 Og ulempene er at du har mindre effekt ut av boksen. 102 00:04:45,940 --> 00:04:49,660 Så, når du først åpner opp Flask, og i Python-programmet, 103 00:04:49,660 --> 00:04:53,150 du bare skrive fra Flask import *, eller hva, 104 00:04:53,150 --> 00:04:55,957 du trenger ikke akkurat få alle funksjonene du måtte ønske. 105 00:04:55,957 --> 00:04:58,540 Og så må du mer eksplisitt liste de funksjonene du ønsker. 106 00:04:58,540 --> 00:05:01,990 Så det er en ulempe, men jeg tror at for å bygge små web 107 00:05:01,990 --> 00:05:04,782 apps som jeg kommer til å bli vist du, det er egentlig ikke et problem. 108 00:05:04,782 --> 00:05:07,281 Og hva er det siste er ment å si, som er en skrivefeil, 109 00:05:07,281 --> 00:05:10,240 er at det er mindre standardisert konvensjoner for hvordan du bruker Flask, 110 00:05:10,240 --> 00:05:12,400 nettopp fordi det ikke er så mange folk som bruker det profesjonelt 111 00:05:12,400 --> 00:05:13,191 sammenlignet med Django. 112 00:05:13,191 --> 00:05:16,380 Så, hvis du ser noe sånt, "hvordan gjør jeg x" i Django, 113 00:05:16,380 --> 00:05:18,190 vil du sannsynligvis finne den. 114 00:05:18,190 --> 00:05:20,260 >> Det er god design mønstre du kan bruke, 115 00:05:20,260 --> 00:05:22,660 men med Flask, er det liksom gå din egen vei, 116 00:05:22,660 --> 00:05:24,850 bare fordi det er en ganske lite bibliotek. 117 00:05:24,850 --> 00:05:27,100 Så de er det ulemper, men jeg tror 118 00:05:27,100 --> 00:05:29,370 at det er fortsatt et godt bibliotek å bruke. 119 00:05:29,370 --> 00:05:31,909 >> Så la oss bare hoppe rett inn Flask. 120 00:05:31,909 --> 00:05:34,200 Dette er definitivt ikke kommer å være en komplett tutorial, 121 00:05:34,200 --> 00:05:37,480 men det er for å gi deg en idé hvordan å strukturere ting, 122 00:05:37,480 --> 00:05:40,790 og slik at du føler deg komfortabel å gå av og se på dokumentasjonen 123 00:05:40,790 --> 00:05:42,570 og finne ut mer. 124 00:05:42,570 --> 00:05:48,500 >> Så, la meg åpne opp en virkelig enkelt eksempel i starten, 125 00:05:48,500 --> 00:05:50,737 og viser deg hva som ser ut, og så får vi 126 00:05:50,737 --> 00:05:52,070 bryte det ned litt mer. 127 00:05:52,070 --> 00:05:56,160 >> Så dette her, la meg få den i gang. 128 00:05:56,160 --> 00:06:06,800 129 00:06:06,800 --> 00:06:09,750 Så, jeg har nå mitt program kjører. 130 00:06:09,750 --> 00:06:15,910 Jeg kommer til å åpne opp Safari, og det kjører på min lokale vert. 131 00:06:15,910 --> 00:06:19,360 Så jeg skal bare gjøre dette større. 132 00:06:19,360 --> 00:06:23,960 Men localhost: 5000 133 00:06:23,960 --> 00:06:27,650 >> Og så, akkurat nå, gjør alt dette er, når du besøker nettstedet, 134 00:06:27,650 --> 00:06:31,490 det skrives ut "Hello Flask," som ikke er super nyttig, 135 00:06:31,490 --> 00:06:34,630 men jeg synes det er kult at i denne lille fil her, 136 00:06:34,630 --> 00:06:37,390 vi har en webserver som kjører som skriver ut noe. 137 00:06:37,390 --> 00:06:40,500 Så, la oss faktisk ser på koden for en andre, 138 00:06:40,500 --> 00:06:43,080 og bryte det ned litt. 139 00:06:43,080 --> 00:06:45,260 Er størrelsen bra for alle her? 140 00:06:45,260 --> 00:06:51,560 >> Så, forhåpentligvis, du er noe komfortabel med å bruke Python. 141 00:06:51,560 --> 00:06:55,820 Jeg antar at vi kan se på Python og lese gjennom den. 142 00:06:55,820 --> 00:06:59,290 Hvis du har spørsmål om noe, kan jeg også gå over det. 143 00:06:59,290 --> 00:07:03,974 >> Så den første linjen er, fra Flask, vi importerer, Flask med stor "F" 144 00:07:03,974 --> 00:07:06,140 som er liksom alt viktige funksjoner som du trenger. 145 00:07:06,140 --> 00:07:08,890 Når du skriver en fil, og ved hjelp av kolbe 146 00:07:08,890 --> 00:07:12,120 du kommer til å ønske å importere det, bare fordi det har alle de viktigste tingene. 147 00:07:12,120 --> 00:07:15,400 Det neste vi gjør, er vi kalle denne funksjonen Flask, bare 148 00:07:15,400 --> 00:07:19,270 å lage en app objekt, og du er alltid kommer til å ønske å gjøre det. 149 00:07:19,270 --> 00:07:25,960 >> Og deretter hoppe ned til bunn raskt, her er denne delen, 150 00:07:25,960 --> 00:07:28,760 'if_name _ == "_ main_" "som er liksom en Python-konvensjonen. 151 00:07:28,760 --> 00:07:32,750 Så dette vil bare kjøre hvis du kjøre denne filen direkte ved hjelp av Python. 152 00:07:32,750 --> 00:07:36,040 Deretter kaller vi app.run, som vil faktisk starte programmet kommer. 153 00:07:36,040 --> 00:07:39,570 >> Så, det er hovedstrukturen som vil du ha i noen Flask søknad, 154 00:07:39,570 --> 00:07:48,550 er du vil ha denne app = Flask (_NAME_), og deretter app.run. 155 00:07:48,550 --> 00:07:54,940 >> Så de to tingene som jeg har her inne, er det vi kaller ruter. 156 00:07:54,940 --> 00:07:57,150 Så, la oss snakke om ruting litt mer. 157 00:07:57,150 --> 00:07:58,430 Jeg skal gå tilbake til raset. 158 00:07:58,430 --> 00:08:02,540 >> Så det mest grunnleggende konsept i Flask er ruting. 159 00:08:02,540 --> 00:08:06,750 Og det er ideen om at du tilordne funksjoner i Python 160 00:08:06,750 --> 00:08:11,280 til bestemte adresser på nettsiden din. 161 00:08:11,280 --> 00:08:13,930 Så, når du vil å opprette en ny rute, 162 00:08:13,930 --> 00:08:16,500 du bruker denne @ app.route funksjon dekoratør. 163 00:08:16,500 --> 00:08:19,770 Så, hvis du er ukjent med funksjons dekoratører i Python, 164 00:08:19,770 --> 00:08:24,160 det er dette konseptet som lar deg ta en funksjon 165 00:08:24,160 --> 00:08:26,800 og omslutter den med noe annet. 166 00:08:26,800 --> 00:08:30,140 >> Så egentlig, hva dette dekoratør gjør, er at det tar funksjonen under den, 167 00:08:30,140 --> 00:08:33,409 og det gir mer informasjon til det, men hva Flask faktisk 168 00:08:33,409 --> 00:08:37,480 gjør det skje er ikke super avgjørende, men hva som er viktig, 169 00:08:37,480 --> 00:08:43,640 er at før ruten, du sette dette @ app.route, og deretter 170 00:08:43,640 --> 00:08:46,480 adressen til ruten, så skråstreken er det vi 171 00:08:46,480 --> 00:08:48,360 så når vi bare åpne opp nettsiden. 172 00:08:48,360 --> 00:08:49,580 Så det er på hjemmesiden. 173 00:08:49,580 --> 00:08:51,037 Det er bare slash ruten. 174 00:08:51,037 --> 00:08:52,370 Og så har denne funksjonen. 175 00:08:52,370 --> 00:08:54,453 Navnet på funksjonen kan bli hva du vil. 176 00:08:54,453 --> 00:08:56,930 Det behøver ikke nødvendigvis har å gjøre med ruten. 177 00:08:56,930 --> 00:08:59,440 Og så, uansett funksjonen avkastning, 178 00:08:59,440 --> 00:09:01,730 funksjonen skal returnere en streng. 179 00:09:01,730 --> 00:09:03,740 Og at strengen kan inneholder HTML eller noe, 180 00:09:03,740 --> 00:09:06,920 og det er faktisk det får tilbake til nettleseren som HTML, 181 00:09:06,920 --> 00:09:08,200 og det vil gjengi det. 182 00:09:08,200 --> 00:09:12,030 >> Så dette er den samme koden som var fra eksempelet 183 00:09:12,030 --> 00:09:16,430 at jeg bare løp, så når vi besøker slash, det kaller en Hello World-funksjonen, som 184 00:09:16,430 --> 00:09:20,470 bare returnerer en streng, Hello Flask, og som blir skrevet ut på skjermen. 185 00:09:20,470 --> 00:09:27,290 >> Så det er et annet eksempel, som er, når du besøker / hallo, 186 00:09:27,290 --> 00:09:30,370 det skrives ut Hei Word, som bør faktisk si, Hello World, 187 00:09:30,370 --> 00:09:32,010 men la oss late som var tilsiktet. 188 00:09:32,010 --> 00:09:35,140 Så la oss trekke det opp virkelig rask. 189 00:09:35,140 --> 00:09:41,290 >> Så hvis du går til localhost / hallo, det vil nå skrive ut noe annet. 190 00:09:41,290 --> 00:09:45,680 Så det er bare en rask eksempel på hvordan du kan lage to forskjellige ruter. 191 00:09:45,680 --> 00:09:50,630 >> Så, så langt dette ikke er super nyttig, det er ikke mye du kan gjøre, 192 00:09:50,630 --> 00:09:55,360 du bare kunne gjøre alt med har forskjellige HTML-sider, 193 00:09:55,360 --> 00:09:58,000 og når du besøker et bestemt siden det bare laster siden. 194 00:09:58,000 --> 00:10:00,864 Så la oss se litt mer nyttige ting du kan gjøre. 195 00:10:00,864 --> 00:10:03,780 Så, en ting som du kan ha merke til i eksemplet som jeg trakk 196 00:10:03,780 --> 00:10:07,160 opp, er at jeg hadde app.run (debug = True). 197 00:10:07,160 --> 00:10:09,580 Og så, hva dette debug argument gjør, er 198 00:10:09,580 --> 00:10:14,600 at når du drive din web server, når du er i programmet, 199 00:10:14,600 --> 00:10:18,100 Hvis du endrer en fil, vil det automatisk reload serveren. 200 00:10:18,100 --> 00:10:21,160 >> Og så du ikke egentlig trenger å restart Python, som er super nyttig. 201 00:10:21,160 --> 00:10:24,020 Jeg kan vise det. 202 00:10:24,020 --> 00:10:26,960 La meg trekke opp min kode med skrivefeil i den, 203 00:10:26,960 --> 00:10:30,420 og late som om skrivefeil ble lagt der forsettlig for læreformål. 204 00:10:30,420 --> 00:10:31,625 Så la oss legge denne tilbake igjen. 205 00:10:31,625 --> 00:10:33,140 Så nå står det Hello World. 206 00:10:33,140 --> 00:10:34,410 Jeg vil lagre det. 207 00:10:34,410 --> 00:10:36,540 Og hvis vi trekker opp igjen terminalen, vil du 208 00:10:36,540 --> 00:10:39,520 si at det er å starte på nytt, fordi det oppdaget en endring, 209 00:10:39,520 --> 00:10:43,620 og så nå når vi reload denne siden det vil skrive ut den riktige tingen. 210 00:10:43,620 --> 00:10:45,630 >> Så debug er super nyttig for det. 211 00:10:45,630 --> 00:10:48,740 Også, hvis du har noen liksom en krasj, så 212 00:10:48,740 --> 00:10:54,370 la meg gjøre dette programmet krasjer ved å ha den ikke returnere en streng. 213 00:10:54,370 --> 00:10:57,540 Så, la oss bare ha det returnere Ingen annen grunn. 214 00:10:57,540 --> 00:11:00,810 Og så når jeg besøker denne side, vil det bare krasje, 215 00:11:00,810 --> 00:11:04,465 men serveren ikke bare krasje, det faktisk gir deg en super nyttig tilbake 216 00:11:04,465 --> 00:11:06,490 spor av alt som gikk galt. 217 00:11:06,490 --> 00:11:10,050 Og hva er egentlig fint, er at på alle trinn i dette tilbake spor, 218 00:11:10,050 --> 00:11:14,260 du kan åpne opp en interaktiv skallet her, og liksom skrive ut hva 219 00:11:14,260 --> 00:11:17,780 variablene du ønsker å ta en titt på. 220 00:11:17,780 --> 00:11:21,054 >> Og så debugging er virkelig nyttig for å finne ut 221 00:11:21,054 --> 00:11:23,470 hva som skjer med din server, i stedet for bare å se 222 00:11:23,470 --> 00:11:28,201 noe i PHP som en 500 interne server error, som er super ubrukelig. 223 00:11:28,201 --> 00:11:30,700 En ting å være klar over, er at hvis du setter din app online 224 00:11:30,700 --> 00:11:34,260 så det er synlig for publikum, du aldri vil forlate feilsøkingsmodus på, 225 00:11:34,260 --> 00:11:37,320 fordi folk faktisk kan bruke den konsollen som jeg 226 00:11:37,320 --> 00:11:39,150 viste deg å kjøre vilkårlig kode. 227 00:11:39,150 --> 00:11:42,120 >> Slik at de kan skrive ut som en hvilken som helst hemmelige koder du har i det, 228 00:11:42,120 --> 00:11:44,755 de kan se på akkurat hvordan nettstedet ditt fungerer. 229 00:11:44,755 --> 00:11:46,630 Så det er veldig nyttig for testing, men alltid 230 00:11:46,630 --> 00:11:50,090 sørg for å ta den ut før du publiserer noe på nettet. 231 00:11:50,090 --> 00:11:56,640 >> Så når du bruker noe som PHP, det er denne ideen 232 00:11:56,640 --> 00:11:58,920 at du kan passere informasjon mellom websider 233 00:11:58,920 --> 00:12:03,620 ved å sette den informasjon faktisk i nettadressen, som er en GET forespørsel, 234 00:12:03,620 --> 00:12:07,490 men i Flask, kan du faktisk gjøre noe liksom sånn, 235 00:12:07,490 --> 00:12:10,590 ved å ha en rute som har en variabel som en del av det. 236 00:12:10,590 --> 00:12:14,090 >> Så hvis du ser på denne eksempel på skjermen her, 237 00:12:14,090 --> 00:12:19,930 vi har en rute som er ('/ hallo /'), og så, hvis du besøker 238 00:12:19,930 --> 00:12:23,790 / hei / noe, at noe kommer til å faktisk få fylt 239 00:12:23,790 --> 00:12:25,490 inn navnet variabel. 240 00:12:25,490 --> 00:12:27,850 Og legg merke til at funksjonen som kommer med den ruten 241 00:12:27,850 --> 00:12:31,302 må ta i parameter navn, slik at det faktisk vil 242 00:12:31,302 --> 00:12:32,510 får gått inn i funksjonen. 243 00:12:32,510 --> 00:12:34,190 >> Og så, når du er innsiden av den funksjonen, 244 00:12:34,190 --> 00:12:36,420 du kan behandle det som en normal Python variabel, 245 00:12:36,420 --> 00:12:39,650 og så deretter, vil det skrive ut Hallo, og det 246 00:12:39,650 --> 00:12:42,000 vil fylle ut navnet med noen streng formatering. 247 00:12:42,000 --> 00:12:48,060 >> Så for å legge variable deler til en routing, du bruker vinkelparentes merking. 248 00:12:48,060 --> 00:12:51,220 Og eventuelt, kan du bruke det som kalles en omformer. 249 00:12:51,220 --> 00:12:56,840 Og så, hvis du setter dette annotering med kolon, 250 00:12:56,840 --> 00:13:00,015 kan du oppgi at det er en int, eller en dupp, eller bane, 251 00:13:00,015 --> 00:13:01,640 og det vil automatisk konvertere det. 252 00:13:01,640 --> 00:13:05,130 Du kan også gjøre konverteringen innenfor Python-funksjonen, 253 00:13:05,130 --> 00:13:09,710 bare ved hjelp av en støpt, men noen ganger hvis du ønsker å sikre at det er en int, 254 00:13:09,710 --> 00:13:12,080 du kan sette det regel konvertering i det. 255 00:13:12,080 --> 00:13:15,930 >> Så la oss trekke opp et eksempel av enkelte variable regler. 256 00:13:15,930 --> 00:13:21,480 Så her, har dette den samme grunnleggende struktur med fra Flask import 257 00:13:21,480 --> 00:13:25,030 Flask, app = Flask (_NAME_), og så er det å kjøre på slutten. 258 00:13:25,030 --> 00:13:28,050 Vi har disse to forskjellige variable ruter her. 259 00:13:28,050 --> 00:13:29,900 Og den første, er den som jeg viste 260 00:13:29,900 --> 00:13:34,230 i raset, som var at det bare tar i en streng navn 261 00:13:34,230 --> 00:13:35,650 og det vil skrive ut Hallo, Name. 262 00:13:35,650 --> 00:13:41,410 >> Og så, den andre en bruker konvertering. 263 00:13:41,410 --> 00:13:44,690 Så dette vil automatisk konvertere den til en int, og deretter doble int, 264 00:13:44,690 --> 00:13:46,150 og skrive det ut. 265 00:13:46,150 --> 00:13:48,220 Og gjør vi ikke noen form konvertering innenfor det 266 00:13:48,220 --> 00:13:49,594 fordi Flask tar seg av det. 267 00:13:49,594 --> 00:13:53,181 Så la oss få dette i gang. 268 00:13:53,181 --> 00:13:54,930 Når du har en Flask program er i gang, 269 00:13:54,930 --> 00:13:58,440 Du kan styre-C ut av det for å stoppe driften serveren. 270 00:13:58,440 --> 00:14:02,420 Og da vil jeg kjøre variablene. 271 00:14:02,420 --> 00:14:11,740 >> Så la oss gå til localhost / hei / Ezra og forhåpentligvis vil dette si hei til meg. 272 00:14:11,740 --> 00:14:14,530 273 00:14:14,530 --> 00:14:20,310 >> Så tok det i mitt navn, i variabelen rute, og det fylte den inn her. 274 00:14:20,310 --> 00:14:23,950 Så jeg vil også vise en rask eksempel på dobling. 275 00:14:23,950 --> 00:14:28,600 Så hvis du går til / dobbel / 3, det vil skrive ut seks. 276 00:14:28,600 --> 00:14:31,440 Så dette tok seg av konverteringen for oss. 277 00:14:31,440 --> 00:14:34,190 >> Så du kan også gjøre det med float, og noe spesielt, 278 00:14:34,190 --> 00:14:37,530 Hvis du trenger å oppgi noe sånt en bane, som gjør at den aksepterer skråstreker, 279 00:14:37,530 --> 00:14:39,155 men det bør vanligvis ikke være et problem. 280 00:14:39,155 --> 00:14:41,480 281 00:14:41,480 --> 00:14:43,820 Så langt har vi, har fortsatt bare vært tilbake 282 00:14:43,820 --> 00:14:46,320 strenger, som ikke er veldig interessant. 283 00:14:46,320 --> 00:14:48,730 >> Vi kunne faktisk tilbake bokstave HTML streng. 284 00:14:48,730 --> 00:14:54,322 Så i koden kan vi sette inn noe som b-tag for å gjøre den fet, 285 00:14:54,322 --> 00:14:56,030 men mest av tiden du ikke egentlig ønsker 286 00:14:56,030 --> 00:14:58,420 å være å skrive HTML-kode i Python-kode. 287 00:14:58,420 --> 00:15:01,940 Det blir veldig rotete, og det er ikke en god tid. 288 00:15:01,940 --> 00:15:06,430 >> Flask tillater oss å skille ut HTML inn det som kalles mal, 289 00:15:06,430 --> 00:15:09,467 og så hvis du tenker i form av MVC-modellen 290 00:15:09,467 --> 00:15:11,550 at du er kjent med, forhåpentligvis, fra arbeid 291 00:15:11,550 --> 00:15:15,520 med CS50 Finance litt, du kan tenke på Python-filer 292 00:15:15,520 --> 00:15:19,430 som mer av kontrollen, der de er i samspill med det 293 00:15:19,430 --> 00:15:20,970 datamodell du måtte ha. 294 00:15:20,970 --> 00:15:24,900 >> Og så er de roper til Views og sende informasjon til den visnings 295 00:15:24,900 --> 00:15:28,120 å fylle inn informasjon i HTML som den trenger. 296 00:15:28,120 --> 00:15:30,490 Og det vi kaller disse Views er maler i klassen. 297 00:15:30,490 --> 00:15:35,280 >> Så Flask bruker en annen Python modul som det vil automatisk 298 00:15:35,280 --> 00:15:38,620 installere når du PIP installere Flask kalt Jinja, som 299 00:15:38,620 --> 00:15:40,885 lar deg legge til disse merknader til HTML 300 00:15:40,885 --> 00:15:45,140 som du ser på skjermen, lar det du putter i ting som conditionals, 301 00:15:45,140 --> 00:15:47,230 og løkker inn i HTML. 302 00:15:47,230 --> 00:15:51,140 >> Så det ser litt ut som hvordan du kan bruke PHP i en HTML-fil, 303 00:15:51,140 --> 00:15:57,380 men dette er bare når Flask server serverer HTML-filen, 304 00:15:57,380 --> 00:16:01,610 det vil kjøre denne templating motor og analysere gjennom dette og fylle ting i. 305 00:16:01,610 --> 00:16:06,650 Så Flask har en render_template funksjon som du kan se nederst her. 306 00:16:06,650 --> 00:16:14,300 Og så når du besøker denne siden, det ville gjengi denne hello.html mal, 307 00:16:14,300 --> 00:16:16,407 og deretter fylle denne HTML-side. 308 00:16:16,407 --> 00:16:18,990 Så la oss bare kjøre denne real rask, og se hvordan det ser ut, 309 00:16:18,990 --> 00:16:21,198 og så skal jeg gå gjennom en Litt mer detaljert. 310 00:16:21,198 --> 00:16:25,380 311 00:16:25,380 --> 00:16:30,260 Så, er dine Maler kommer å gå i en Maler mappe. 312 00:16:30,260 --> 00:16:33,980 Det vil automatisk søke innenfor Maler-mappen for at mal. 313 00:16:33,980 --> 00:16:35,615 Så la oss åpne opp dette. 314 00:16:35,615 --> 00:16:47,350 315 00:16:47,350 --> 00:16:50,005 Så, jeg skal kjøre templating eksempel. 316 00:16:50,005 --> 00:16:52,820 317 00:16:52,820 --> 00:17:03,660 >> Så hvis jeg går til / hei / Ezra, det har denne horrible, 318 00:17:03,660 --> 00:17:05,930 ytterst ubehagelig marquee tag at jeg satt i. 319 00:17:05,930 --> 00:17:08,050 Veldig hyggelig, veldig dynamisk. 320 00:17:08,050 --> 00:17:09,349 Jeg er en stor fan. 321 00:17:09,349 --> 00:17:13,900 Men hva skjer hvis Jeg bare gå til, / hallo? 322 00:17:13,900 --> 00:17:15,220 Så det bare sier Hello World. 323 00:17:15,220 --> 00:17:17,678 Jeg fikk ikke gi det et navn, og det fylt det inn automatisk. 324 00:17:17,678 --> 00:17:22,050 Så la oss se hvordan det gjorde det, og hvordan vi kan bli kvitt det telt kanskje. 325 00:17:22,050 --> 00:17:26,240 >> Så her, er denne typen et interessant eksempel på, 326 00:17:26,240 --> 00:17:29,101 hvis du er kjent med hvordan switch uttalelser jobbe i et språk. 327 00:17:29,101 --> 00:17:31,350 Sier dette er liksom som, den slags et fall gjennom, 328 00:17:31,350 --> 00:17:34,266 hvor du faktisk vedlagt to forskjellige ruter til den samme funksjonen. 329 00:17:34,266 --> 00:17:41,190 Så vi feste / hallo rute og den / hei / navn rute til Hei, 330 00:17:41,190 --> 00:17:45,130 og vi spesifiserer using-- Python lar deg spesifisere standardfunksjon arguments-- 331 00:17:45,130 --> 00:17:48,300 slik at hvis det ikke er noe navn, så hvis vi går til nettopp / hallo, 332 00:17:48,300 --> 00:17:50,680 det vil automatisk filtrere å nevne er lik Ingen. 333 00:17:50,680 --> 00:17:55,010 >> Så da vi gjengi Mal med name = navn, 334 00:17:55,010 --> 00:17:59,510 så det vil passere i navnet parameter lik dette navnet funksjon parameter, 335 00:17:59,510 --> 00:18:00,730 inn i malen. 336 00:18:00,730 --> 00:18:04,040 Som fortsatt ikke forklare hvordan er avgjøre om det skal skrives Hello World, 337 00:18:04,040 --> 00:18:05,100 eller skrive navnet mitt. 338 00:18:05,100 --> 00:18:08,050 Så la oss faktisk ser til selve malen, 339 00:18:08,050 --> 00:18:11,610 og se hvor det kommer fra. 340 00:18:11,610 --> 00:18:18,680 >> Så, i løpet av denne malen, vi faktisk har noen betinget logikk, 341 00:18:18,680 --> 00:18:20,580 som noen mennesker ville argumentere, du faktisk 342 00:18:20,580 --> 00:18:23,730 bør ikke ha mye betinget logikken i din mal selv. 343 00:18:23,730 --> 00:18:26,310 Det bør være mer innenfor Kontroller, men i dette eksemplet 344 00:18:26,310 --> 00:18:27,476 det er noe ganske liten. 345 00:18:27,476 --> 00:18:31,060 Så her kan vi sjekke, hvis navn, så hvis navn ikke er lik Ingen, 346 00:18:31,060 --> 00:18:33,130 hvis et navn er faktisk gått inn, så vi vil 347 00:18:33,130 --> 00:18:36,210 si Hei, navn med header og rulleteksten, 348 00:18:36,210 --> 00:18:41,490 alt dette vanlig HTML, ellers vil vi skrive ut Hello, World bare normalt. 349 00:18:41,490 --> 00:18:45,820 Så et par ting å legge merke til her om hvordan du formaterer templating, 350 00:18:45,820 --> 00:18:49,110 er at alle disse betinget utsagn, 351 00:18:49,110 --> 00:18:54,475 liksom som hvordan vi PHP det når du ønsker å sette inn noen PHP, 352 00:18:54,475 --> 00:18:58,380 du bruker mindre enn spørsmålet mark, det er liksom analogt her 353 00:18:58,380 --> 00:19:00,140 med {%. 354 00:19:00,140 --> 00:19:02,130 >> Så her har vi vår betinget kode. 355 00:19:02,130 --> 00:19:05,920 Og så, når du faktisk ønsker å bokstavelig evaluere noe, og print 356 00:19:05,920 --> 00:19:08,710 det ut til skjermen, du bruke de doble bukseseler. 357 00:19:08,710 --> 00:19:12,310 Så her er det doble tannregulering, og da vi spesifiserer navn, 358 00:19:12,310 --> 00:19:15,500 så innen det, vil det evaluere til variabelen navn, som 359 00:19:15,500 --> 00:19:18,860 ble vedtatt i fra gjengi mal funksjon, 360 00:19:18,860 --> 00:19:21,484 snarere enn bare utskrift ut, hvis vi ble kvitt disse, 361 00:19:21,484 --> 00:19:23,150 det ville bare skrive ut ordet "navn". 362 00:19:23,150 --> 00:19:26,340 Så, det er noe å se opp for. 363 00:19:26,340 --> 00:19:29,792 >> Så en annen ting å innkallingen er at når vi 364 00:19:29,792 --> 00:19:31,500 ønsker å bruke render_template funksjon, 365 00:19:31,500 --> 00:19:34,490 vi faktisk nødt til å importere det eksplisitt fra Flask. 366 00:19:34,490 --> 00:19:36,915 Og dette er et eksempel på modularitet av Flask, 367 00:19:36,915 --> 00:19:39,290 at du ikke trenger å importere ting som du ikke trenger. 368 00:19:39,290 --> 00:19:41,290 Du kan bare ta med i funksjonene du faktisk 369 00:19:41,290 --> 00:19:43,450 trenger, som noen ganger er hyggelig, slik at du ikke 370 00:19:43,450 --> 00:19:46,560 må ha alle disse funksjonene sitter rundt som du ikke bruker, 371 00:19:46,560 --> 00:19:49,730 men også, hvis du glemmer at du må importere render_template, 372 00:19:49,730 --> 00:19:52,660 du vil sannsynligvis få en advarsel som vil gi deg beskjed om det. 373 00:19:52,660 --> 00:19:56,700 Så, er at templating. 374 00:19:56,700 --> 00:20:01,680 >> Så har vi vist hvordan lage enkle websider, 375 00:20:01,680 --> 00:20:04,947 og legge litt mer logikk å den, i form av den variable ruting. 376 00:20:04,947 --> 00:20:08,280 Det kan du gjøre forskjellige ting basert på hva URL du går til, og også da, gi 377 00:20:08,280 --> 00:20:11,950 HTML litt mer fornuftig i forhold til hvordan du ønsker å gjengi ting. 378 00:20:11,950 --> 00:20:14,210 Du trenger ikke å sette alle HTML i Python, 379 00:20:14,210 --> 00:20:16,640 men for ganske mye hver webapplikasjon, 380 00:20:16,640 --> 00:20:21,480 du kommer til å ønske noe slag av datamodell assosiert med den. 381 00:20:21,480 --> 00:20:25,560 >> Og så tradisjonelt, ville dette være noe sånt som en SQL-database. 382 00:20:25,560 --> 00:20:30,280 Og du kan bare samhandle direkte med SQL. 383 00:20:30,280 --> 00:20:32,190 Python har, tror jeg det heter. 384 00:20:32,190 --> 00:20:33,040 SQLite tre. 385 00:20:33,040 --> 00:20:38,454 Du kan bare importere SQLite 3 og utføre SQL-spørringer direkte, 386 00:20:38,454 --> 00:20:40,870 men jeg vet ikke om deg, men jeg egentlig ikke liker, bare, 387 00:20:40,870 --> 00:20:42,750 skrive ut SQL-spørringer. 388 00:20:42,750 --> 00:20:45,350 Det har en tendens til å bli veldig lang og komplisert. 389 00:20:45,350 --> 00:20:49,180 >> Og så, noe som Jeg liker å bruke, er hva som er 390 00:20:49,180 --> 00:20:53,610 kjent som en ORM, som er en objektrelasjons kartlegging. 391 00:20:53,610 --> 00:20:56,890 Og poenget med en objektrelasjons kartlegging, 392 00:20:56,890 --> 00:21:00,100 er at det er to forskjellige måter du kan tenke på databaser. 393 00:21:00,100 --> 00:21:03,240 >> Så eksempelet som Professor Malan vanligvis 394 00:21:03,240 --> 00:21:07,660 bruker i klassen, er Excel-tabellen, der du har disse rader og disse kolonnene, 395 00:21:07,660 --> 00:21:10,210 og det er veldig nyttig for hvordan den er representert i SQL 396 00:21:10,210 --> 00:21:13,170 og hvordan du kommuniserer med det, men en annen måte at det er faktisk 397 00:21:13,170 --> 00:21:16,390 nyttig å tenke på det noen ganger, er i form av klasser og objekter. 398 00:21:16,390 --> 00:21:20,420 >> Så i stedet for å tenke av hvert bord som å ha 399 00:21:20,420 --> 00:21:23,040 denne raden som har visse informasjon, kan du faktisk 400 00:21:23,040 --> 00:21:26,100 Tenk på det som å være hver tabell er en klasse, 401 00:21:26,100 --> 00:21:29,810 og deretter hver forekomst av klasse har visse egenskaper. 402 00:21:29,810 --> 00:21:35,110 Så, i dette eksempelet, forekomster av klassen er radene i tabellen 403 00:21:35,110 --> 00:21:37,490 og deretter hver eiendom ville være en kolonne i tabellen. 404 00:21:37,490 --> 00:21:40,840 >> Så, ORM som jeg liker å bruke kalles peewee. 405 00:21:40,840 --> 00:21:43,520 Det er veldig lite, liksom som Flask. 406 00:21:43,520 --> 00:21:46,760 Jeg tror at de går godt sammen, men det er mange andre Orms 407 00:21:46,760 --> 00:21:47,730 som du kan bruke. 408 00:21:47,730 --> 00:21:52,180 En mer populær en er kjent som SQLAlchemy, 409 00:21:52,180 --> 00:21:56,050 og jeg kan ikke huske hvorfor jeg opprinnelig valgte peewee løpet SQLAlchemy, 410 00:21:56,050 --> 00:21:58,311 eller jeg ville fortelle deg hvorfor jeg tror det er den beste, 411 00:21:58,311 --> 00:22:01,060 men vi bare kommer til å bruke dette fordi jeg vet hvordan du bruker den. 412 00:22:01,060 --> 00:22:04,760 >> Så, er ett spørsmål, hvorfor bør du gidder å bruke en ORM, 413 00:22:04,760 --> 00:22:07,552 i stedet for bare direkte skrive SQL-spørringer? 414 00:22:07,552 --> 00:22:09,760 Og jeg tror den beste saken, er at du faktisk ikke 415 00:22:09,760 --> 00:22:11,356 må skrive SQL-spørringer. 416 00:22:11,356 --> 00:22:14,480 Det er mye lettere, som jeg skal vise deg, for å gjøre ting som valg, innsetting, 417 00:22:14,480 --> 00:22:16,157 sletting, spesielt lage tabeller. 418 00:22:16,157 --> 00:22:17,990 Det er mye lettere å skrive en klasse struktur, 419 00:22:17,990 --> 00:22:22,250 enn det er å strukturere en Lag Tabell uttalelse, men en ting 420 00:22:22,250 --> 00:22:25,710 å være klar over, er at ORM vil prøve sitt beste 421 00:22:25,710 --> 00:22:28,640 å finne ut hva de mest effektiv SQL-spørring ville være, 422 00:22:28,640 --> 00:22:30,110 men noen ganger blir det det galt. 423 00:22:30,110 --> 00:22:32,660 >> Og spesielt hvis du er å arbeide med en stor database, 424 00:22:32,660 --> 00:22:35,557 kan du legge merke til at en spørring som skal kjøre fort, 425 00:22:35,557 --> 00:22:36,640 faktisk tar lengre tid. 426 00:22:36,640 --> 00:22:40,164 Og hvis du ser under panseret på hvordan ORM er å tolke det i SQL, 427 00:22:40,164 --> 00:22:42,080 det kan være å gjøre noe virkelig latterlig, 428 00:22:42,080 --> 00:22:44,371 bare fordi det liksom gestikulerte dine intensjoner galt. 429 00:22:44,371 --> 00:22:48,080 Og, det har vært tider hvor Jeg har hatt til å overstyre det, og bare 430 00:22:48,080 --> 00:22:52,429 utføre mine egne SQL-spørringer, bare fordi det ble parsing på en merkelig måte. 431 00:22:52,429 --> 00:22:54,220 Så det er noen overhead, bare i måten 432 00:22:54,220 --> 00:22:58,680 at det kompilerer din uttalelser ned i SQL. 433 00:22:58,680 --> 00:23:06,200 >> Så, la oss se super raskt på et enkelt eksempel på en datamodell 434 00:23:06,200 --> 00:23:07,350 som du kan bruke. 435 00:23:07,350 --> 00:23:11,880 Så dette er Python-kode, og så første du vil gjøre er fra 436 00:23:11,880 --> 00:23:12,950 PeeWee import *. 437 00:23:12,950 --> 00:23:15,850 Så, i motsetning Flask, hvor du har alle disse individuelle moduler, 438 00:23:15,850 --> 00:23:18,125 og du vil importere Flask, og skrive en mal, og noen andre 439 00:23:18,125 --> 00:23:20,690 at vi skal se senere, fra PeeWee, du kan bare importere alt, 440 00:23:20,690 --> 00:23:22,290 fordi det er en ganske lite bibliotek. 441 00:23:22,290 --> 00:23:26,490 >> Så, det første du vil gjøre, er faktisk lage denne databasen objektet. 442 00:23:26,490 --> 00:23:31,212 Så har du db = SqliteDatabase, og deretter navnet på databasen. 443 00:23:31,212 --> 00:23:33,170 Og dette vil faktisk skape et databaseobjekt 444 00:23:33,170 --> 00:23:36,230 at du kan samhandle med, med peewee. 445 00:23:36,230 --> 00:23:40,570 >> Og så har vi den faktiske modell som vi ønsker å skape. 446 00:23:40,570 --> 00:23:42,470 Så tabellen vi ønsker å skape. 447 00:23:42,470 --> 00:23:47,270 Så, innen peewee, har hver klasse sitt eget bord i databasen. 448 00:23:47,270 --> 00:23:52,800 Så alle klassene arve fra grunnmodellen, 449 00:23:52,800 --> 00:23:55,960 og hovedstaden M-modellen er noe som er definert i peewee. 450 00:23:55,960 --> 00:24:02,162 >> Så, alle modellene skal arve som høyeste super, 451 00:24:02,162 --> 00:24:04,620 de skal arve fra modellen, men hva som er kult, 452 00:24:04,620 --> 00:24:07,610 er at du faktisk kan ha din modeller arve fra hverandre. 453 00:24:07,610 --> 00:24:10,530 Og mye av tiden din datamodeller ikke nødvendigvis 454 00:24:10,530 --> 00:24:13,754 lage en fin arv hierarki, men tider hvor de gjør det, er det veldig hyggelig, 455 00:24:13,754 --> 00:24:15,920 fordi du har modellen iboende fra hverandre. 456 00:24:15,920 --> 00:24:19,710 >> Så, definerte vi denne klassen "student", som arver en modell, 457 00:24:19,710 --> 00:24:21,170 og den har tre egenskaper. 458 00:24:21,170 --> 00:24:24,080 Den har en ID, som er en PrimaryKeyField, som 459 00:24:24,080 --> 00:24:26,920 er noe som er gitt av PeeWee, er navn en charfield, 460 00:24:26,920 --> 00:24:28,490 og en karakter er en IntegerField. 461 00:24:28,490 --> 00:24:32,260 Så dette kan eller ikke kan være hvordan CS50 faktisk lagrer alle 462 00:24:32,260 --> 00:24:33,650 elevenes karakterer. 463 00:24:33,650 --> 00:24:36,060 Det er ikke, men dette er hvordan jeg ville gjøre det. 464 00:24:36,060 --> 00:24:37,920 >> Og så det har, innenfor denne klassen, og denne 465 00:24:37,920 --> 00:24:41,620 er noe du kan gjøre med Python, kan du ha nestet klasser. 466 00:24:41,620 --> 00:24:43,920 Og dette er noe som kreves av peewee. 467 00:24:43,920 --> 00:24:47,250 Så, denne klassen Meta, har du å spesifisere at databasen er 468 00:24:47,250 --> 00:24:49,830 lik gjenstanden at vi opprettet ovenfor. 469 00:24:49,830 --> 00:24:54,339 Og dette sier hva filen er denne tabellen faktisk kommer til å ligge i. 470 00:24:54,339 --> 00:24:57,130 Så dette er noe som du må å gjøre innen alle dine modeller. 471 00:24:57,130 --> 00:24:59,380 Du trenger bare å spesifisere innenfor denne Meta klassen 472 00:24:59,380 --> 00:25:01,400 den databasen er lik db. 473 00:25:01,400 --> 00:25:03,940 Så det jeg vanligvis gjør, hvis jeg har en haug med forskjellige modeller, 474 00:25:03,940 --> 00:25:05,910 er at jeg har en base modell, som jeg vanligvis 475 00:25:05,910 --> 00:25:08,839 bare kalle "base-modellen" som har Meta klassen, 476 00:25:08,839 --> 00:25:10,380 og det setter databasen lik db. 477 00:25:10,380 --> 00:25:13,710 Og så alle mine påfølgende modeller vil arve fra at base klasse. 478 00:25:13,710 --> 00:25:16,760 Og så jeg ikke trenger å bekymre deg om å sette Meta klassen. 479 00:25:16,760 --> 00:25:21,490 >> Så, når dette faktisk blir kompilert ned i en SQL-setning, 480 00:25:21,490 --> 00:25:24,875 det ser ut som dette ekle ting ned her, "Lag tabell student ID heltall, 481 00:25:24,875 --> 00:25:26,020 " samme det. 482 00:25:26,020 --> 00:25:30,002 >> Og, jeg tror at det er kortere, denne SQL-spørring her, 483 00:25:30,002 --> 00:25:32,960 men hvis du ser på denne klassen her du kan se nøyaktig hva som skjer. 484 00:25:32,960 --> 00:25:36,116 Du kan se hva slags felt det er, hva de heter, 485 00:25:36,116 --> 00:25:38,115 og så tror jeg at ser på dette Python-kode 486 00:25:38,115 --> 00:25:43,340 er mye mer lesbar enn prøver å skrive denne SQL-spørring. 487 00:25:43,340 --> 00:25:45,990 >> Så, for å faktisk bruke databasen, 488 00:25:45,990 --> 00:25:48,470 vi må koble til den innen Python. 489 00:25:48,470 --> 00:25:52,770 Så, jeg vanligvis skrive en funksjon som heter initialize_db som gjør to ting. 490 00:25:52,770 --> 00:25:54,880 Det tar i databasen objekt db og det 491 00:25:54,880 --> 00:25:58,360 kobler seg til det, som bare åpner opp seksjon til databasen. 492 00:25:58,360 --> 00:26:00,860 Hvis du bare kjører skjønt nettside på din lokale maskin, 493 00:26:00,860 --> 00:26:04,320 det er ikke en super big deal å bekymre om tilkobling og frakobling, 494 00:26:04,320 --> 00:26:06,885 men hvis du kjører det på et nettsted, du 495 00:26:06,885 --> 00:26:10,010 vil være sikker på at når en bruker kobler seg til det, når de stenger ute 496 00:26:10,010 --> 00:26:12,270 nettsiden, koble de slik at du ikke har en haug med personer som er koblet 497 00:26:12,270 --> 00:26:14,480 til databasen på en gang. 498 00:26:14,480 --> 00:26:16,370 >> Og så, når du koble til databasen, 499 00:26:16,370 --> 00:26:20,832 du ønsker å ringe db.create_tables, og listen over de modellene for hva du vil 500 00:26:20,832 --> 00:26:21,540 å lage tabeller. 501 00:26:21,540 --> 00:26:23,950 Så her, jeg vil bare lage det for denne eleven. 502 00:26:23,950 --> 00:26:28,070 Og så, det som er viktig, er å spesifisere trygg = True mest tid. 503 00:26:28,070 --> 00:26:30,380 Så hva dette utsagnet vil gjøre, er at den 504 00:26:30,380 --> 00:26:33,580 skaper tabeller for student modell, men bare 505 00:26:33,580 --> 00:26:36,109 Hvis dette bordet har ikke blitt opprettet allerede. 506 00:26:36,109 --> 00:26:37,400 Det er hva de trygge spesifiserer. 507 00:26:37,400 --> 00:26:39,150 Så det vil ikke overskrive din eksisterende tabell, 508 00:26:39,150 --> 00:26:41,525 det vil bare skape en ny tabell hvis det ikke er der. 509 00:26:41,525 --> 00:26:45,090 I så fall kan du bare lage tabellene gang ved hjelp av SQL. 510 00:26:45,090 --> 00:26:49,410 Og så har den databasen sitte der, og deretter koble til hver gang, 511 00:26:49,410 --> 00:26:52,450 men det er som regel fint bare å satt i denne create_tables samtale, 512 00:26:52,450 --> 00:26:55,550 slik at hvis du noen gang sletter database når du drive din web 513 00:26:55,550 --> 00:26:57,960 app igjen, vil det gjenskape det. 514 00:26:57,960 --> 00:27:00,730 >> Så, bare sørg for at trygg er angitt til å være sant, 515 00:27:00,730 --> 00:27:03,580 eller vil du finne dine data bare får clobbered hver gang. 516 00:27:03,580 --> 00:27:06,380 Og så kan du bare ringe initialize_db å etablere 517 00:27:06,380 --> 00:27:09,820 en tilkobling, og skape bordene om nødvendig. 518 00:27:09,820 --> 00:27:13,150 >> Så, den mest vanlige ting som du vil ønske å gjøre, 519 00:27:13,150 --> 00:27:15,920 eller en av de mest vanlige ting, er å faktisk sette ting 520 00:27:15,920 --> 00:27:17,170 inn i databasen. 521 00:27:17,170 --> 00:27:19,430 Og så, i stedet for at å skrive en sette inn i 522 00:27:19,430 --> 00:27:21,990 uttalelse med alle verdiene angitt, 523 00:27:21,990 --> 00:27:24,650 du kan faktisk kalle funksjonen på studentklassen. 524 00:27:24,650 --> 00:27:28,200 Så, når du oppretter en klasse som arver fra modellen, 525 00:27:28,200 --> 00:27:30,200 den har dette skape metoden. 526 00:27:30,200 --> 00:27:33,870 >> Så, har du klasse name.create, og du spesifisere parametere 527 00:27:33,870 --> 00:27:35,260 som du ønsker å passere på. 528 00:27:35,260 --> 00:27:39,200 Så, hvis jeg ønsker å legge til noen studenter til vår CS50 karakter bok eksempel 529 00:27:39,200 --> 00:27:41,820 Jeg skal sette i David, som har en veldig god karakter, har han en 95. 530 00:27:41,820 --> 00:27:45,100 Og meg selv, hvem som ikke gjør så godt i CS50, jeg har en 50. 531 00:27:45,100 --> 00:27:47,600 Og så, det fine hva dette skape funksjonen gjør, 532 00:27:47,600 --> 00:27:53,040 er at den returnerer eksempel, eller rad, og den skapte i tabellen, 533 00:27:53,040 --> 00:27:55,750 og så da kan du lagre det i en variabel, og arbeidet med det senere. 534 00:27:55,750 --> 00:27:58,830 Du kan endre rundt, som Jeg skal vise et eksempel på. 535 00:27:58,830 --> 00:28:03,050 >> Legg merke til at jeg ikke gjorde det må spesifisere ID, 536 00:28:03,050 --> 00:28:09,340 fordi siden det er PrimaryKeyField, vil den automatisk 537 00:28:09,340 --> 00:28:10,930 øke den hvis du ikke spesifiserer det. 538 00:28:10,930 --> 00:28:12,250 Og, faktisk, har du sannsynligvis bør ikke spesifisere det, 539 00:28:12,250 --> 00:28:14,810 fordi du kanskje uhell clobber andres ID. 540 00:28:14,810 --> 00:28:16,830 Og du ønsker å gjøre sikker på at det er unikt. 541 00:28:16,830 --> 00:28:20,662 >> Så, faktisk den mest vanlig ting du ønsker å gjøre, 542 00:28:20,662 --> 00:28:22,620 er trolig velge ut av databasen når du 543 00:28:22,620 --> 00:28:24,078 har mye informasjon der. 544 00:28:24,078 --> 00:28:27,360 Og så, hvis du ønsker å få alt, så tilsvarer det velge stjerne 545 00:28:27,360 --> 00:28:30,940 fra studenter uttalelse, det ville bare være student.select. 546 00:28:30,940 --> 00:28:34,380 Og det vil gi deg tilbake en matrise med alle elev objekter i det 547 00:28:34,380 --> 00:28:35,770 at du iterere over du vil. 548 00:28:35,770 --> 00:28:37,019 Du kan få ting ut av det. 549 00:28:37,019 --> 00:28:39,310 Og mesteparten av tiden, du ikke bare ønsker å gjøre velger, 550 00:28:39,310 --> 00:28:40,935 du faktisk ønsker å spesifisere noe. 551 00:28:40,935 --> 00:28:44,580 Og så kan du kjede sammen disse funksjonskall, 552 00:28:44,580 --> 00:28:48,830 som hvordan du ville kjede sammen utsagnene i SQL. 553 00:28:48,830 --> 00:28:53,002 Så du kan gjøre student.select (). Der i dette eksempel. 554 00:28:53,002 --> 00:28:54,710 Og så kan du angi hvilke betingelser, 555 00:28:54,710 --> 00:28:57,880 bare å bruke normal Python Booleans å sjekke ting. 556 00:28:57,880 --> 00:29:02,110 >> Så, i dette tilfellet, vil du begrenser hva du velger å, 557 00:29:02,110 --> 00:29:06,790 hvor student.grade er lik 50, og student.name er lik Ezra, 558 00:29:06,790 --> 00:29:09,130 så det vil bare komme meg ut av det. 559 00:29:09,130 --> 00:29:11,340 Og legg merke til, en virkelig subtile ting her er 560 00:29:11,340 --> 00:29:15,570 at hvis du ønsker å spesifisere en og / og eller en eller / eller, 561 00:29:15,570 --> 00:29:19,840 i Python, ville du vanligvis bruker, Jeg tror ordet "og" faktisk, 562 00:29:19,840 --> 00:29:23,351 men her du bruker enkelt-tegn, som normalt er en bitvis operator, 563 00:29:23,351 --> 00:29:25,600 men i dette spesielle tilfellet, akkurat slik peewee gjør det, 564 00:29:25,600 --> 00:29:27,660 du bruker enkelt ampersand å angi "og". 565 00:29:27,660 --> 00:29:29,451 Det er noe som Jeg bli blandet opp mye, 566 00:29:29,451 --> 00:29:32,530 men det kommer ikke opp så mye i praksis. 567 00:29:32,530 --> 00:29:36,350 >> Og så, når du har alle studentene ut av databasen, 568 00:29:36,350 --> 00:29:39,420 når du har gjort du velger og din slitasje eller hva, 569 00:29:39,420 --> 00:29:42,334 du kan bruke en foreach loop, akkurat som vanlig i Python, 570 00:29:42,334 --> 00:29:44,500 med noen form for iterator eller med noen form for array. 571 00:29:44,500 --> 00:29:46,333 Så du kan gjøre, for s i student.select (). whe 572 00:29:46,333 --> 00:29:52,930 re (Student.grade <75), og så vil dette iterere over hver elev i tabellen 573 00:29:52,930 --> 00:29:56,260 hvis karakteren er mindre enn 75, som i dette tilfellet, er fortsatt bare meg. 574 00:29:56,260 --> 00:29:59,218 Og så kan du gjøre noe innen som loop, som sende meg en e-post 575 00:29:59,218 --> 00:30:01,680 og fortelle meg å faktisk slå i mitt problem Stiller. 576 00:30:01,680 --> 00:30:04,550 >> Så, en annen ting du kan gjør det, er det veldig lett 577 00:30:04,550 --> 00:30:06,460 for å oppdatere rader i tabellen. 578 00:30:06,460 --> 00:30:08,720 Så husk tilbake hit, når jeg satt inn, 579 00:30:08,720 --> 00:30:11,440 Jeg tok den verdien som var returneres av student.create, 580 00:30:11,440 --> 00:30:14,920 og jeg tildelt den til navn som heter Ezra. 581 00:30:14,920 --> 00:30:18,995 Og så nå, kan du endre verdier innen det tilfellet 582 00:30:18,995 --> 00:30:20,870 akkurat som du ville en normal klasse i Python. 583 00:30:20,870 --> 00:30:25,060 >> Så du kan stille ezra.grade = 95 og som vil oppdatere den lokale kopien, 584 00:30:25,060 --> 00:30:28,380 men hvis du faktisk ønsker å forplikte seg at endringen i databasen, 585 00:30:28,380 --> 00:30:31,410 du må ringe ezra.save, så du ringte .Lagre metode 586 00:30:31,410 --> 00:30:32,650 på forekomsten. 587 00:30:32,650 --> 00:30:38,085 >> Og så nå, jeg har nå endret min egen klasse i databasen. 588 00:30:38,085 --> 00:30:41,210 Ja, så la oss si at jeg blir tatt endre karakteren min i databasen. 589 00:30:41,210 --> 00:30:44,126 Professor Malan er trolig kommer å ønske å slette meg fra klassen, 590 00:30:44,126 --> 00:30:48,630 og så kan du ringe .delete instansmetode bare på at ting. 591 00:30:48,630 --> 00:30:51,674 >> Så, hvis du ønsket å gå tilbake i denne sløyfen her, 592 00:30:51,674 --> 00:30:53,465 og faktisk, i stedet for å sende e-poster alle 593 00:30:53,465 --> 00:30:56,577 av studentene som har karakteren er mindre enn 75, ville at du skulle slette dem, 594 00:30:56,577 --> 00:30:58,660 innenfor denne sløyfen du kunne kalle s.delete eksempel. 595 00:30:58,660 --> 00:31:04,180 596 00:31:04,180 --> 00:31:07,780 Og det aller siste du ønsker å gjøre, er når du oppretter en tilkobling, 597 00:31:07,780 --> 00:31:10,350 og du er ferdig med arbeidet, du ønsker å ringe db.close, 598 00:31:10,350 --> 00:31:13,190 hvor db er at databasen innvende at vi hadde før. 599 00:31:13,190 --> 00:31:18,290 Og du vil være sikker på at alt blir stengt ute av. 600 00:31:18,290 --> 00:31:18,790 >> Kjølig. 601 00:31:18,790 --> 00:31:22,410 Så nå har jeg et eksempel søknad. 602 00:31:22,410 --> 00:31:26,880 Jeg har liksom pre-laget alt bare slik at det ikke blir noen levende koding 603 00:31:26,880 --> 00:31:30,220 feil, men vi kan gå gjennom det og se hvordan du ville sette Flask 604 00:31:30,220 --> 00:31:33,685 og PeeWee sammen, og lage en enkel app. 605 00:31:33,685 --> 00:31:38,680 Jeg kaller det CS50 rant, og det er liksom en enkel blogg plattform. 606 00:31:38,680 --> 00:31:41,150 >> Så, først, skal jeg kjøre den og viser hvordan det ser ut, 607 00:31:41,150 --> 00:31:42,890 og så kan vi se mer inn i koden. 608 00:31:42,890 --> 00:32:00,470 609 00:32:00,470 --> 00:32:02,830 Ok, så la oss bare kjøre denne. 610 00:32:02,830 --> 00:32:14,040 611 00:32:14,040 --> 00:32:17,250 Cool, jeg skal gjøre dette litt mindre. 612 00:32:17,250 --> 00:32:20,000 Det er ikke veldig pen, bare fordi Jeg gjorde ikke gjøre mye av CSS, 613 00:32:20,000 --> 00:32:23,255 men hva den gjør er, det har denne databasen av blogginnlegg, 614 00:32:23,255 --> 00:32:25,630 og den går gjennom alle dem, og det vil vise dem 615 00:32:25,630 --> 00:32:28,170 på siden i rekkefølgen av de nyeste. 616 00:32:28,170 --> 00:32:30,920 Og så dette er bare noen innlegg at jeg hadde lagret i databasen. 617 00:32:30,920 --> 00:32:35,680 >> Så hvis vi ønsker å skape en ny post, kan vi gå å legge et nytt innlegg, 618 00:32:35,680 --> 00:32:42,720 og vi kan gå inn i tittelen på post, så noe sånt, CS50 seminar. 619 00:32:42,720 --> 00:32:45,360 620 00:32:45,360 --> 00:32:46,735 Wow, virkelig nyter seminaret. 621 00:32:46,735 --> 00:32:51,070 622 00:32:51,070 --> 00:32:52,270 >> Kjølig. 623 00:32:52,270 --> 00:32:56,060 Deretter trykker du poster, og det vil omdirigere deg tilbake til hjemmesiden, 624 00:32:56,060 --> 00:33:00,039 og så vil du se at siste innlegg ble lagt. 625 00:33:00,039 --> 00:33:01,580 Og vi har fortsatt alle de som er der. 626 00:33:01,580 --> 00:33:08,080 Så nå, la oss gå gjennom alle de kode og se hvordan dette er implementert. 627 00:33:08,080 --> 00:33:11,995 >> Så, jeg tror det første som la oss ta en titt på, er faktisk modellene. 628 00:33:11,995 --> 00:33:14,120 Mye av tiden, når du designer noe, 629 00:33:14,120 --> 00:33:17,036 du ønsker å tenke først om hvordan du kommer til å representere dine data, 630 00:33:17,036 --> 00:33:22,915 og deretter utforme ting rundt det, slik at alt er fornuftig. 631 00:33:22,915 --> 00:33:25,290 Og det er faktisk slik jeg gjorde det da jeg var å gjøre dette, 632 00:33:25,290 --> 00:33:28,030 Jeg satte meg ned og tenkte: hva vil jeg i et innlegg. 633 00:33:28,030 --> 00:33:32,130 >> Så her har vi samme struktur at jeg var nevne tidligere, 634 00:33:32,130 --> 00:33:33,755 hvor vi gjør db = Sqldatabase ('posts.db'). 635 00:33:33,755 --> 00:33:37,840 636 00:33:37,840 --> 00:33:40,980 I virkeligheten, har du sannsynligvis ikke vil til hard-kode i ditt navn databaser. 637 00:33:40,980 --> 00:33:43,730 Det bør nok være en parameter som er lagret et sted, kanskje 638 00:33:43,730 --> 00:33:45,940 i en config-fil, men i et lite eksempel som dette, 639 00:33:45,940 --> 00:33:48,310 det er greit å vanskelig kode som i. 640 00:33:48,310 --> 00:33:53,510 >> Så nå har vi denne Post klassen, som arver fra grunnmodellen. 641 00:33:53,510 --> 00:33:56,930 Og det har, igjen, ID = PrimaryKeyField. 642 00:33:56,930 --> 00:34:02,250 Egentlig, hvis du ikke angir, hvis jeg faktisk ble kvitt dette, 643 00:34:02,250 --> 00:34:07,152 da PeeWee vi vil ta vare på automatisk skape at ID-feltet, 644 00:34:07,152 --> 00:34:09,360 og det vil automatisk gjøre det en PrimaryKey, noe 645 00:34:09,360 --> 00:34:12,485 Jeg tror det er veldig hyggelig, fordi vanligvis, det er noe du vil ha, 646 00:34:12,485 --> 00:34:16,239 men jeg liker å sette den i spesifikt, bare så jeg husker at det er der inne. 647 00:34:16,239 --> 00:34:19,480 Men hvis du ikke angir det, som vil være der automatisk. 648 00:34:19,480 --> 00:34:22,198 >> Så da har jeg en date som er en DateTimeField, og alle 649 00:34:22,198 --> 00:34:24,864 disse ulike feltene, hvis du se på peewee dokumentasjon, 650 00:34:24,864 --> 00:34:28,920 det vil gi deg en liste over de forskjellige typer felt som du kan bruke. 651 00:34:28,920 --> 00:34:34,440 For det meste, er det analogt til hva du vil se i SQL. 652 00:34:34,440 --> 00:34:37,699 Så det er en charfield, en VarCharFields, textfields, 653 00:34:37,699 --> 00:34:40,550 som er på veldig lenge tekster, som et blogginnlegg 654 00:34:40,550 --> 00:34:44,460 potensielt, DateTimeFields, DoubleFields, FloatFields, 655 00:34:44,460 --> 00:34:46,100 alle ting som det. 656 00:34:46,100 --> 00:34:51,570 >> Og du kan passere i andre argumenter til det, som jeg ikke har angitt her. 657 00:34:51,570 --> 00:34:55,719 Si for eksempel at du ikke ønsker å tillate to innlegg å ha samme tittel, 658 00:34:55,719 --> 00:34:59,672 du kan spesifisere noe som unikt = Sant, 659 00:34:59,672 --> 00:35:02,880 og det er bare en ekstra parameter til feltet at når det sammenstiller det ned 660 00:35:02,880 --> 00:35:06,865 inn i SQL, vil det angi at det må være unikt. 661 00:35:06,865 --> 00:35:09,740 Du kan også angi noe sånt ikke null, og alle de andre tingene 662 00:35:09,740 --> 00:35:11,750 du vanligvis gjør i SQL. 663 00:35:11,750 --> 00:35:16,020 Så dette er en ganske enkel modell som har datoen. 664 00:35:16,020 --> 00:35:19,460 Legg merke til her, innenfor DateTimeField, Jeg spesifisert hva standard er. 665 00:35:19,460 --> 00:35:22,560 Jeg anga at det skal være datetime.datetime.now, 666 00:35:22,560 --> 00:35:24,920 på grunn av måten dette blir evaluert, 667 00:35:24,920 --> 00:35:28,750 det faktisk evaluerer den datetime.now når 668 00:35:28,750 --> 00:35:32,110 det blir satt inn i databasen. 669 00:35:32,110 --> 00:35:34,760 >> Jeg tror det, vil jeg ha å dobbeltsjekke dette, 670 00:35:34,760 --> 00:35:38,222 men hvis du gjorde noe sånt som dette, så det ville faktisk vurdere det en gang, 671 00:35:38,222 --> 00:35:40,180 og deretter Datetime vil alltid være den samme. 672 00:35:40,180 --> 00:35:44,240 Så, bare hvis du gjør noe med datetimes, dobbeltsjekke 673 00:35:44,240 --> 00:35:47,080 at det å vurdere når faktisk blir satt inn, ellers 674 00:35:47,080 --> 00:35:48,780 kan du bli forvirret. 675 00:35:48,780 --> 00:35:51,221 >> Tittelen er bare en Charfield, der det 676 00:35:51,221 --> 00:35:53,970 er flere argumenter du kan passere i spesifisere nøyaktig hvor lenge du 677 00:35:53,970 --> 00:35:56,170 vil den skal være, men her, det gjorde egentlig ingen rolle. 678 00:35:56,170 --> 00:35:58,687 Og tekst skal være teksten i hele innlegget, 679 00:35:58,687 --> 00:36:01,020 og som kommer til å være en Textfield bare fordi du vil 680 00:36:01,020 --> 00:36:03,370 å tillate det å være en ganske lang streng. 681 00:36:03,370 --> 00:36:05,970 >> Så har vi dette Meta underklasse som bare 682 00:36:05,970 --> 00:36:11,250 presiserer at vi ønsker databasen der dette er faktisk åpnet opp i 683 00:36:11,250 --> 00:36:14,267 å være den db objektet som vi har her. 684 00:36:14,267 --> 00:36:16,350 Og siste ting vi har her, er nettopp denne funksjonen 685 00:36:16,350 --> 00:36:18,120 at vi kommer til å bruke fra vår hoved app 686 00:36:18,120 --> 00:36:23,970 initialisere databasen for å koble til den, og deretter å skape den Post tabellen. 687 00:36:23,970 --> 00:36:26,880 >> Nå, la oss se på de viktigste app selv. 688 00:36:26,880 --> 00:36:30,800 Så dette er ganske litt lenger enn de som 689 00:36:30,800 --> 00:36:34,840 som vi har sett før, men forhåpentligvis ikke så ille. 690 00:36:34,840 --> 00:36:37,140 Så, la meg utvide dette ut. 691 00:36:37,140 --> 00:36:38,370 Greit. 692 00:36:38,370 --> 00:36:42,070 >> Så, merke og toppen Jeg importerte en hel haug med andre ting 693 00:36:42,070 --> 00:36:44,129 fra Flask at vi ikke har virkelig sett før. 694 00:36:44,129 --> 00:36:46,670 Og forhåpentligvis kan vi gå gjennom hver enkelt av disse en etter en 695 00:36:46,670 --> 00:36:49,420 og snakke litt mer om dem, sortert etter eksempel. 696 00:36:49,420 --> 00:36:51,380 Så har vi den Flask, og render_template, 697 00:36:51,380 --> 00:36:54,370 som vi har sett før, denne forespørselen objekt, 698 00:36:54,370 --> 00:37:00,400 som vil komme opp når vi ser på hvordan skjemaet som jeg viste faktisk 699 00:37:00,400 --> 00:37:01,170 fungerer. 700 00:37:01,170 --> 00:37:04,850 Omdirigere, som lar deg omdirigere tilbake fra Create New Post 701 00:37:04,850 --> 00:37:11,710 tilbake til den opprinnelige hjemmesiden, og deretter URL, som er noe som lar deg 702 00:37:11,710 --> 00:37:15,550 finne ut hvor på nettside en bestemt side er. 703 00:37:15,550 --> 00:37:17,810 >> Så da, neste Det jeg gjør, er jeg import 704 00:37:17,810 --> 00:37:21,550 all informasjonen fra modellene filer som vi bare ser på. 705 00:37:21,550 --> 00:37:23,140 Og, ja. 706 00:37:23,140 --> 00:37:28,720 >> Så, noe annet nytt som kommer opp når du arbeider med, 707 00:37:28,720 --> 00:37:31,850 spesielt databaser, er at du kan angi 708 00:37:31,850 --> 00:37:35,110 en funksjon som blir kalt før hver forespørsel, og funksjon som får 709 00:37:35,110 --> 00:37:39,690 kalt etter hver forespørsel, ved hjelp av denne funksjon dekoratør app.before forespørsel. 710 00:37:39,690 --> 00:37:42,324 >> Og så dette vil bli henrettet hvor er denne funksjonen. 711 00:37:42,324 --> 00:37:44,240 Dette trenger ikke å være kalt før anmodning, 712 00:37:44,240 --> 00:37:46,281 men vanligvis det er noe fornuftig å kalle det. 713 00:37:46,281 --> 00:37:48,580 714 00:37:48,580 --> 00:37:51,650 Du kan spesifisere hva funksjonen du ønsker å bli kalt det, 715 00:37:51,650 --> 00:37:56,330 så jeg spesifiserte dette initialize_db funksjon som vi hadde tilbake i modellene 716 00:37:56,330 --> 00:38:02,390 fil, så før hver forespørsel, du ønsker å koble til databasen. 717 00:38:02,390 --> 00:38:04,560 >> Det er to forskjellige måter du kan gjøre dette. 718 00:38:04,560 --> 00:38:10,830 Du kan gjøreapp., Jeg tror det er after_request. 719 00:38:10,830 --> 00:38:13,800 Og forskjellen mellom after_request og teardown_request, 720 00:38:13,800 --> 00:38:17,590 er at after_request vil bare skje dersom anmodningen faktisk var gyldig. 721 00:38:17,590 --> 00:38:20,440 Og så, bare hvis forespørselen var vellykket, 722 00:38:20,440 --> 00:38:22,490 hvis noe gikk galt, men teardown_request 723 00:38:22,490 --> 00:38:26,300 skjer i tilfellet av en vellykket anmodning, eller i tilfelle av en feil. 724 00:38:26,300 --> 00:38:28,252 >> Så, vanligvis, vil du å bruke teardown_request, 725 00:38:28,252 --> 00:38:30,460 med mindre du ønsker å gjøre noe, spesielt annerledes 726 00:38:30,460 --> 00:38:31,470 i tilfelle av en feil. 727 00:38:31,470 --> 00:38:35,122 Men bare for lukking av database, om det lykkes eller hvis det mislykkes, 728 00:38:35,122 --> 00:38:37,080 vi gjør du vil koble fra databasen. 729 00:38:37,080 --> 00:38:41,240 Så det heter, db.close på db objektet. 730 00:38:41,240 --> 00:38:43,740 >> Legg merke til at teardown_request tar i et unntak. 731 00:38:43,740 --> 00:38:46,781 Så du kan sjekke om det faktisk var en feil da det ble stenge ned, 732 00:38:46,781 --> 00:38:49,390 men her, forhåpentligvis, det er ikke en hel masse feil, 733 00:38:49,390 --> 00:38:52,720 så vi er bare slags ignorere det. 734 00:38:52,720 --> 00:38:55,990 >> Okay, og resten av det er ikke så ille. 735 00:38:55,990 --> 00:39:02,240 Så, når vi går til hjemmesiden, vi gjengitt denne home.html Mal 736 00:39:02,240 --> 00:39:03,490 som vil åpne opp. 737 00:39:03,490 --> 00:39:06,240 Passet er i post lik, og hva denne 738 00:39:06,240 --> 00:39:10,260 gjør det, husker vi har dette innlegget modell, så vi velger alle innleggene, 739 00:39:10,260 --> 00:39:13,890 og deretter en annen ting du kan gjøre, du kan spesifisere WHERE-leddet, 740 00:39:13,890 --> 00:39:16,910 du kan spesifisere en bestille ved, og så tar vi 741 00:39:16,910 --> 00:39:18,820 alle innleggene som få valgt, og 742 00:39:18,820 --> 00:39:22,590 vi bestille dem ved post.date.descending. 743 00:39:22,590 --> 00:39:25,030 Og som vil angi når de faktisk kommer ut, 744 00:39:25,030 --> 00:39:29,250 det nyeste vil være svært første. 745 00:39:29,250 --> 00:39:31,420 >> Og så passerer vi det inn den home.html mal, 746 00:39:31,420 --> 00:39:34,240 så la oss faktisk åpne opp som mal virkelig rask, 747 00:39:34,240 --> 00:39:36,760 og ta en titt på hvordan det fungerer. 748 00:39:36,760 --> 00:39:42,130 Og dette er ikke stor HTML, men forhåpentligvis kan vi fokusere på Python. 749 00:39:42,130 --> 00:39:46,960 >> Så det er en link til Legg til ny Post, og så dette angir ruten 750 00:39:46,960 --> 00:39:51,580 innenfor Flask at vi definere, som er rett her. 751 00:39:51,580 --> 00:39:56,310 Dette er den nye post rute, og vi presisere at her oppe. 752 00:39:56,310 --> 00:40:00,450 Og så det er en kobling som vil da gå I tillegg rute innenfor kolbe serveren. 753 00:40:00,450 --> 00:40:03,820 >> Jo mer interessante ting er dette for loop her. 754 00:40:03,820 --> 00:40:07,685 Så vi presisere at dette post parameter som 755 00:40:07,685 --> 00:40:09,560 ble ledet inn i render_template funksjon, 756 00:40:09,560 --> 00:40:13,550 for hvert innlegg i stillingens objekt som blir sendt inn. 757 00:40:13,550 --> 00:40:16,600 Vi ønsker å skrive ut innlegget tittelen, i H1, 758 00:40:16,600 --> 00:40:21,930 og deretter under, vi ønsker å skrive ut innlegget tekst i et avsnitt. 759 00:40:21,930 --> 00:40:25,710 >> Og her, kan vi faktisk kalle en Python-funksjon, 760 00:40:25,710 --> 00:40:35,130 slik at vi kan ringe strftime, ST-RF-tid, og du kan passere i formatstrengen 761 00:40:35,130 --> 00:40:37,064 som du ønsker å skrive ut dataene ut i. 762 00:40:37,064 --> 00:40:39,980 Så det er ganske fint at du kan faktisk kalle dette Python funksjonen 763 00:40:39,980 --> 00:40:41,090 innenfra her. 764 00:40:41,090 --> 00:40:44,370 Du trenger ikke å gjøre formateringen på kontrolleren side, fordi egentlig, 765 00:40:44,370 --> 00:40:47,770 formatering av dato er noe som du ønsker å håndtere innenfor View. 766 00:40:47,770 --> 00:40:51,480 >> Og alle disse prosent ting er ikke super viktig. 767 00:40:51,480 --> 00:40:55,270 Hvis du ser opp dokumentasjonen for strftime funksjon i Python, 768 00:40:55,270 --> 00:40:57,040 det spesifiserer alle disse ting, men det er 769 00:40:57,040 --> 00:40:59,190 hvordan, når vi var ute på hjemmesiden her, 770 00:40:59,190 --> 00:41:04,440 det formaterer denne med en fin dato, og det angir AM eller PM, 771 00:41:04,440 --> 00:41:09,410 men vanligvis, hvis vi har ikke dette her, 772 00:41:09,410 --> 00:41:14,024 du vil sannsynligvis få noen søppel dato som ikke ser veldig bra. 773 00:41:14,024 --> 00:41:15,940 Og da vi spesifisere post.text, og jeg kunne 774 00:41:15,940 --> 00:41:19,460 har satt et par linjeskift her, bare 775 00:41:19,460 --> 00:41:21,820 å sette noen mellomrom mellom hvert innlegg. 776 00:41:21,820 --> 00:41:26,270 >> Så tror jeg det viktigste ting i dette eksemplet 777 00:41:26,270 --> 00:41:28,697 er at du kan bruke dette for loop. 778 00:41:28,697 --> 00:41:30,780 Og dette er analog til ting du kan gjøre i PHP. 779 00:41:30,780 --> 00:41:32,905 Du kan iterere gjennom, alt blir vedtatt i, 780 00:41:32,905 --> 00:41:36,719 og så, i stedet for å måtte gjøre kopier / lim inn, kopier / lim inn all HTML, 781 00:41:36,719 --> 00:41:40,010 du må bare skrive det en gang, og deretter du kan iterere over alle innleggene. 782 00:41:40,010 --> 00:41:41,510 >> Og dette er noe vanlig at du vil 783 00:41:41,510 --> 00:41:44,510 å gjøre, når du har mye data, er det for alt i dine data, 784 00:41:44,510 --> 00:41:48,370 du ønsker å gjøre en lignende ting. 785 00:41:48,370 --> 00:41:51,690 Og så, bare husk at når du ønsker å skrive ut noe eksplisitt 786 00:41:51,690 --> 00:41:54,780 i HTML, bruker du de doble bukseseler her, 787 00:41:54,780 --> 00:41:57,820 men så når du ønsker å spesifisere litt informasjon om en tilstand, 788 00:41:57,820 --> 00:42:02,430 eller om en for loop, du bruke prosent braketten. 789 00:42:02,430 --> 00:42:08,730 >> Så, gå tilbake til Python kode, slik som forklarer 790 00:42:08,730 --> 00:42:12,242 hva som skjer i hoved rute, når vi drar dit, 791 00:42:12,242 --> 00:42:14,450 det bare viser alle innlegg, men så er spørsmålet 792 00:42:14,450 --> 00:42:17,440 er, hvordan vi faktisk får innlegg i databasen, som 793 00:42:17,440 --> 00:42:18,970 er litt mer interessant. 794 00:42:18,970 --> 00:42:23,960 >> Så, når du klikker på Ny Post link, som vi så her, 795 00:42:23,960 --> 00:42:26,000 det sender deg til dette skjemaet. 796 00:42:26,000 --> 00:42:29,580 Og det er bare en enkel samtale til render_template funksjon, som deretter 797 00:42:29,580 --> 00:42:32,110 passerer i den nye post i HTML-skjemaet. 798 00:42:32,110 --> 00:42:36,212 Så la oss ta en titt på det. 799 00:42:36,212 --> 00:42:37,420 Så dette er ganske enkel. 800 00:42:37,420 --> 00:42:45,110 Den har en enkel HTML-skjema, som vil se litt kjent, 801 00:42:45,110 --> 00:42:47,380 basert på skjemaene i CS50 Finance. 802 00:42:47,380 --> 00:42:49,940 Og så, vi oppgir her, handlingen. 803 00:42:49,940 --> 00:42:52,435 Og her, hvis du jobber med PHP, normalt, det 804 00:42:52,435 --> 00:42:55,930 ville være noe sånt, create.PHP, men her 805 00:42:55,930 --> 00:42:59,960 vi faktisk angi en rute innenfor Flask server. 806 00:42:59,960 --> 00:43:02,520 Og så, denne rute korresponderer til å opprette rute 807 00:43:02,520 --> 00:43:05,680 som vi har her, som vi vil gå inn i et sekund. 808 00:43:05,680 --> 00:43:07,630 >> Og så oppgir vi at det er en post-metoden, 809 00:43:07,630 --> 00:43:09,820 fordi vi ønsker å sende denne formen data, og vanligvis 810 00:43:09,820 --> 00:43:12,945 når du sender data fra et skjema, kan det være lurt å bruke en post forespørsel 811 00:43:12,945 --> 00:43:15,760 bare så du ikke ender opp med denne store, uhåndterlige URL. 812 00:43:15,760 --> 00:43:18,970 Men du kan også bruke en GET forespørsel, og passerer det på med variabel ruting, 813 00:43:18,970 --> 00:43:21,170 men for skjemaer, er det fint i et innlegg forespørsel her. 814 00:43:21,170 --> 00:43:24,620 Og så da, akkurat som deg ville gjøre med HTML og PHP, 815 00:43:24,620 --> 00:43:28,420 du kan angi disse tekst innganger, og du kan angi navnet på dem, 816 00:43:28,420 --> 00:43:33,490 og det er navnet som vil bli passert inn forespørselen objekt i Flask. 817 00:43:33,490 --> 00:43:36,960 >> Og da har vi en Send knappen som sier Post. 818 00:43:36,960 --> 00:43:40,760 Og her, er Post navnet på knapp, fordi det er et blogginnlegg, 819 00:43:40,760 --> 00:43:42,700 men her er innlegget forespørselen metoden. 820 00:43:42,700 --> 00:43:47,060 Så de er det samme ordet men faktisk irrelevant. 821 00:43:47,060 --> 00:43:48,460 Yeah 822 00:43:48,460 --> 00:43:54,800 >> Gå tilbake til Python-kode, når vi kalte skape metoden, 823 00:43:54,800 --> 00:43:57,702 merke til her at du kan faktisk spesifiserer i rute 824 00:43:57,702 --> 00:44:00,650 forespørselen metoder at du vil godta, 825 00:44:00,650 --> 00:44:04,770 og så her, jeg presisere at jeg bare vil godta en Post-metoden. 826 00:44:04,770 --> 00:44:09,800 Så, hvis jeg faktisk prøve å besøke siden direkte, som ved hjelp av en GET-anmodning 827 00:44:09,800 --> 00:44:11,700 det vil si meg "Metode ikke tillatt." 828 00:44:11,700 --> 00:44:15,840 >> Og så har du sider, liksom som dette skape siden som jeg er bare 829 00:44:15,840 --> 00:44:20,192 virkelig bruker som en måte for skjemaet for å bli sendt, 830 00:44:20,192 --> 00:44:22,900 kan du oppgi at du ikke vil at folk skal være i stand til å gå dit 831 00:44:22,900 --> 00:44:25,650 direkte via en GET-forespørsel, eller hvis du ikke vil, 832 00:44:25,650 --> 00:44:28,580 for noen grunn, en Post forespørsel du kan bare spesifisere komme hit, 833 00:44:28,580 --> 00:44:32,720 men i dette eksemplet har vi bare Vil Post anmodning om å gå ut. 834 00:44:32,720 --> 00:44:38,700 >> Så, når create_post kalles, når vi besøker det via Post forespørsel, 835 00:44:38,700 --> 00:44:43,600 når du går til en bestemt rute, det er denne forespørselen objekt, 836 00:44:43,600 --> 00:44:46,640 og vi måtte importere forespørsler på toppen, 837 00:44:46,640 --> 00:44:49,640 men det er denne forespørselen objekt som blir sendt inn, 838 00:44:49,640 --> 00:44:53,210 og du kan få tilgang til skjemadata, som automatisk vil bli fylt 839 00:44:53,210 --> 00:44:55,070 når du sender en forespørsel fra et skjema. 840 00:44:55,070 --> 00:44:56,990 >> Og så, hva jeg tror er virkelig kult, er 841 00:44:56,990 --> 00:45:02,840 at formen objekt å bli passert i, er bare en Python ordbok som 842 00:45:02,840 --> 00:45:10,560 inneholder, hvis du access-- så her, la meg trekke opp HTML ved siden av det, bare 843 00:45:10,560 --> 00:45:17,670 slik at du kan ha det som en referanse, ja, så 844 00:45:17,670 --> 00:45:21,060 navnene som vi spesifiserer her for de forskjellige feltene, så 845 00:45:21,060 --> 00:45:23,900 tittelen og teksten, vi så bare bruke de over her 846 00:45:23,900 --> 00:45:27,110 som indekser i skjemaet data. 847 00:45:27,110 --> 00:45:28,950 Så det er super praktisk. 848 00:45:28,950 --> 00:45:33,320 >> Så da vi kaller post.create, som vil skape og sette inn automatisk 849 00:45:33,320 --> 00:45:36,850 denne nye innlegg objekt inn i databasen. 850 00:45:36,850 --> 00:45:40,690 Og jeg tror dette skape funksjonen her er et kult eksempel på hvordan 851 00:45:40,690 --> 00:45:44,900 kraftig Flask er og arbeider med dette, fordi hvis du gjorde noe 852 00:45:44,900 --> 00:45:48,660 i PHP, må du kanskje gjør mye av validering, 853 00:45:48,660 --> 00:45:51,730 du må da etablere en database tilkobling, 854 00:45:51,730 --> 00:45:55,210 du må da kjøre SQL-spørring, 855 00:45:55,210 --> 00:45:59,550 men her er vi bare har denne fine post.create, som vi kan da bare 856 00:45:59,550 --> 00:46:01,520 få informasjonen ut av anmodningen objekt, 857 00:46:01,520 --> 00:46:05,370 og før den inn i en ny innlegg som vi skaper. 858 00:46:05,370 --> 00:46:07,850 >> Og så, den aller siste ting vi ønsker å gjøre, 859 00:46:07,850 --> 00:46:09,630 er å omdirigere brukeren tilbake til hjemmet. 860 00:46:09,630 --> 00:46:13,020 Og så bruker vi denne Flask omdirigere funksjon. 861 00:46:13,020 --> 00:46:17,770 Og noe som vi ikke hadde sett før, dette var URL funksjonen. 862 00:46:17,770 --> 00:46:21,970 Så URL for funksjonen lar du passerer i faktisk navnet 863 00:46:21,970 --> 00:46:26,090 av en funksjon i din Python-kode, i stedet for den spesielle rute 864 00:46:26,090 --> 00:46:26,720 at den er på. 865 00:46:26,720 --> 00:46:32,107 >> Så jeg kunne ha like lett omdirigert en bruker å kutte, 866 00:46:32,107 --> 00:46:37,050 som ville sende den hjem, men bruker URL for funksjonen er fin, 867 00:46:37,050 --> 00:46:39,990 fordi hvis du endrer sted hvor ting er, 868 00:46:39,990 --> 00:46:44,080 så la oss si at jeg endrer hjem for å være på / hjemme i stedet, 869 00:46:44,080 --> 00:46:47,040 Dette vil likevel deretter returnere / home, fordi faktisk går og ser opp 870 00:46:47,040 --> 00:46:50,770 navnet på funksjonen, og det vil gi deg tilbake URL for det. 871 00:46:50,770 --> 00:46:52,490 >> Så, liksom på antagelsen om at du er 872 00:46:52,490 --> 00:46:55,489 mer sannsynlig å endre hvor ting er, enn navnene på funksjonene. 873 00:46:55,489 --> 00:46:58,840 Du kan bruke dette virkelig fint URL for funksjon. 874 00:46:58,840 --> 00:47:02,470 Og én ting å være klar over det er litt vanskelig, 875 00:47:02,470 --> 00:47:05,750 er at du tror du kan like kaller omdirigere på nettadressen for, 876 00:47:05,750 --> 00:47:10,600 men faktisk alle rutene har å returnere noen form for tekst og HTML, 877 00:47:10,600 --> 00:47:14,360 slik at du faktisk nødt til å returnere redirect samtalen. 878 00:47:14,360 --> 00:47:18,379 Ellers vil du få noe ugyldig om ikke å returnere en streng, 879 00:47:18,379 --> 00:47:21,420 fordi alle disse må returnere HTML du faktisk ønsker å gjengi. 880 00:47:21,420 --> 00:47:26,980 >> Og så, når du ringer viderekoblingen, den omdirigerer deg til siden, 881 00:47:26,980 --> 00:47:30,270 men det faktisk returnerer HTML du trenger for å gjennomføre den viderekobling. 882 00:47:30,270 --> 00:47:34,430 883 00:47:34,430 --> 00:47:37,110 Gå tilbake til hjemmesiden. 884 00:47:37,110 --> 00:47:39,200 Så vi har disse to forskjellige visninger. 885 00:47:39,200 --> 00:47:40,132 Vi har den hjemme utsikt. 886 00:47:40,132 --> 00:47:41,590 Eller, jeg tror jeg skal si maler. 887 00:47:41,590 --> 00:47:44,190 Vi har disse to maler, hjemmet mal som 888 00:47:44,190 --> 00:47:48,500 viser alle våre innlegg, og så har vi denne annonsen ting, 889 00:47:48,500 --> 00:47:52,970 og når du klikker på innlegget, det går til en ny rute innenfor kolben 890 00:47:52,970 --> 00:47:55,920 men at ruten ikke nødvendigvis har en tilsvarende mal. 891 00:47:55,920 --> 00:47:59,290 892 00:47:59,290 --> 00:48:01,560 Du trenger ikke å se noe, men du kan fortsatt 893 00:48:01,560 --> 00:48:04,090 har dette arbeidet kommer bak kulissene. 894 00:48:04,090 --> 00:48:07,450 Og så blir omdirigert tilbake til hjemmesiden. 895 00:48:07,450 --> 00:48:12,230 Og definitivt, det er lett å jobbe i noen finere CSS inn i malen 896 00:48:12,230 --> 00:48:15,580 og gjør dette ser mye bedre, men alle hovedlogikken 897 00:48:15,580 --> 00:48:18,590 er det i Python. 898 00:48:18,590 --> 00:48:20,020 >> Eventuelle spørsmål om dette eksemplet? 899 00:48:20,020 --> 00:48:22,760 Jeg vet det er mange forskjellige ting som skjer der, 900 00:48:22,760 --> 00:48:25,341 mange ting vi ikke hadde sett før, men liker noe. 901 00:48:25,341 --> 00:48:25,840 Yeah. 902 00:48:25,840 --> 00:48:28,346 >> PUBLIKUM 1: du trenger å gjøre noenting spesielt å skrubbe data som er 903 00:48:28,346 --> 00:48:29,600 kommer inn fra skjemaet? 904 00:48:29,600 --> 00:48:31,109 Jeg la merke til at du bare sa "skape" 905 00:48:31,109 --> 00:48:33,900 EZRA zigmond: Ja, så det er faktisk, det er et veldig godt poeng. 906 00:48:33,900 --> 00:48:36,350 Så spørsmålet var, gjør du trenger å kontrollere og sikre at 907 00:48:36,350 --> 00:48:39,190 at dataene er gyldige, og gjøre noen form for skrubbing 908 00:48:39,190 --> 00:48:41,840 å sørge for at det er gyldig, fordi som du kan se her, 909 00:48:41,840 --> 00:48:42,660 Jeg gjør ikke det. 910 00:48:42,660 --> 00:48:48,140 Så la oss se hva som skjer hvis jeg legger ut noe blankt. 911 00:48:48,140 --> 00:48:51,190 Så vil det faktisk bare lage en blank post og fyll i Datetime. 912 00:48:51,190 --> 00:48:55,990 >> Så i virkeligheten, ville du sannsynligvis ønsker å gjøre noe sånt, 913 00:48:55,990 --> 00:49:04,749 kanskje oppgi om tittelen er lik den tomme strengen, så ikke gjør dette. 914 00:49:04,749 --> 00:49:07,290 Eller bare gjøre det hvis tittelen er ikke lik den tomme strengen. 915 00:49:07,290 --> 00:49:10,330 Så det gjør faktisk ikke automatisk ta vare på det skrubbing 916 00:49:10,330 --> 00:49:12,820 for deg, slik at du fortsatt trenger å gjøre det. 917 00:49:12,820 --> 00:49:14,330 Ja, godt spørsmål. 918 00:49:14,330 --> 00:49:18,497 >> PUBLIKUM 2: Betyr det skrubb for oppfølgeren injeksjon? 919 00:49:18,497 --> 00:49:19,890 Vet du? 920 00:49:19,890 --> 00:49:22,830 >> EZRA zigmond: Forhåpentligvis PeeWee gjør det. 921 00:49:22,830 --> 00:49:25,830 Jeg tror det vil sikkert være en ganske dårlig biblioteket hvis det ikke gjorde det. 922 00:49:25,830 --> 00:49:29,511 923 00:49:29,511 --> 00:49:32,690 Jeg vet ikke nøyaktig. 924 00:49:32,690 --> 00:49:34,820 Jeg måtte se på spørring at det genereres. 925 00:49:34,820 --> 00:49:38,980 Jeg tror at hvis jeg skrev i en blogginnlegg som slags så 926 00:49:38,980 --> 00:49:46,370 som en SQL-injeksjon angrep, noe sånt som dette, hvis dette 927 00:49:46,370 --> 00:49:49,370 er som et passordfelt eller noe, du kan gjøre noe som dette. 928 00:49:49,370 --> 00:49:53,410 >> Jeg tror det vil fortsatt får bokstavelig talt lagt ut, 929 00:49:53,410 --> 00:49:59,200 men jeg tror at PeeWee gjør noen form for skrubbing av data 930 00:49:59,200 --> 00:50:01,680 før det faktisk utfører den. 931 00:50:01,680 --> 00:50:04,510 >> PUBLIKUM 1: At tekstfeltet er designet for å ta ren tekst, ikke sant? 932 00:50:04,510 --> 00:50:05,710 >> EZRA zigmond: Ja, det er det. 933 00:50:05,710 --> 00:50:06,465 Yeah. 934 00:50:06,465 --> 00:50:09,590 Så jeg tror at alle, så dette er riktig atferd, vil det gjøre det, 935 00:50:09,590 --> 00:50:12,170 men jeg tror at peewee forhåpentligvis gjør gjøre 936 00:50:12,170 --> 00:50:13,780 noen form for beskyttelse på sin ende. 937 00:50:13,780 --> 00:50:16,090 Og hvis du ønsket å dobbeltsjekke at det 938 00:50:16,090 --> 00:50:19,530 finnes måter når du genererer en spørring. 939 00:50:19,530 --> 00:50:22,622 slik at du ikke trenger å kjøre den direkte. 940 00:50:22,622 --> 00:50:24,330 Jeg måtte ta en se på dokumentasjon, 941 00:50:24,330 --> 00:50:27,930 men du kan faktisk vise SQL at det genererer, 942 00:50:27,930 --> 00:50:30,840 og ta en titt på det, og gjøre sikker på at det er escaping ting. 943 00:50:30,840 --> 00:50:33,700 >> En annen grunn til at du kanskje ønsker å se på SQL 944 00:50:33,700 --> 00:50:37,920 at PeeWee sender ut, er hvis Ting ser ut til å gå veldig sakte, 945 00:50:37,920 --> 00:50:41,090 du kan ta en titt og se hvordan det er faktisk gjør, fordi det er noen ganger 946 00:50:41,090 --> 00:50:44,670 lett å tilfeldigvis legge i, slik du skriver det, 947 00:50:44,670 --> 00:50:47,880 du kan ved et uhell ha det Velg hele databasen først, 948 00:50:47,880 --> 00:50:50,230 og deretter gjøre en slags operasjon på at når du virkelig 949 00:50:50,230 --> 00:50:51,320 ment for å velge et delsett. 950 00:50:51,320 --> 00:50:53,560 >> Og så, hvis ting ikke er ganske går rett, 951 00:50:53,560 --> 00:50:57,300 det er godt å ta en titt på forespørsel som faktisk får generert. 952 00:50:57,300 --> 00:50:57,800 Yeah. 953 00:50:57,800 --> 00:51:02,100 >> PUBLIKUM 2: Når du først startet, du putter i havnen som 5000. 954 00:51:02,100 --> 00:51:02,904 >> EZRA zigmond: Yeah. 955 00:51:02,904 --> 00:51:06,070 PUBLIKUM 2: Er standard med peewee, eller er det noe du kan endre? 956 00:51:06,070 --> 00:51:10,870 EZRA zigmond: Ja, så det port er standard med Flask. 957 00:51:10,870 --> 00:51:13,061 Hvis du kjører den uten spesifisere noe, 958 00:51:13,061 --> 00:51:14,310 vil den automatisk gjøre det. 959 00:51:14,310 --> 00:51:16,060 Jeg tror jeg ville ha å dobbeltsjekke dette, 960 00:51:16,060 --> 00:51:19,130 men du kan angi at i app.run, Jeg tror du kan gjøre noe sånt, 961 00:51:19,130 --> 00:51:19,629 port = 8080. 962 00:51:19,629 --> 00:51:22,375 963 00:51:22,375 --> 00:51:23,750 La oss gi den en prøve virkelig rask. 964 00:51:23,750 --> 00:51:29,100 965 00:51:29,100 --> 00:51:32,230 Ja, så kan du bare angi port = 8080, og det vil kjøre det der, 966 00:51:32,230 --> 00:51:36,130 som jeg tror, ​​hvis du ønsket å kjøre den på IDE, jeg har ikke prøvd dette ut, 967 00:51:36,130 --> 00:51:38,527 men jeg tror at hvis du kjørte den på port 8080, 968 00:51:38,527 --> 00:51:40,360 du vil nok kunne for å få tilgang til serveren, 969 00:51:40,360 --> 00:51:41,870 akkurat som om du var for nettstedet. 970 00:51:41,870 --> 00:51:44,390 >> Ja, men det er lett å endre det hvis du 971 00:51:44,390 --> 00:51:48,540 har noen liksom som port-forwarding ting som du trenger å gjøre. 972 00:51:48,540 --> 00:51:50,410 >> Eventuelle andre spørsmål? 973 00:51:50,410 --> 00:51:50,916 Yeah? 974 00:51:50,916 --> 00:51:53,416 PUBLIKUM 1: Så, jeg så i ditt modeller som, som du nevnte, 975 00:51:53,416 --> 00:51:55,647 du må spesifisere database for hvert objekt. 976 00:51:55,647 --> 00:51:58,105 Du vet gjør, gjør som gjør det veldig enkelt hvis du 977 00:51:58,105 --> 00:52:03,210 har massevis av SQLite databaser som du ønsker å bruke for en enkelt web app, 978 00:52:03,210 --> 00:52:07,210 at du bare kan angi en haug av forskjellige dem i din modell? 979 00:52:07,210 --> 00:52:11,620 >> EZRA zigmond: Ja, la meg åpner det opp virkelig rask. 980 00:52:11,620 --> 00:52:17,570 Så, du sier, hvis du vil ha en haug med forskjellig noe, kanskje 981 00:52:17,570 --> 00:52:22,670 liker og studentene, for noen Derfor noe sånt? 982 00:52:22,670 --> 00:52:26,870 Ja, så jeg tror at du fortsatt, hver modell 983 00:52:26,870 --> 00:52:30,652 må fremdeles ha bare en database tildelt den, 984 00:52:30,652 --> 00:52:32,610 men hvis du ønsket å ha ulike modeller som 985 00:52:32,610 --> 00:52:35,818 har forskjellige databaseobjekter tilordnet til det, kan du definitivt gjøre det. 986 00:52:35,818 --> 00:52:43,070 Så, hvis jeg opprettet en ny, noe sånt som dette, 987 00:52:43,070 --> 00:52:47,000 og nå dette er en student som ser merkelig ut som et blogginnlegg, 988 00:52:47,000 --> 00:52:49,390 Jeg kunne spesifisere at database er lik db_2 her. 989 00:52:49,390 --> 00:52:51,390 Så jeg tror det er viktigste måten du kan gjøre det. 990 00:52:51,390 --> 00:52:54,560 991 00:52:54,560 --> 00:52:56,200 >> Kjølig. 992 00:52:56,200 --> 00:52:58,410 Eventuelle andre spørsmål? 993 00:52:58,410 --> 00:53:02,170 >> Så bare for å gjøre ferdig en liten bit, her er noen ressurser, 994 00:53:02,170 --> 00:53:06,030 og disse lysbildene vil bli lagt ut på nettet slik at du faktisk kan komme til disse koblingene. 995 00:53:06,030 --> 00:53:08,500 De beste ressursene er virkelig dokumentasjonen for Flask 996 00:53:08,500 --> 00:53:09,930 og PeeWee seg. 997 00:53:09,930 --> 00:53:12,940 De er skrevet veldig bra, tror jeg. 998 00:53:12,940 --> 00:53:18,180 Så, er Flask hjemmeside her, og de har en quickstart tutorial som 999 00:53:18,180 --> 00:53:20,710 vil gå gjennom lignende ting til hva jeg gikk gjennom, 1000 00:53:20,710 --> 00:53:23,560 men hvis du vil ha noen form for anmeldelse av de tingene som jeg gikk over, 1001 00:53:23,560 --> 00:53:26,200 eller du trodde at jeg forklarte noe i en forvirrende måte, 1002 00:53:26,200 --> 00:53:28,390 de vil ha lignende eksempler der. 1003 00:53:28,390 --> 00:53:31,570 >> Peewee har dokumentasjon, og de har en quickstart tutorial 1004 00:53:31,570 --> 00:53:34,650 som går over de viktigste parametrene som du ønsker å bruke. 1005 00:53:34,650 --> 00:53:38,900 Så, det jeg snakket om med de unike, og angivelse mislighold, 1006 00:53:38,900 --> 00:53:42,710 de forskjellige slags felt som du kan bruke, de ville alle være der. 1007 00:53:42,710 --> 00:53:44,690 >> Også, hvis du har spørsmål om peewee, 1008 00:53:44,690 --> 00:53:47,530 og du legger dem på Stackoverflow, fyren som gjorde peewee faktisk 1009 00:53:47,530 --> 00:53:49,500 fortsetter og besvarer dem noen ganger. 1010 00:53:49,500 --> 00:53:53,200 Hvis du har et spørsmål, forhåpentligvis han vil være i stand til å svare på det, 1011 00:53:53,200 --> 00:53:54,867 fordi han skrev hele greia. 1012 00:53:54,867 --> 00:53:56,700 Jeg tror det er alt Jeg ønsket å dekke. 1013 00:53:56,700 --> 00:53:58,930 Takk for at du kom ut. 1014 00:53:58,930 --> 00:54:02,688