1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:03,227 [Musik spiller] 3 00:00:03,227 --> 00:00:04,705 4 00:00:04,705 --> 00:00:05,830 EZRA Zigmond: Hej, alle. 5 00:00:05,830 --> 00:00:08,020 Tak for at komme ud i dag. 6 00:00:08,020 --> 00:00:10,660 Dette seminar er "Python Web Apps med kolbe. " 7 00:00:10,660 --> 00:00:14,510 >> Så jeg har tænkt mig at tale en lille smule om, hvorfor 8 00:00:14,510 --> 00:00:17,400 du måske ønsker at bruge Flask til at gøre web apps med Python, i modsætning 9 00:00:17,400 --> 00:00:21,556 til nogle andre rammer derude, ligesom Django, som er den mest kendte. 10 00:00:21,556 --> 00:00:24,330 Undertitlen er "og peewee ", som er noget 11 00:00:24,330 --> 00:00:27,250 vi kommer til at tale om, hvordan at interagere med SQL-databaser. 12 00:00:27,250 --> 00:00:29,610 Det gør det virkelig rart. 13 00:00:29,610 --> 00:00:32,390 >> Så her er bare en hurtig gennemgang af, hvad jeg ønsker at gå over. 14 00:00:32,390 --> 00:00:35,520 Så først, kun et slide der kommer til at være quickstart, 15 00:00:35,520 --> 00:00:38,530 hvilket er, hvordan man får det hele oprettet på din computer. 16 00:00:38,530 --> 00:00:41,760 Jeg har tænkt mig at demonstrere dette på min lokale Mac-maskine, 17 00:00:41,760 --> 00:00:45,220 bare fordi det er her, jeg har gjort det før, jeg er mest tryg ved det, 18 00:00:45,220 --> 00:00:48,510 men dette er absolut muligt på CD50 IDE. 19 00:00:48,510 --> 00:00:52,050 >> Så efter det, jeg ønsker at indføre hvad Kolben, 20 00:00:52,050 --> 00:00:55,089 og overbevise dig, hvorfor du bør bruge det i første omgang. 21 00:00:55,089 --> 00:00:56,880 Derefter vil jeg give et hurtigt eksempel på, hvad du 22 00:00:56,880 --> 00:01:00,550 kan gøre i kolbe, et hurtigt eksempel af, hvad du kan gøre i peewee, 23 00:01:00,550 --> 00:01:05,010 og så vil jeg vise dig en mere komplet eksempel ansøgning 24 00:01:05,010 --> 00:01:07,520 at jeg sat sammen, at vi kan gå igennem sammen. 25 00:01:07,520 --> 00:01:10,040 >> Og derefter endelig i det sidste dias, jeg har 26 00:01:10,040 --> 00:01:12,730 nogle ressourcer, som du ser på online for mere information. 27 00:01:12,730 --> 00:01:15,560 Dette er ikke en komplet tutorial af hvordan man bruger Flask. 28 00:01:15,560 --> 00:01:18,140 Og jeg vil håbe at forlade lidt tid til spørgsmål. 29 00:01:18,140 --> 00:01:21,050 Enhver ser lokalt, lige lignende, råbe i midten 30 00:01:21,050 --> 00:01:22,340 hvis du har nogen spørgsmål. 31 00:01:22,340 --> 00:01:27,150 >> Så hurtig installation kram, hvis du ønsker at følge med, 32 00:01:27,150 --> 00:01:29,240 eller hvis du ønsker at få denne op på din egen maskine, 33 00:01:29,240 --> 00:01:32,440 Jeg har tænkt mig at bruge Python 2.7.10. 34 00:01:32,440 --> 00:01:35,860 Kolbe virker med Python 3, men jeg kan lide 35 00:01:35,860 --> 00:01:38,660 ved hjælp af Python 2, fordi der er nogle Python pakker, 36 00:01:38,660 --> 00:01:40,910 arbejder ikke med 3 endnu. 37 00:01:40,910 --> 00:01:44,800 Hvis du pip har installeret, som er en Python-pakke manager, 38 00:01:44,800 --> 00:01:48,190 Jeg tror, ​​at hvis din Python er større end eller lig med 2.7.9, 39 00:01:48,190 --> 00:01:52,220 du har det installeret allerede, det er super nemt at installere disse pakker. 40 00:01:52,220 --> 00:01:54,990 >> Du kan gøre pip installere Kolbe pip installere peewee, 41 00:01:54,990 --> 00:01:58,600 normalt du nødt til at køre sudo bare således at tilladelserne arbejde ud. 42 00:01:58,600 --> 00:02:01,080 Og hvis du bruger en super gammel version af Python, 43 00:02:01,080 --> 00:02:05,100 Jeg anbefaler at opdatere din Python, eller ved hjælp af EasyInstall at installere pip. 44 00:02:05,100 --> 00:02:09,180 45 00:02:09,180 --> 00:02:11,120 Så det næste spørgsmål er, hvad er Flask? 46 00:02:11,120 --> 00:02:13,280 Og jeg tror, ​​først et rimelige spørgsmål, jeg spekulerede 47 00:02:13,280 --> 00:02:15,585 i lang tid er, hvad er en web-app? 48 00:02:15,585 --> 00:02:17,960 Fordi det er et ord, som jeg Think er kastet rundt en masse 49 00:02:17,960 --> 00:02:19,240 at jeg ikke rigtig kender. 50 00:02:19,240 --> 00:02:22,340 Og jeg tror, ​​at det bedste eksempel på, hvad en web-app er, 51 00:02:22,340 --> 00:02:26,960 virkelig CS50 Finans, hvor det er egentlig ikke bare en hjemmeside, 52 00:02:26,960 --> 00:02:29,320 men det er noget, du kunne slags interagere med. 53 00:02:29,320 --> 00:02:31,736 Der er brugerkonti og alle mulige forskellige ting. 54 00:02:31,736 --> 00:02:35,010 Så hvor præcist du trække linje mellem, hvad der er en hjemmeside, 55 00:02:35,010 --> 00:02:38,780 og hvad er en web-app, er en slags vilkårlig, men jeg gætter ideen, 56 00:02:38,780 --> 00:02:42,110 det er noget mere end en hjemmeside og det er en nyttig anvendelse. 57 00:02:42,110 --> 00:02:46,081 >> Så Kolbe er en ramme for gør web apps ved hjælp af Python. 58 00:02:46,081 --> 00:02:48,330 Og forhåbentlig ved udgangen af dette, vil jeg overbevise dig 59 00:02:48,330 --> 00:02:52,210 at du faktisk kunne skrive noget ligesom CS50 Finans hjælp Python, som jeg 60 00:02:52,210 --> 00:02:53,950 som en masse bedre end PHP, personligt. 61 00:02:53,950 --> 00:02:57,320 >> Så Kolbe er, de kalder en microframework, hvorved, 62 00:02:57,320 --> 00:02:59,800 de betyder det meget enkle, men strækbar. 63 00:02:59,800 --> 00:03:02,980 Så det har lige hvad du har brug for, men hvis du ønsker flere funktioner, 64 00:03:02,980 --> 00:03:04,522 det er nemt at bringe dem i. 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 betyder, at det er kun for små projekter. 67 00:03:08,960 --> 00:03:12,590 Jeg har et link her, der siger at Obama brugte Flask i 2012 68 00:03:12,590 --> 00:03:14,410 for hans kampagne hjemmeside, som forhåbentlig, 69 00:03:14,410 --> 00:03:16,937 er noget af en påtegning. 70 00:03:16,937 --> 00:03:18,770 Men det, som jeg virkelig kan lide ved Flask 71 00:03:18,770 --> 00:03:22,401 er, at det ikke virkelig gøre nogen form for beslutninger for dig. 72 00:03:22,401 --> 00:03:24,150 Bare fordi vi er taler om web apps, 73 00:03:24,150 --> 00:03:26,940 Jeg er nødt til at sammenligne det med Ruby on Skinner og Django, som begge 74 00:03:26,940 --> 00:03:30,450 er store rammer, men de begge gøre antagelser 75 00:03:30,450 --> 00:03:33,600 om, hvordan du vil interagere med databaser, 76 00:03:33,600 --> 00:03:36,900 hvordan du vil præsentere din synspunkter, og de er helt sikkert 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 rekord-system, 79 00:03:41,490 --> 00:03:43,100 som er en virkelig rart måde at interagere med data, 80 00:03:43,100 --> 00:03:45,960 men hvis du ønsker at bruge Ruby on Skinner, du slags bundet til det. 81 00:03:45,960 --> 00:03:47,835 Men med kolbe, som jeg vil vise dig med peewee, 82 00:03:47,835 --> 00:03:49,830 du kan bruge uanset slags database, du ønsker, 83 00:03:49,830 --> 00:03:53,980 og du kan bare trække det i som en udvidelse i kolbe. 84 00:03:53,980 --> 00:03:56,350 >> Så det er derfor jeg virkelig Ligesom kolbe, er det, at det 85 00:03:56,350 --> 00:04:01,170 ikke gøre antagelser for dig baseret på ting, du ikke har brug for rigtig. 86 00:04:01,170 --> 00:04:04,440 >> Så hvorfor skal du bruge Flask? 87 00:04:04,440 --> 00:04:08,230 Fordelene er, det bare har virkelig de centrale funktioner 88 00:04:08,230 --> 00:04:09,420 bygget ind i det, du har brug for. 89 00:04:09,420 --> 00:04:11,980 Så behøver du ikke at bekymre dig om forstå en hel masse ting 90 00:04:11,980 --> 00:04:13,175 at du ikke virkelig har brug for. 91 00:04:13,175 --> 00:04:15,060 Du behøver ikke at skulle bekymre sig om at slukke funktioner 92 00:04:15,060 --> 00:04:16,620 at du ikke virkelig har brug for. 93 00:04:16,620 --> 00:04:21,082 >> Og som jeg nævnte, det er super nemt at tilføje i udvidelser af ting 94 00:04:21,082 --> 00:04:21,790 at du har brug for. 95 00:04:21,790 --> 00:04:24,700 Nogle af dem, har Flask deres egen støtte til det. 96 00:04:24,700 --> 00:04:28,230 Så der er noget, der hedder Flask admin, hvilket afspejler, at admin 97 00:04:28,230 --> 00:04:32,060 panel, der Django bestemmer, som giver dig en dejlig visuel måde 98 00:04:32,060 --> 00:04:33,405 til at administrere din hjemmeside. 99 00:04:33,405 --> 00:04:35,280 Men igen, hvis du er gør noget simpelt, 100 00:04:35,280 --> 00:04:39,550 du sandsynligvis ikke brug for en stor admin panel, så jeg tror, ​​det er super nice. 101 00:04:39,550 --> 00:04:45,940 Og ulemper er, at du har mindre effekt ud af kassen. 102 00:04:45,940 --> 00:04:49,660 Så når du først åbne op kolbe, og i din Python-program, 103 00:04:49,660 --> 00:04:53,150 du bare skrive fra Flask import *, eller hvad, 104 00:04:53,150 --> 00:04:55,957 behøver du ikke ligefrem få alle de funktioner, du måske ønsker. 105 00:04:55,957 --> 00:04:58,540 Og så er du nødt til mere eksplicit en liste over de funktioner, du ønsker. 106 00:04:58,540 --> 00:05:01,990 Så det er en ulempe, men jeg mener, at for at bygge lille web 107 00:05:01,990 --> 00:05:04,782 apps som jeg har tænkt mig at være at vise dig, det er egentlig ikke et problem. 108 00:05:04,782 --> 00:05:07,281 Og hvad det sidste, er skal sige, hvilket er en tastefejl, 109 00:05:07,281 --> 00:05:10,240 er, at der er mindre standardiserede konventioner for, hvordan man bruger Flask, 110 00:05:10,240 --> 00:05:12,400 bare fordi der ikke er så mange mennesker, der bruger det professionelt 111 00:05:12,400 --> 00:05:13,191 i forhold til Django. 112 00:05:13,191 --> 00:05:16,380 Så hvis du ser noget lignende, "hvordan gør jeg x" i Django, 113 00:05:16,380 --> 00:05:18,190 du skal nok finde det. 114 00:05:18,190 --> 00:05:20,260 >> Der er godt design mønstre, du kan bruge, 115 00:05:20,260 --> 00:05:22,660 men med kolbe, er det slags gå din egen måde, 116 00:05:22,660 --> 00:05:24,850 bare fordi det er en temmelig lille bibliotek. 117 00:05:24,850 --> 00:05:27,100 Så det er de ulemper, men jeg tror 118 00:05:27,100 --> 00:05:29,370 at det stadig er et godt bibliotek til at bruge. 119 00:05:29,370 --> 00:05:31,909 >> Så lad os bare hoppe direkte ind i kolbe. 120 00:05:31,909 --> 00:05:34,200 Dette er absolut ikke vil at være en komplet tutorial, 121 00:05:34,200 --> 00:05:37,480 men det er for at give dig en idé af hvordan man kan strukturere tingene, 122 00:05:37,480 --> 00:05:40,790 og så du føler dig tryg at gå off og kigge på dokumentationen 123 00:05:40,790 --> 00:05:42,570 og finde ud af mere. 124 00:05:42,570 --> 00:05:48,500 >> Så lad mig åbne op for en virkelig simpelt eksempel i starten, 125 00:05:48,500 --> 00:05:50,737 og vise dig, hvad der ser ud, og så vil vi 126 00:05:50,737 --> 00:05:52,070 bryde det ned en lille smule mere. 127 00:05:52,070 --> 00:05:56,160 >> Så dette her, lad mig få det kører. 128 00:05:56,160 --> 00:06:06,800 129 00:06:06,800 --> 00:06:09,750 Så har jeg nu min ansøgning kørende. 130 00:06:09,750 --> 00:06:15,910 Jeg har tænkt mig at åbne op Safari, og det kører på min lokale vært. 131 00:06:15,910 --> 00:06:19,360 Så jeg bare at gøre det 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å, lige nu, alt dette gør er, når du besøger hjemmesiden, 134 00:06:27,650 --> 00:06:31,490 det udskriver "Hello kolbe," som ikke er super nyttigt, 135 00:06:31,490 --> 00:06:34,630 men jeg synes det er cool, at i denne lille fil her, 136 00:06:34,630 --> 00:06:37,390 vi har en webserver kørende der udskriver ud af noget. 137 00:06:37,390 --> 00:06:40,500 Så lad os faktisk ser på koden til en anden, 138 00:06:40,500 --> 00:06:43,080 og bryde det ned en lille smule. 139 00:06:43,080 --> 00:06:45,260 Er størrelsen god for alle her? 140 00:06:45,260 --> 00:06:51,560 >> Så forhåbentlig er du noget trygge ved at bruge Python. 141 00:06:51,560 --> 00:06:55,820 Jeg antager, at vi kan se på Python og læse igennem den. 142 00:06:55,820 --> 00:06:59,290 Hvis du har spørgsmål om noget, kan jeg også gå over det. 143 00:06:59,290 --> 00:07:03,974 >> Så den første linje er fra kolbe, vi importerer, Kolbe med stort "F" 144 00:07:03,974 --> 00:07:06,140 som er en slags alle centrale funktioner, som du har brug for. 145 00:07:06,140 --> 00:07:08,890 Når du skriver en fil og bruge kolbe, 146 00:07:08,890 --> 00:07:12,120 du vil ønsker at importere det, bare fordi der har alle de vigtigste ting. 147 00:07:12,120 --> 00:07:15,400 Den næste ting, vi gør, er, at vi kalder denne funktion kolbe lige 148 00:07:15,400 --> 00:07:19,270 at skabe en app objekt, og du er altid vil ønsker at gøre det. 149 00:07:19,270 --> 00:07:25,960 >> Og så, hoppe ned til den bunden hurtigt, denne del her er, 150 00:07:25,960 --> 00:07:28,760 'if_name _ == "_ main_"', som er sortering af en Python konvention. 151 00:07:28,760 --> 00:07:32,750 Så dette vil kun udføre, hvis du køre denne fil direkte ved hjælp af Python. 152 00:07:32,750 --> 00:07:36,040 Derefter kalder vi app.run, som vil faktisk begynde app går. 153 00:07:36,040 --> 00:07:39,570 >> Så det er den vigtigste struktur, har du på nogen Flask ansøgning, 154 00:07:39,570 --> 00:07:48,550 er du vil have denne app = Flask (_NAME_) og derefter app.run. 155 00:07:48,550 --> 00:07:54,940 >> Så de to ting, som jeg har herinde, er det, vi kalder ruter. 156 00:07:54,940 --> 00:07:57,150 Så lad os tale om routing lidt mere. 157 00:07:57,150 --> 00:07:58,430 Jeg vil gå tilbage til dias. 158 00:07:58,430 --> 00:08:02,540 >> Så den mest fundamentale koncept i kolbe routing. 159 00:08:02,540 --> 00:08:06,750 Og det er den idé, at du tildele funktioner i Python 160 00:08:06,750 --> 00:08:11,280 til bestemte adresser på din webside. 161 00:08:11,280 --> 00:08:13,930 Så når du vil at oprette en ny rute, 162 00:08:13,930 --> 00:08:16,500 du bruger denne @ app.route funktion dekoratør. 163 00:08:16,500 --> 00:08:19,770 Så hvis du ikke er bekendt med funktion dekoratører i Python, 164 00:08:19,770 --> 00:08:24,160 Det er dette begreb kan du tage en funktion 165 00:08:24,160 --> 00:08:26,800 og omgive det med noget andet. 166 00:08:26,800 --> 00:08:30,140 >> Så virkelig, hvad denne dekoratør gør, er, at det tager funktionen under det, 167 00:08:30,140 --> 00:08:33,409 og det tilføjer mere information til det, men hvad Flask faktisk 168 00:08:33,409 --> 00:08:37,480 gør at ske, er ikke super afgørende, men hvad der er vigtigt, 169 00:08:37,480 --> 00:08:43,640 er, at før ruten, du sætte dette @ app.route, og derefter 170 00:08:43,640 --> 00:08:46,480 adressen på ruten, så skråstregen er, hvad vi 171 00:08:46,480 --> 00:08:48,360 så når vi bare åbner websiden. 172 00:08:48,360 --> 00:08:49,580 Så det er hjemmesiden. 173 00:08:49,580 --> 00:08:51,037 Det er bare den skråstreg rute. 174 00:08:51,037 --> 00:08:52,370 Og så har du denne funktion. 175 00:08:52,370 --> 00:08:54,453 Navnet på funktionen kan være hvad du vil. 176 00:08:54,453 --> 00:08:56,930 Det behøver ikke nødvendigvis har at gøre med ruten. 177 00:08:56,930 --> 00:08:59,440 Og så, hvad funktionens afkast, 178 00:08:59,440 --> 00:09:01,730 funktionen skal returnere en streng. 179 00:09:01,730 --> 00:09:03,740 Og at strengen kan indeholder HTML eller noget, 180 00:09:03,740 --> 00:09:06,920 og det er faktisk, hvad får returneret til din webbrowser som HTML, 181 00:09:06,920 --> 00:09:08,200 og det vil gøre det. 182 00:09:08,200 --> 00:09:12,030 >> Så det er den samme kode der var fra eksemplet 183 00:09:12,030 --> 00:09:16,430 at jeg bare løb, så når vi besøger skråstreg, den kalder en Hello World funktion, som 184 00:09:16,430 --> 00:09:20,470 bare returnerer en streng, Hej kolbe, og der bliver trykt på skærmen. 185 00:09:20,470 --> 00:09:27,290 >> Så der er et andet eksempel, hvilket er, når du besøger / hej, 186 00:09:27,290 --> 00:09:30,370 det udskriver Hej Word, som bør faktisk sige, Hello World, 187 00:09:30,370 --> 00:09:32,010 men lad os lade som var tilsigtet. 188 00:09:32,010 --> 00:09:35,140 Så lad os trække det op virkelig hurtig. 189 00:09:35,140 --> 00:09:41,290 >> Så hvis du går til localhost / hej, Det vil nu udskrive noget andet. 190 00:09:41,290 --> 00:09:45,680 Så det er bare en hurtig eksempel på, hvordan kan du oprette to forskellige ruter. 191 00:09:45,680 --> 00:09:50,630 >> Så indtil videre er det ikke super nyttigt, Der er ikke en hel masse, du kan gøre, 192 00:09:50,630 --> 00:09:55,360 du bare kunne gøre alt det med har forskellige HTML-sider, 193 00:09:55,360 --> 00:09:58,000 og når du besøger et bestemt side det bare indlæser siden. 194 00:09:58,000 --> 00:10:00,864 Så lad os se nogle flere nyttige ting, du kan gøre. 195 00:10:00,864 --> 00:10:03,780 Så en ting, som du måske har bemærket i det eksempel, at jeg trak 196 00:10:03,780 --> 00:10:07,160 op, er, at jeg havde app.run (debug = True). 197 00:10:07,160 --> 00:10:09,580 Og ja, hvad dette debug argument gør, er 198 00:10:09,580 --> 00:10:14,600 at når du kører din webserver, når du er i din ansøgning, 199 00:10:14,600 --> 00:10:18,100 hvis du ændrer en fil, vil det automatisk genindlæse serveren. 200 00:10:18,100 --> 00:10:21,160 >> Og så behøver du faktisk ikke behøver at Genstart Python, som er super nyttig. 201 00:10:21,160 --> 00:10:24,020 Jeg kan vise, at. 202 00:10:24,020 --> 00:10:26,960 Lad mig trække op min kode med tastefejl i det, 203 00:10:26,960 --> 00:10:30,420 og foregive, at tastefejl blev lagt der med vilje til lærerige formål. 204 00:10:30,420 --> 00:10:31,625 Så lad os tilføje denne igen. 205 00:10:31,625 --> 00:10:33,140 Så nu står Hello World. 206 00:10:33,140 --> 00:10:34,410 Jeg vil gemme det. 207 00:10:34,410 --> 00:10:36,540 Og hvis vi trække sig tilbage op terminalen, vil du 208 00:10:36,540 --> 00:10:39,520 siger, at det er at genstarte, fordi det detekteres en, 209 00:10:39,520 --> 00:10:43,620 og så nu når vi genindlæse denne side det vil udskrive den korrekte ting. 210 00:10:43,620 --> 00:10:45,630 >> Så debug er super nyttigt at. 211 00:10:45,630 --> 00:10:48,740 Også, hvis du har nogen sortering af et nedbrud, så 212 00:10:48,740 --> 00:10:54,370 lad mig gøre denne ansøgning nedbrud ved at have det ikke returnere en streng. 213 00:10:54,370 --> 00:10:57,540 Så lad os bare få det returnere Ingen anden grund. 214 00:10:57,540 --> 00:11:00,810 Og så når jeg besøger denne side, vil det bare gå ned, 215 00:11:00,810 --> 00:11:04,465 men serveren ikke bare gå ned, det faktisk giver dig en super anvendelig ryg 216 00:11:04,465 --> 00:11:06,490 spor af alt, hvad der gik galt. 217 00:11:06,490 --> 00:11:10,050 Og hvad er virkelig rart, er, at på ethvert skridt i denne ryg spor, 218 00:11:10,050 --> 00:11:14,260 du kunne åbne op et interaktivt shell her og sortering af udskrive hvad 219 00:11:14,260 --> 00:11:17,780 variabler, du ønsker at tage et kig på. 220 00:11:17,780 --> 00:11:21,054 >> Og så debugging er virkelig nyttigt for at finde ud af 221 00:11:21,054 --> 00:11:23,470 hvad der sker med din server, snarere end blot at se 222 00:11:23,470 --> 00:11:28,201 noget i PHP som en 500 intern serverfejl, som er super ubrugelig. 223 00:11:28,201 --> 00:11:30,700 Én ting at være opmærksom på, er at hvis du lægger din app online 224 00:11:30,700 --> 00:11:34,260 så det er synligt for offentligheden, du aldrig ønsker at forlade debug mode på, 225 00:11:34,260 --> 00:11:37,320 fordi folk kan faktisk bruge konsol, som jeg 226 00:11:37,320 --> 00:11:39,150 viste du at udføre vilkårlig kode. 227 00:11:39,150 --> 00:11:42,120 >> Så de kan printe ud som enhver hemmelige koder, du har derinde, 228 00:11:42,120 --> 00:11:44,755 de kan se på nøjagtig hvordan din hjemmeside virker. 229 00:11:44,755 --> 00:11:46,630 Så det er virkelig nyttigt til test, men altid 230 00:11:46,630 --> 00:11:50,090 sørge for at tage det ud før du udgiver noget online. 231 00:11:50,090 --> 00:11:56,640 >> Så når du bruger noget som PHP, der er denne idé 232 00:11:56,640 --> 00:11:58,920 at du kan passere oplysninger mellem websider 233 00:11:58,920 --> 00:12:03,620 ved at sætte oplysningerne faktisk i URL'en, som er en GET-anmodning, 234 00:12:03,620 --> 00:12:07,490 men i kolbe, kan du faktisk gøre noget lidt ligesom det, 235 00:12:07,490 --> 00:12:10,590 ved at have en rute, der har en variabel som en del af det. 236 00:12:10,590 --> 00:12:14,090 >> Så hvis man ser på det eksempel på skærmen her, 237 00:12:14,090 --> 00:12:19,930 vi har en rute, der er ('/ goddag / «), og så, hvis du besøger 238 00:12:19,930 --> 00:12:23,790 / hej / noget, at noget vil faktisk få fyldt 239 00:12:23,790 --> 00:12:25,490 i navnet variabel. 240 00:12:25,490 --> 00:12:27,850 Og bemærk, at funktionen der kommer med denne rute 241 00:12:27,850 --> 00:12:31,302 skal tage i parameteren navn, således at det rent faktisk 242 00:12:31,302 --> 00:12:32,510 komme videre i funktionen. 243 00:12:32,510 --> 00:12:34,190 >> Og så, når du er indersiden af ​​denne funktion, 244 00:12:34,190 --> 00:12:36,420 du kan behandle, at ligesom en normal Python variabel, 245 00:12:36,420 --> 00:12:39,650 og så da, vil det udskrive Hej, og det 246 00:12:39,650 --> 00:12:42,000 vil udfylde navnet ved hjælp nogle snor formatering. 247 00:12:42,000 --> 00:12:48,060 >> Så for at tilføje variable dele til en routing, du bruger den vinkel beslag mærkning. 248 00:12:48,060 --> 00:12:51,220 Og eventuelt kan du bruge hvad der kaldes en konverter. 249 00:12:51,220 --> 00:12:56,840 Og så, hvis du sætte dette annotation med colon, 250 00:12:56,840 --> 00:13:00,015 du kan angive, at det er en int eller en float, eller sti, 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å gøre konverteringen inden for Python-funktion, 253 00:13:05,130 --> 00:13:09,710 blot ved hjælp af et støbt, men nogle gange, hvis du ønsker at sikre, at det er en int, 254 00:13:09,710 --> 00:13:12,080 du kan sætte det konvertering regel derinde. 255 00:13:12,080 --> 00:13:15,930 >> Så lad os trække et eksempel nogle variable regler. 256 00:13:15,930 --> 00:13:21,480 Så her, har dette den samme grundlæggende struktur med fra kolbe import 257 00:13:21,480 --> 00:13:25,030 Kolbe app = Kolbe (_NAME_), og derefter det kører i slutningen. 258 00:13:25,030 --> 00:13:28,050 Vi har disse to forskellige 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 det dias, som var, at det tager bare i en streng navn 261 00:13:34,230 --> 00:13:35,650 og det vil udskrive Hej, Navn. 262 00:13:35,650 --> 00:13:41,410 >> Og så, den anden man bruger konverteringen. 263 00:13:41,410 --> 00:13:44,690 Så dette vil automatisk konvertere det til en int, og derefter fordoble int, 264 00:13:44,690 --> 00:13:46,150 og udskrive det ud. 265 00:13:46,150 --> 00:13:48,220 Og, vi ikke gør nogen form konvertering inden det 266 00:13:48,220 --> 00:13:49,594 fordi kolbe tager sig af det. 267 00:13:49,594 --> 00:13:53,181 Så lad os få dette løb. 268 00:13:53,181 --> 00:13:54,930 Når du har en Flask program kørende, 269 00:13:54,930 --> 00:13:58,440 Du kan styre-C ud af det at stoppe server, der kører. 270 00:13:58,440 --> 00:14:02,420 Og så vil jeg køre variabler. 271 00:14:02,420 --> 00:14:11,740 >> Så lad os gå til localhost / goddag / Ezra og Forhåbentlig vil dette sige hej til mig. 272 00:14:11,740 --> 00:14:14,530 273 00:14:14,530 --> 00:14:20,310 >> Så det tog i mit navn, i variablen ruten, og det fyldte det herinde. 274 00:14:20,310 --> 00:14:23,950 Så jeg vil også vise en hurtig eksempel på fordobling. 275 00:14:23,950 --> 00:14:28,600 Så hvis du går til / dobbelt / 3, det vil udskrive 6. 276 00:14:28,600 --> 00:14:31,440 Så dette tog sig af konverteringen for os. 277 00:14:31,440 --> 00:14:34,190 >> Så du kan også gøre det med flyde, og noget særligt, 278 00:14:34,190 --> 00:14:37,530 hvis du har brug for at angive noget som en sti, der lader den acceptere skråstreger, 279 00:14:37,530 --> 00:14:39,155 men det bør ikke normalt være et problem. 280 00:14:39,155 --> 00:14:41,480 281 00:14:41,480 --> 00:14:43,820 Indtil videre har vi, stadig har netop blevet tilbage 282 00:14:43,820 --> 00:14:46,320 strenge, som ikke er meget interessant. 283 00:14:46,320 --> 00:14:48,730 >> Vi kunne faktisk vende tilbage bogstavelig HTML streng. 284 00:14:48,730 --> 00:14:54,322 Så i koden kan vi indsætte noget ligesom b-tag for at gøre det fed, 285 00:14:54,322 --> 00:14:56,030 men de fleste den tid, du ikke faktisk ønsker 286 00:14:56,030 --> 00:14:58,420 at skrive HTML-kode i din Python kode. 287 00:14:58,420 --> 00:15:01,940 Det bliver rigtig rodet, og det er ikke et godt tidspunkt. 288 00:15:01,940 --> 00:15:06,430 >> Kolbe giver os mulighed for at adskille den HTML i, hvad der kaldes den skabelon, 289 00:15:06,430 --> 00:15:09,467 og så hvis du tænker i form af MVC model 290 00:15:09,467 --> 00:15:11,550 at du er fortrolig med, forhåbentlig, fra at arbejde 291 00:15:11,550 --> 00:15:15,520 med CS50 Finance en lille smule, du kan tænke på de Python filer 292 00:15:15,520 --> 00:15:19,430 som værende mere af controlleren, hvor de interagerer med uanset 293 00:15:19,430 --> 00:15:20,970 datamodel, du måtte have. 294 00:15:20,970 --> 00:15:24,900 >> Og så ringer ud til visninger og videregive oplysninger til Vis 295 00:15:24,900 --> 00:15:28,120 at udfylde de oplysninger i HTML, som den har brug for. 296 00:15:28,120 --> 00:15:30,490 Og det, vi kalder disse synspunkter er skabeloner i klassen. 297 00:15:30,490 --> 00:15:35,280 >> Så Kolbe bruger en anden Python modul, vil det automatisk 298 00:15:35,280 --> 00:15:38,620 installere, når du pip installere Flask kaldet Jinja, som 299 00:15:38,620 --> 00:15:40,885 lader dig tilføje disse anmærkninger til HTML 300 00:15:40,885 --> 00:15:45,140 som du ser på skærmen, som lader du lægger i ting som betingede, 301 00:15:45,140 --> 00:15:47,230 og sløjfer i HTML. 302 00:15:47,230 --> 00:15:51,140 >> Så det ser lidt ligesom, hvordan du kan bruge PHP i en HTML-fil, 303 00:15:51,140 --> 00:15:57,380 men det er bare når Flask server serverer HTML-filen, 304 00:15:57,380 --> 00:16:01,610 det vil køre denne templating motor og parse igennem dette og udfylde tingene i. 305 00:16:01,610 --> 00:16:06,650 Så Kolbe har en render_template funktion at du kan se nederst her. 306 00:16:06,650 --> 00:16:14,300 Og så når du besøger denne side, er det ville gøre dette hello.html skabelon, 307 00:16:14,300 --> 00:16:16,407 og derefter udfylde denne HTML-side. 308 00:16:16,407 --> 00:16:18,990 Så lad os bare køre denne virkelige hurtig, og se, hvad det ser ud, 309 00:16:18,990 --> 00:16:21,198 og så vil jeg gå gennem en lidt mere detaljeret. 310 00:16:21,198 --> 00:16:25,380 311 00:16:25,380 --> 00:16:30,260 Så er dine skabeloner går at gå i en mappe Skabeloner. 312 00:16:30,260 --> 00:16:33,980 Det vil automatisk kigge indenfor Skabeloner mappe for denne skabelon. 313 00:16:33,980 --> 00:16:35,615 Så lad os åbne denne op. 314 00:16:35,615 --> 00:16:47,350 315 00:16:47,350 --> 00:16:50,005 Så vil jeg køre skabelonmidlet 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 / goddag / Ezra, det har denne forfærdelige, 318 00:17:03,660 --> 00:17:05,930 klamt telt tag, jeg sætter i. 319 00:17:05,930 --> 00:17:08,050 Meget flot, meget 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 hvad sker der, hvis Jeg bare gå til, / hej? 322 00:17:13,900 --> 00:17:15,220 Så det bare siger Hello World. 323 00:17:15,220 --> 00:17:17,678 Jeg vidste ikke give det et navn, og det fyldt det automatisk. 324 00:17:17,678 --> 00:17:22,050 Så lad os se, hvordan det gjorde det, og hvordan vi kan slippe af med det telt måske. 325 00:17:22,050 --> 00:17:26,240 >> Så her, det er slags et interessant eksempel på, 326 00:17:26,240 --> 00:17:29,101 hvis du er fortrolig med, hvordan kontakten udsagn arbejder på et sprog. 327 00:17:29,101 --> 00:17:31,350 Sige dette er lidt ligesom, den slags et fald igennem, 328 00:17:31,350 --> 00:17:34,266 hvor du faktisk knyttet to forskellige veje til samme funktion. 329 00:17:34,266 --> 00:17:41,190 Så vi vedhæfte / hej rute og den / goddag / navn rute til Hello, 330 00:17:41,190 --> 00:17:45,130 og vi angiver using-- Python lader dig specificere standard funktion arguments-- 331 00:17:45,130 --> 00:17:48,300 så hvis der er noget navn, så hvis vi går til lige / hej, 332 00:17:48,300 --> 00:17:50,680 det vil automatisk filtrere at nævne er lig med Ingen. 333 00:17:50,680 --> 00:17:55,010 >> Så, vi gør Skabelon med name = navn, 334 00:17:55,010 --> 00:17:59,510 så det vil passere i navnet parameter svarende til dette navn funktion parameter, 335 00:17:59,510 --> 00:18:00,730 ind i skabelonen. 336 00:18:00,730 --> 00:18:04,040 Det stadig ikke forklare, hvordan er beslutter, om der skal udskrives Hello World, 337 00:18:04,040 --> 00:18:05,100 eller udskrive mit navn. 338 00:18:05,100 --> 00:18:08,050 Så lad os faktisk ser ind i skabelonen selv, 339 00:18:08,050 --> 00:18:11,610 og se, hvor der kommer fra. 340 00:18:11,610 --> 00:18:18,680 >> Så inden for denne skabelon, vi faktisk har nogle betinget logik, 341 00:18:18,680 --> 00:18:20,580 som nogle mennesker ville argumentere, du rent faktisk 342 00:18:20,580 --> 00:18:23,730 bør ikke have en masse betinget logik i din skabelon selv. 343 00:18:23,730 --> 00:18:26,310 Det bør være mere i Controller, men i dette eksempel 344 00:18:26,310 --> 00:18:27,476 det er noget temmelig lille. 345 00:18:27,476 --> 00:18:31,060 Så her, vi kontrollere, hvis navn, så hvis navn er ikke lig med Ingen, 346 00:18:31,060 --> 00:18:33,130 Hvis et navn er faktisk bestået i, så vil vi 347 00:18:33,130 --> 00:18:36,210 sige Hej, navn med header og markeringsrammen, 348 00:18:36,210 --> 00:18:41,490 alt dette normalt HTML, ellers vil vi udskrive Hej, verden bare normalt. 349 00:18:41,490 --> 00:18:45,820 Så et par ting at bemærke her om, hvordan du formaterer templating, 350 00:18:45,820 --> 00:18:49,110 er, at alle disse betingede udsagn, 351 00:18:49,110 --> 00:18:54,475 lidt ligesom, hvordan vi PHP det, når du vil indsætte nogle PHP, 352 00:18:54,475 --> 00:18:58,380 du bruger mindre end spørgsmål mark, det er en slags analog her 353 00:18:58,380 --> 00:19:00,140 med {%. 354 00:19:00,140 --> 00:19:02,130 >> Så her har vi vores betingede kode. 355 00:19:02,130 --> 00:19:05,920 Og så, når du rent faktisk ønsker at bogstaveligt vurdere noget, og udskrive 356 00:19:05,920 --> 00:19:08,710 det ud til skærmen, du bruge de dobbelte seler. 357 00:19:08,710 --> 00:19:12,310 Så her er de dobbelte seler, og så vi angiver navn, 358 00:19:12,310 --> 00:19:15,500 så inden for denne, vil det evaluere til variabelnavnet, som 359 00:19:15,500 --> 00:19:18,860 blev vedtaget i fra gøre skabelonfunktion, 360 00:19:18,860 --> 00:19:21,484 snarere end blot udskrivning ud, hvis vi sluppet af disse, 361 00:19:21,484 --> 00:19:23,150 det ville bare udskrive ordet "navn." 362 00:19:23,150 --> 00:19:26,340 Så det er noget at holde øje med. 363 00:19:26,340 --> 00:19:29,792 >> Så en anden ting at varsel er, at når vi 364 00:19:29,792 --> 00:19:31,500 ønsker at bruge render_template funktion, 365 00:19:31,500 --> 00:19:34,490 vi faktisk nødt til at importere udtrykkeligt fra kolbe. 366 00:19:34,490 --> 00:19:36,915 Og dette er et eksempel på modularitet af kolbe, 367 00:19:36,915 --> 00:19:39,290 at du ikke behøver at importere ting, som du ikke har brug for. 368 00:19:39,290 --> 00:19:41,290 Du kan bare medbringe i funktioner, du faktisk 369 00:19:41,290 --> 00:19:43,450 har brug for, som undertiden nice, så du ikke 370 00:19:43,450 --> 00:19:46,560 nødt til at have alle disse funktioner sidder rundt, at du ikke bruger, 371 00:19:46,560 --> 00:19:49,730 men også, hvis du glemmer, at du nødt til at importere render_template, 372 00:19:49,730 --> 00:19:52,660 vil du sandsynligvis få en advarsel der vil lade dig vide om det. 373 00:19:52,660 --> 00:19:56,700 Så det er templating. 374 00:19:56,700 --> 00:20:01,680 >> Så har vi vist, hvordan man gøre simple websider, 375 00:20:01,680 --> 00:20:04,947 og tilføje en lille smule mere logik til det, i form af den variable routing. 376 00:20:04,947 --> 00:20:08,280 Det kan du gøre forskellige ting baseret på hvad URL du går til, og også da, giver 377 00:20:08,280 --> 00:20:11,950 HTML lidt mere mening i forhold til, hvordan du ønsker at gøre tingene. 378 00:20:11,950 --> 00:20:14,210 Du behøver ikke at sætte alle din HTML i din Python, 379 00:20:14,210 --> 00:20:16,640 men for stort set hver webapplikation, 380 00:20:16,640 --> 00:20:21,480 du vil ønsker en slags af datamodel forbundet med det. 381 00:20:21,480 --> 00:20:25,560 >> Og så traditionelt, ville dette være noget i en SQL-database. 382 00:20:25,560 --> 00:20:30,280 Og du kan bare interagere direkte med SQL. 383 00:20:30,280 --> 00:20:32,190 Python har, tror jeg det hedder. 384 00:20:32,190 --> 00:20:33,040 SQLite 3. 385 00:20:33,040 --> 00:20:38,454 Du kan bare importere SQLite 3 og udføre SQL-forespørgsler direkte, 386 00:20:38,454 --> 00:20:40,870 men jeg ved ikke, om dig, men jeg virkelig ikke kan lide, bare, 387 00:20:40,870 --> 00:20:42,750 skrive ud SQL-forespørgsler. 388 00:20:42,750 --> 00:20:45,350 Den tendens til at få virkelig lang og kompliceret. 389 00:20:45,350 --> 00:20:49,180 >> Og ja, noget der Jeg kan lide at bruge, er, hvad der er 390 00:20:49,180 --> 00:20:53,610 kendt som en ORM, hvilket er en objekt-relationel mapping. 391 00:20:53,610 --> 00:20:56,890 Og det punkt i en objekt-relationel mapping, 392 00:20:56,890 --> 00:21:00,100 er, at der er to forskellige måder, du kan tænke på databaser. 393 00:21:00,100 --> 00:21:03,240 >> Så det eksempel, Professor Malan normalt 394 00:21:03,240 --> 00:21:07,660 bruger i klassen, er Excel-tabellen, hvor du har disse rækker og disse kolonner, 395 00:21:07,660 --> 00:21:10,210 og det er virkelig nyttige for hvordan det er repræsenteret i SQL 396 00:21:10,210 --> 00:21:13,170 og hvordan du interagerer med det, men en anden måde, at det faktisk 397 00:21:13,170 --> 00:21:16,390 nyttigt at tænke over det til tider, er i form af klasser og objekter. 398 00:21:16,390 --> 00:21:20,420 >> Så i stedet for at tænke af hver tabel som havende 399 00:21:20,420 --> 00:21:23,040 denne række, der har en vis oplysninger, kan du faktisk 400 00:21:23,040 --> 00:21:26,100 tænk på det som værende hver tabel er en klasse, 401 00:21:26,100 --> 00:21:29,810 og derefter hver forekomst af klasse har bestemte egenskaber. 402 00:21:29,810 --> 00:21:35,110 Så i dette eksempel, forekomster af klassen er rækkerne i tabellen, 403 00:21:35,110 --> 00:21:37,490 og derefter hver ejendom ville være en kolonne i tabellen. 404 00:21:37,490 --> 00:21:40,840 >> Så ORM, som jeg kan lide at bruge kaldes peewee. 405 00:21:40,840 --> 00:21:43,520 Det er virkelig små, lidt ligesom Flask. 406 00:21:43,520 --> 00:21:46,760 Jeg tror, ​​at de går godt sammen, men der er en masse andre ORMs 407 00:21:46,760 --> 00:21:47,730 som du kan bruge. 408 00:21:47,730 --> 00:21:52,180 En mere populære er kendt som SQLAlchemy, 409 00:21:52,180 --> 00:21:56,050 og jeg kan ikke huske, hvorfor jeg oprindeligt valgte peewee løbet SQLAlchemy, 410 00:21:56,050 --> 00:21:58,311 eller jeg ville fortælle dig, hvorfor jeg synes det er den bedste, 411 00:21:58,311 --> 00:22:01,060 men vi bare kommer til at bruge denne en, fordi jeg ved, hvordan man bruger det. 412 00:22:01,060 --> 00:22:04,760 >> Så et spørgsmål er, hvorfor bør du gider at bruge en ORM, 413 00:22:04,760 --> 00:22:07,552 i stedet for bare direkte skrive SQL-forespørgsler? 414 00:22:07,552 --> 00:22:09,760 Og jeg tror, ​​den bedste fald er, at du faktisk ikke 415 00:22:09,760 --> 00:22:11,356 nødt til at skrive SQL-forespørgsler. 416 00:22:11,356 --> 00:22:14,480 Det er meget lettere, som jeg vil vise dig, at gøre ting som valg, indsættelse, 417 00:22:14,480 --> 00:22:16,157 deletion, især oprettelse af tabeller. 418 00:22:16,157 --> 00:22:17,990 Det er meget lettere at skrive en klassestruktur, 419 00:22:17,990 --> 00:22:22,250 end det er at strukturere en Opret Tabel erklæring, men én ting 420 00:22:22,250 --> 00:22:25,710 at være opmærksom på, er, at ORM vil prøve sit bedste 421 00:22:25,710 --> 00:22:28,640 at regne ud, hvad den mest effektiv SQL forespørgsel ville være, 422 00:22:28,640 --> 00:22:30,110 men nogle gange bliver det det forkert. 423 00:22:30,110 --> 00:22:32,660 >> Og især hvis du er arbejder med en stor database, 424 00:22:32,660 --> 00:22:35,557 du kan mærke, at en forespørgsel der bør kører hurtigt, 425 00:22:35,557 --> 00:22:36,640 er faktisk at tage længere tid. 426 00:22:36,640 --> 00:22:40,164 Og hvis man ser under kølerhjelmen på, hvordan ORM er fortolkningen af ​​denne ind i SQL, 427 00:22:40,164 --> 00:22:42,080 det kunne gøre noget virkelig latterligt, 428 00:22:42,080 --> 00:22:44,371 bare fordi det slags gestikulerede dine intentioner forkert. 429 00:22:44,371 --> 00:22:48,080 Og der har været tidspunkter, hvor Jeg har haft til at tilsidesætte den, og bare 430 00:22:48,080 --> 00:22:52,429 udføre mine egne SQL-forespørgsler, bare fordi det var parsing på en mærkelig måde. 431 00:22:52,429 --> 00:22:54,220 Så der er visse overhead, bare i vejen 432 00:22:54,220 --> 00:22:58,680 at det samler din erklæringer ned i SQL. 433 00:22:58,680 --> 00:23:06,200 >> Så lad os se super hurtigt på Et simpelt eksempel på en datamodel 434 00:23:06,200 --> 00:23:07,350 at du kan bruge. 435 00:23:07,350 --> 00:23:11,880 Så dette er Python-kode, og så første ting du vil gø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 modsætning til kolbe, hvor du har alle disse individuelle moduler, 438 00:23:15,850 --> 00:23:18,125 og du ønsker at importere Flask, og skrive en skabelon, og nogle andre 439 00:23:18,125 --> 00:23:20,690 at vi vil se senere, fra peewee, du kan bare importere alt, 440 00:23:20,690 --> 00:23:22,290 fordi det er en temmelig lille bibliotek. 441 00:23:22,290 --> 00:23:26,490 >> Så den første ting, du ønsker at gøre, er faktisk oprette denne database objekt. 442 00:23:26,490 --> 00:23:31,212 Så du har db = SqliteDatabase, og derefter navnet på din database. 443 00:23:31,212 --> 00:23:33,170 Og det vil faktisk oprette en database objekt 444 00:23:33,170 --> 00:23:36,230 at du kan interagere med, med peewee. 445 00:23:36,230 --> 00:23:40,570 >> Og så har vi den faktiske model, som vi ønsker at skabe. 446 00:23:40,570 --> 00:23:42,470 Så tabellen vi ønsker at skabe. 447 00:23:42,470 --> 00:23:47,270 Så inden peewee, hver klasse har sin egen tabel i din database. 448 00:23:47,270 --> 00:23:52,800 Så alle klasserne arver fra basismodellen, 449 00:23:52,800 --> 00:23:55,960 og stort M model er noget, der er defineret i peewee. 450 00:23:55,960 --> 00:24:02,162 >> Så alle dine modeller skal arver som højeste superklasse, 451 00:24:02,162 --> 00:24:04,620 de skal arve fra model, men hvad er virkelig cool, 452 00:24:04,620 --> 00:24:07,610 er, at du rent faktisk kan få din modeller arver fra hinanden. 453 00:24:07,610 --> 00:24:10,530 Og en stor del af tiden, din datamodeller ikke nødvendigvis 454 00:24:10,530 --> 00:24:13,754 gøre en dejlig arv hierarki, men tidspunkter, hvor de gør det, det er virkelig rart, 455 00:24:13,754 --> 00:24:15,920 fordi du har den model, iboende fra hinanden. 456 00:24:15,920 --> 00:24:19,710 >> Så vi definerede denne klasse "elev", som arver en model, 457 00:24:19,710 --> 00:24:21,170 og det har tre egenskaber. 458 00:24:21,170 --> 00:24:24,080 Det har et id, som er en PrimaryKeyField, som 459 00:24:24,080 --> 00:24:26,920 er noget, der er forudsat ved peewee, navn er 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 gemmer alle 462 00:24:32,260 --> 00:24:33,650 de studerendes karakterer. 463 00:24:33,650 --> 00:24:36,060 Det er ikke, men det er sådan jeg ville gøre det. 464 00:24:36,060 --> 00:24:37,920 >> Og så har det, inden denne klasse, og dette 465 00:24:37,920 --> 00:24:41,620 er noget du kan gøre med Python, kan du have indlejrede klasser. 466 00:24:41,620 --> 00:24:43,920 Og det er noget der er krævet af peewee. 467 00:24:43,920 --> 00:24:47,250 Så denne klasse Meta, har du at angive, at databasen er 468 00:24:47,250 --> 00:24:49,830 svarende til objektet at vi skabte ovenfor. 469 00:24:49,830 --> 00:24:54,339 Og det siger, hvad filen er denne tabel faktisk vil være indeholdt i. 470 00:24:54,339 --> 00:24:57,130 Så det er noget, du har at gøre inden alle dine modeller. 471 00:24:57,130 --> 00:24:59,380 Du skal bare nødt til at angive inden for denne klasse Meta 472 00:24:59,380 --> 00:25:01,400 denne database er lig med db. 473 00:25:01,400 --> 00:25:03,940 Så hvad jeg plejer at gøre, hvis jeg har en masse forskellige modeller, 474 00:25:03,940 --> 00:25:05,910 er, at jeg har én base model, som jeg plejer 475 00:25:05,910 --> 00:25:08,839 bare ringe "base model" der har Meta klasse, 476 00:25:08,839 --> 00:25:10,380 og den sætter databasen svarende til db. 477 00:25:10,380 --> 00:25:13,710 Og så alle mine efterfølgende modeller vil arve fra denne base klasse. 478 00:25:13,710 --> 00:25:16,760 Og så har jeg ikke behøver at bekymre sig om indstilling af Meta klasse. 479 00:25:16,760 --> 00:25:21,490 >> Så når det rent faktisk får kompileret ned i en SQL-sætning, 480 00:25:21,490 --> 00:25:24,875 det ligner denne modbydelige ting ned her, "Opret tabel studiekort heltal, 481 00:25:24,875 --> 00:25:26,020 " hvad end. 482 00:25:26,020 --> 00:25:30,002 >> Og jeg tror, ​​at det er kortere, denne SQL-forespørgsel lige her, 483 00:25:30,002 --> 00:25:32,960 men hvis man ser på denne klasse her du kan se præcis, hvad der foregår. 484 00:25:32,960 --> 00:25:36,116 Du kan se, hvilke slags felter Der er, hvad de hedder, 485 00:25:36,116 --> 00:25:38,115 og så synes jeg, at ser på denne Python kode 486 00:25:38,115 --> 00:25:43,340 er meget mere læsbar end forsøger at skrive denne SQL-forespørgsel. 487 00:25:43,340 --> 00:25:45,990 >> Så for at rent faktisk bruge databasen, 488 00:25:45,990 --> 00:25:48,470 vi er nødt til at oprette forbindelse til dem i Python. 489 00:25:48,470 --> 00:25:52,770 Så jeg plejer at skrive en funktion kaldet initialize_db der gør to ting. 490 00:25:52,770 --> 00:25:54,880 Det tager i databasen objekt db og det 491 00:25:54,880 --> 00:25:58,360 forbinder til det, som netop åbner PUNKT til databasen. 492 00:25:58,360 --> 00:26:00,860 Hvis du bare kører selv hjemmeside på din lokale maskine, 493 00:26:00,860 --> 00:26:04,320 det er ikke en super big deal at bekymre om tilslutning og afbrydelse, 494 00:26:04,320 --> 00:26:06,885 men hvis du kører det på en hjemmeside, du 495 00:26:06,885 --> 00:26:10,010 ønsker at sikre, at når en bruger opretter forbindelse til det, når de lukker ud 496 00:26:10,010 --> 00:26:12,270 hjemmesiden, de afbryde så du har ikke en masse mennesker, der er forbundet 497 00:26:12,270 --> 00:26:14,480 til din database på én gang. 498 00:26:14,480 --> 00:26:16,370 >> Og så, når du forbindelse til databasen, 499 00:26:16,370 --> 00:26:20,832 du vil ringe db.create_tables, og en liste over de modeller for, hvad du vil 500 00:26:20,832 --> 00:26:21,540 at oprette tabeller. 501 00:26:21,540 --> 00:26:23,950 Så her, jeg vil bare gerne skabe det for denne elev. 502 00:26:23,950 --> 00:26:28,070 Og så, hvad der er vigtigt, er at specificere sikker = True meste tiden. 503 00:26:28,070 --> 00:26:30,380 Hvad dette udsagn, så vil gøre, er, at det 504 00:26:30,380 --> 00:26:33,580 skaber tabeller for studerende model, men kun 505 00:26:33,580 --> 00:26:36,109 hvis denne tabel ikke blevet oprettet allerede. 506 00:26:36,109 --> 00:26:37,400 Det er, hvad de sikre specificerer. 507 00:26:37,400 --> 00:26:39,150 Så det vil ikke overskrive din eksisterende tabel, 508 00:26:39,150 --> 00:26:41,525 det vil kun skabe en ny tabellen, hvis der ikke er en der. 509 00:26:41,525 --> 00:26:45,090 Så kan du bare oprette tabellerne én gang med SQL. 510 00:26:45,090 --> 00:26:49,410 Og så har denne database møde der, og derefter oprette forbindelse til hver gang, 511 00:26:49,410 --> 00:26:52,450 men det er som regel rart bare at sat i dette create_tables opkald, 512 00:26:52,450 --> 00:26:55,550 således at hvis du nogensinde slette din database, når du kører din web 513 00:26:55,550 --> 00:26:57,960 app igen, vil det genskabe det. 514 00:26:57,960 --> 00:27:00,730 >> Så bare sørg for, at sikker er angivet til at være sandt, 515 00:27:00,730 --> 00:27:03,580 eller vil du finde dine data bare få clobbered hver gang. 516 00:27:03,580 --> 00:27:06,380 Og så kan du bare ringe initialize_db at etablere 517 00:27:06,380 --> 00:27:09,820 en forbindelse, og opret tabeller om nødvendigt. 518 00:27:09,820 --> 00:27:13,150 >> Så den mest almindelige ting at du ønsker at gøre, 519 00:27:13,150 --> 00:27:15,920 eller en af ​​de mest almindelige ting, er rent faktisk at indsætte ting 520 00:27:15,920 --> 00:27:17,170 ind i din database. 521 00:27:17,170 --> 00:27:19,430 Og så, i stedet for at at skrive en indsats INTO 522 00:27:19,430 --> 00:27:21,990 erklæring med alle værdierne angivet, 523 00:27:21,990 --> 00:27:24,650 du rent faktisk kan kalde Funktionen af ​​den studerendes klasse. 524 00:27:24,650 --> 00:27:28,200 Så når du opretter en klasse der arver fra model, 525 00:27:28,200 --> 00:27:30,200 det har det skabe metode. 526 00:27:30,200 --> 00:27:33,870 >> Så du gør klasse name.create, og du angiver parametrene 527 00:27:33,870 --> 00:27:35,260 at du ønsker at passere i. 528 00:27:35,260 --> 00:27:39,200 Så hvis jeg ønsker at tilføje nogle elever til vores CS50 karakterbog eksempel 529 00:27:39,200 --> 00:27:41,820 Jeg vil sætte i David, som har en meget god kvalitet, han har en 95. 530 00:27:41,820 --> 00:27:45,100 Og mig selv, hvem der ikke gør så godt i CS50, jeg har en 50. 531 00:27:45,100 --> 00:27:47,600 Og så, det gode ved hvad det skabe funktion gør, 532 00:27:47,600 --> 00:27:53,040 er, at det returnerer eksempel, eller den række, at det skabte i tabellen, 533 00:27:53,040 --> 00:27:55,750 og så derefter du gemmer det i en variabel, og arbejdet med det senere. 534 00:27:55,750 --> 00:27:58,830 Du kan ændre rundt, hvilket Jeg vil vise et eksempel på. 535 00:27:58,830 --> 00:28:03,050 >> Bemærk, at jeg ikke nødt til at angive ID, 536 00:28:03,050 --> 00:28:09,340 fordi da det er PrimaryKeyField, vil det automatisk 537 00:28:09,340 --> 00:28:10,930 tilvækst det, hvis du ikke angiver det. 538 00:28:10,930 --> 00:28:12,250 Og i virkeligheden, har du sandsynligvis bør ikke angive det, 539 00:28:12,250 --> 00:28:14,810 fordi du måske ved et uheld tæske en andens id. 540 00:28:14,810 --> 00:28:16,830 Og du ønsker at gøre sikker på, at det er unikt. 541 00:28:16,830 --> 00:28:20,662 >> Så faktisk den mest fælles ting du ønsker at gøre, 542 00:28:20,662 --> 00:28:22,620 er formodentlig vælge ud af databasen, når du 543 00:28:22,620 --> 00:28:24,078 har en masse oplysninger i der. 544 00:28:24,078 --> 00:28:27,360 Og så, hvis du ønsker at få alt, så hvad der svarer til de udvalgte stjerne 545 00:28:27,360 --> 00:28:30,940 fra studerende erklæring, det ville bare være student.select. 546 00:28:30,940 --> 00:28:34,380 Og det vil give dig tilbage et array med alle de studerende objekter i det 547 00:28:34,380 --> 00:28:35,770 at du gentage over du ønsker. 548 00:28:35,770 --> 00:28:37,019 Du kan få tingene ud af det. 549 00:28:37,019 --> 00:28:39,310 Og det meste af tiden, du ikke bare ønsker at gøre vælge, 550 00:28:39,310 --> 00:28:40,935 du rent faktisk ønsker at angive noget. 551 00:28:40,935 --> 00:28:44,580 Og så kan du kæde sammen disse funktionskald, 552 00:28:44,580 --> 00:28:48,830 gerne, hvordan du ville kæde sammen udtalelserne i SQL. 553 00:28:48,830 --> 00:28:53,002 Så du kan gøre student.select (). Hvor i dette eksempel. 554 00:28:53,002 --> 00:28:54,710 Og så kan du fastsætte betingelserne, 555 00:28:54,710 --> 00:28:57,880 bare bruge almindelig Python Booleans at kontrollere ting. 556 00:28:57,880 --> 00:29:02,110 >> Så i dette tilfælde, du ønsker at begrænse, hvad du vælger til, 557 00:29:02,110 --> 00:29:06,790 hvor student.grade er lig med 50, og student.name er lig med Ezra, 558 00:29:06,790 --> 00:29:09,130 så vil bare få mig ud af det. 559 00:29:09,130 --> 00:29:11,340 Og læg mærke til, en virkelig subtile ting her er 560 00:29:11,340 --> 00:29:15,570 at hvis du vil angive en og / eller der ligger en eller / eller, 561 00:29:15,570 --> 00:29:19,840 i Python, ville du normalt bruger, Jeg tror, ​​at ordet "og" faktisk, 562 00:29:19,840 --> 00:29:23,351 men her du bruger enkelt-tegn, som normalt er en bitvis operatør, 563 00:29:23,351 --> 00:29:25,600 men i dette særlige tilfælde, bare den måde peewee gør det, 564 00:29:25,600 --> 00:29:27,660 du bruge single tegnet til at angive "og". 565 00:29:27,660 --> 00:29:29,451 Det er noget, Jeg bliver blandet op en masse, 566 00:29:29,451 --> 00:29:32,530 men det kommer ikke op så meget i praksis. 567 00:29:32,530 --> 00:29:36,350 >> Og så, når du har alle de studerende ud af databasen, 568 00:29:36,350 --> 00:29:39,420 når du har gjort, du er ved at vælge og din slid eller hvad, 569 00:29:39,420 --> 00:29:42,334 du kan bruge en foreach løkke, ligesom normale i Python, 570 00:29:42,334 --> 00:29:44,500 med nogen form for iterator eller med nogen form for array. 571 00:29:44,500 --> 00:29:46,333 Så du kan gøre, for s i student.select (). whe 572 00:29:46,333 --> 00:29:52,930 re (Student.grade <75), og så dette vil gentage over hver elev i tabellen 573 00:29:52,930 --> 00:29:56,260 hvis kvalitet er mindre end 75, som i dette tilfælde, er stadig bare mig. 574 00:29:56,260 --> 00:29:59,218 Og så kunne du gøre noget inden for at sløjfe, ligesom send mig en mail 575 00:29:59,218 --> 00:30:01,680 og fortælle mig at der faktisk vende i mit problem Sets. 576 00:30:01,680 --> 00:30:04,550 >> Så en anden ting du kan gør, er det er virkelig nemt 577 00:30:04,550 --> 00:30:06,460 at opdatere rækker i tabellen. 578 00:30:06,460 --> 00:30:08,720 Så husk tilbage her, din når jeg indsat, 579 00:30:08,720 --> 00:30:11,440 Jeg tog den værdi, der var returneret af student.create, 580 00:30:11,440 --> 00:30:14,920 og jeg tildelt det til navnet hedder Ezra. 581 00:30:14,920 --> 00:30:18,995 Og så nu, kan du ændre værdier inden for dette eksempel, 582 00:30:18,995 --> 00:30:20,870 ligesom du ville en normal klasse i Python. 583 00:30:20,870 --> 00:30:25,060 >> Så du kan sætte ezra.grade = 95 og der vil opdatere den lokale kopi, 584 00:30:25,060 --> 00:30:28,380 men hvis du rent faktisk ønsker at tilsagn om, at ændring af databasen, 585 00:30:28,380 --> 00:30:31,410 du skal kalde ezra.save, så du kaldte .save metode 586 00:30:31,410 --> 00:30:32,650 på forekomst. 587 00:30:32,650 --> 00:30:38,085 >> Og så nu, har jeg med succes skiftet min egen klasse i databasen. 588 00:30:38,085 --> 00:30:41,210 Ja, så lad os sige, at jeg bliver fanget ændre min klasse i databasen. 589 00:30:41,210 --> 00:30:44,126 Professor Malan er sandsynligvis vil at ønsker at slette mig fra klassen, 590 00:30:44,126 --> 00:30:48,630 og så kan du ringe til .delete instans metode bare på at ting. 591 00:30:48,630 --> 00:30:51,674 >> Så hvis du ønskede at gå tilbage i denne sløjfe her, 592 00:30:51,674 --> 00:30:53,465 og faktisk, i stedet for at sende e-mails alle 593 00:30:53,465 --> 00:30:56,577 af de studerende, hvis kvalitet er mindre end 75, du ønskede at slette dem, 594 00:30:56,577 --> 00:30:58,660 inden for denne løkke du kunne kalder s.delete instans. 595 00:30:58,660 --> 00:31:04,180 596 00:31:04,180 --> 00:31:07,780 Og den allersidste ting du ønsker at gøre, er, når du opretter en forbindelse, 597 00:31:07,780 --> 00:31:10,350 og du er færdig med dit arbejde, du vil ringe db.close, 598 00:31:10,350 --> 00:31:13,190 hvor db er, at databasen indvende, at vi havde før. 599 00:31:13,190 --> 00:31:18,290 Og du vil være sikker på, at alt bliver lukket ud af. 600 00:31:18,290 --> 00:31:18,790 >> Afkøle. 601 00:31:18,790 --> 00:31:22,410 Så nu har jeg et eksempel ansøgning. 602 00:31:22,410 --> 00:31:26,880 Jeg har en slags pre-made alt bare således at der ikke vil være nogen levende kodning 603 00:31:26,880 --> 00:31:30,220 fejl, men vi kan gå igennem det og se, hvordan du ville sætte Flask 604 00:31:30,220 --> 00:31:33,685 og Peewee sammen, og gøre en simpel app. 605 00:31:33,685 --> 00:31:38,680 Jeg kalder det CS50 rant, og det er sortering af en simpel blog-platform. 606 00:31:38,680 --> 00:31:41,150 >> Så først vil jeg køre det og vise, hvad det ligner, 607 00:31:41,150 --> 00:31:42,890 og så kan vi se mere i koden. 608 00:31:42,890 --> 00:32:00,470 609 00:32:00,470 --> 00:32:02,830 Okay, så lad os bare køre dette. 610 00:32:02,830 --> 00:32:14,040 611 00:32:14,040 --> 00:32:17,250 Cool, jeg vil gøre dette lidt mindre. 612 00:32:17,250 --> 00:32:20,000 Det er ikke meget smuk, bare fordi Jeg har ikke gøre en masse CSS, 613 00:32:20,000 --> 00:32:23,255 men hvad det gør, er, har det denne database af blogindlæg, 614 00:32:23,255 --> 00:32:25,630 og det går gennem alle dem, og det vil vise dem 615 00:32:25,630 --> 00:32:28,170 på siden i den rækkefølge, det seneste. 616 00:32:28,170 --> 00:32:30,920 Og så disse er blot nogle stillinger at jeg havde gemt i databasen. 617 00:32:30,920 --> 00:32:35,680 >> Så hvis vi ønsker at skabe en ny post, kan vi gå til Tilføj et nyt indlæg, 618 00:32:35,680 --> 00:32:42,720 og vi kan komme ind i titlen på indlæg, så noget lignende, CS50 seminaret. 619 00:32:42,720 --> 00:32:45,360 620 00:32:45,360 --> 00:32:46,735 Wow, virkelig nyder seminaret. 621 00:32:46,735 --> 00:32:51,070 622 00:32:51,070 --> 00:32:52,270 >> Afkøle. 623 00:32:52,270 --> 00:32:56,060 Så du trykker på indlæg, og det vil omdirigere dig tilbage til startsiden, 624 00:32:56,060 --> 00:33:00,039 og så vil du se, at det seneste indlæg blev tilføjet. 625 00:33:00,039 --> 00:33:01,580 Og vi har stadig alle de der. 626 00:33:01,580 --> 00:33:08,080 Så nu, lad os gå gennem alle de kode og se, hvordan dette gennemføres. 627 00:33:08,080 --> 00:33:11,995 >> Så jeg tror, ​​den første ting, lad os tage et kig på, er faktisk modellerne. 628 00:33:11,995 --> 00:33:14,120 En stor del af tiden, hvor du designe noget, 629 00:33:14,120 --> 00:33:17,036 du ønsker at tænke først om, hvordan du kommer til at repræsentere dine data, 630 00:33:17,036 --> 00:33:22,915 og derefter designe ting omkring det, så alt giver mening. 631 00:33:22,915 --> 00:33:25,290 Og det er faktisk sådan jeg gjorde det, da jeg var at gøre det, 632 00:33:25,290 --> 00:33:28,030 Jeg satte mig ned og tænkte, hvad vil jeg i et indlæg. 633 00:33:28,030 --> 00:33:32,130 >> Så her har vi den samme struktur at jeg nævne tidligere, 634 00:33:32,130 --> 00:33:33,755 hvor vi gør db = Sqldatabase (posts.db «). 635 00:33:33,755 --> 00:33:37,840 636 00:33:37,840 --> 00:33:40,980 I virkeligheden, har du sandsynligvis ikke ønsker til hårdt kode i dit navn databaser. 637 00:33:40,980 --> 00:33:43,730 Det burde nok være en parameter der er gemt et eller andet sted, måske 638 00:33:43,730 --> 00:33:45,940 i en config fil, men i et lille eksempel som dette, 639 00:33:45,940 --> 00:33:48,310 det er okay at hårdt kode, i. 640 00:33:48,310 --> 00:33:53,510 >> Så nu har vi dette indlæg klasse, der arver fra basismodellen. 641 00:33:53,510 --> 00:33:56,930 Og det har, igen, ID = PrimaryKeyField. 642 00:33:56,930 --> 00:34:02,250 Faktisk, hvis du ikke angiver, hvis jeg faktisk sluppet af dette, 643 00:34:02,250 --> 00:34:07,152 så Peewee vi vil tage sig af automatisk skaber den ID-felt, 644 00:34:07,152 --> 00:34:09,360 og det vil automatisk gøre det til en PrimaryKey, som 645 00:34:09,360 --> 00:34:12,485 Jeg mener er virkelig rart, fordi normalt, det er noget du vil have, 646 00:34:12,485 --> 00:34:16,239 men jeg kan lide at sætte det i specielt bare så jeg huske, at det er derinde. 647 00:34:16,239 --> 00:34:19,480 Men hvis du ikke angiver det, der vil være der automatisk. 648 00:34:19,480 --> 00:34:22,198 >> Så, jeg har en dato, som er en DateTimeField, og alle 649 00:34:22,198 --> 00:34:24,864 disse forskellige områder, hvis du se på peewee dokumentation, 650 00:34:24,864 --> 00:34:28,920 Det vil give dig en liste over de forskellige typer af felter, som du kan bruge. 651 00:34:28,920 --> 00:34:34,440 For det meste, er det analoge til, hvad du vil se i SQL. 652 00:34:34,440 --> 00:34:37,699 Så der er en CharField, en VarCharFields, tekstfelter, 653 00:34:37,699 --> 00:34:40,550 som er for meget længe tekster, som et blog-indlæg 654 00:34:40,550 --> 00:34:44,460 potentielt DateTimeFields, DoubleFields, FloatFields, 655 00:34:44,460 --> 00:34:46,100 alle sådan noget. 656 00:34:46,100 --> 00:34:51,570 >> Og du kan passere i andre argumenter til det, som jeg angav ikke her. 657 00:34:51,570 --> 00:34:55,719 Sig for eksempel, du ikke ønsker at tillade to stillinger for at have den samme titel, 658 00:34:55,719 --> 00:34:59,672 du kunne angive noget som unikt = True, 659 00:34:59,672 --> 00:35:02,880 og det er bare en ekstra parameter til det felt, når det samler den ned 660 00:35:02,880 --> 00:35:06,865 i SQL, angiver at det skal være unikt. 661 00:35:06,865 --> 00:35:09,740 Du kan også angive noget lignende ikke nul og alle de andre ting 662 00:35:09,740 --> 00:35:11,750 du normalt gør i SQL. 663 00:35:11,750 --> 00:35:16,020 Så det er en temmelig simpel model, der har dato. 664 00:35:16,020 --> 00:35:19,460 Bemærk her, i DateTimeField, Jeg specificeret, hvad standard er. 665 00:35:19,460 --> 00:35:22,560 Jeg specificeret det at være datetime.datetime.now, 666 00:35:22,560 --> 00:35:24,920 på grund af den måde, dette bliver evalueret, 667 00:35:24,920 --> 00:35:28,750 det faktisk vurderer den DateTime.Now når 668 00:35:28,750 --> 00:35:32,110 det bliver indsat i databasen. 669 00:35:32,110 --> 00:35:34,760 >> Jeg tror, ​​at, ville jeg have at dobbelttjekke dette, 670 00:35:34,760 --> 00:35:38,222 men hvis du gjorde noget som dette, så det rent faktisk ville vurdere, at når, 671 00:35:38,222 --> 00:35:40,180 og derefter DateTime vil altid være den samme. 672 00:35:40,180 --> 00:35:44,240 Så bare hvis du laver noget med datetimes, dobbelttjekke 673 00:35:44,240 --> 00:35:47,080 at det er en vurdering, når faktisk bliver indsat, ellers 674 00:35:47,080 --> 00:35:48,780 du kan blive forvirret. 675 00:35:48,780 --> 00:35:51,221 >> Titlen er blot en CharField, hvor der 676 00:35:51,221 --> 00:35:53,970 er flere argumenter, du kan passere i at specificere præcis hvor lang tid du 677 00:35:53,970 --> 00:35:56,170 ønsker det skal være, men her, det gjorde ikke rigtig noget. 678 00:35:56,170 --> 00:35:58,687 Og Tekst bliver teksten til hele indlæg, 679 00:35:58,687 --> 00:36:01,020 og det kommer til at være en TextField bare fordi du ønsker 680 00:36:01,020 --> 00:36:03,370 at lade det være en temmelig lang streng. 681 00:36:03,370 --> 00:36:05,970 >> Så har vi denne Meta underklasse, der bare 682 00:36:05,970 --> 00:36:11,250 angiver, at vi ønsker, at databasen hvor dette er faktisk åbnet op i 683 00:36:11,250 --> 00:36:14,267 at være den db objekt, som vi har her. 684 00:36:14,267 --> 00:36:16,350 Og sidste, vi har Her er netop denne funktion 685 00:36:16,350 --> 00:36:18,120 at vi kommer til at bruge fra vores vigtigste app 686 00:36:18,120 --> 00:36:23,970 at initialisere databasen til at oprette forbindelse til det, og derefter at skabe Post bordet. 687 00:36:23,970 --> 00:36:26,880 >> Lad os nu se på de vigtigste app selv. 688 00:36:26,880 --> 00:36:30,800 Så denne ene er en ganske lidt længere end dem 689 00:36:30,800 --> 00:36:34,840 at vi har set før, men forhåbentlig ikke alt for dårlig. 690 00:36:34,840 --> 00:36:37,140 Så lad mig forlænge denne ud. 691 00:36:37,140 --> 00:36:38,370 Okay. 692 00:36:38,370 --> 00:36:42,070 >> Så mærke og toppen jeg importerede en hel masse andre ting 693 00:36:42,070 --> 00:36:44,129 fra kolbe, som vi ikke har virkelig set før. 694 00:36:44,129 --> 00:36:46,670 Og forhåbentlig kan vi gå igennem hver enkelt af disse én efter én 695 00:36:46,670 --> 00:36:49,420 og snakke lidt mere om dem, sorteret efter f.eks. 696 00:36:49,420 --> 00:36:51,380 Så har vi den kolbe, og render_template, 697 00:36:51,380 --> 00:36:54,370 som vi har set før, denne anmodning objekt, 698 00:36:54,370 --> 00:37:00,400 som vil komme op, når vi ser på, hvordan den form, jeg var viser faktisk 699 00:37:00,400 --> 00:37:01,170 fungerer. 700 00:37:01,170 --> 00:37:04,850 Omdirigere, som lader du omdirigere tilbage fra Opret ny post 701 00:37:04,850 --> 00:37:11,710 tilbage til den oprindelige hjemmeside, og derefter URL, hvilket er noget, der lader dig 702 00:37:11,710 --> 00:37:15,550 regne ud, hvor på hjemmeside en bestemt side er. 703 00:37:15,550 --> 00:37:17,810 >> Altsaa, den næste ting jeg gør, er jeg import 704 00:37:17,810 --> 00:37:21,550 alle de oplysninger fra de modeller filer, som vi var bare at kigge på. 705 00:37:21,550 --> 00:37:23,140 Og, ja. 706 00:37:23,140 --> 00:37:28,720 >> Så noget andet nyt, der kommer op, når du beskæftiger sig med, 707 00:37:28,720 --> 00:37:31,850 især databaser, er, at du kan angive 708 00:37:31,850 --> 00:37:35,110 en funktion, der bliver kaldt før hver anmodning, og funktion, der får 709 00:37:35,110 --> 00:37:39,690 opkaldt efter hver anmodning, ved hjælp af denne funktion dekoratør app.before anmodning. 710 00:37:39,690 --> 00:37:42,324 >> Og så dette vil blive henrettet uanset hvor denne funktion er. 711 00:37:42,324 --> 00:37:44,240 Dette behøver ikke at være kaldt før anmodning 712 00:37:44,240 --> 00:37:46,281 men normalt det er noget fornuftigt at kalde det. 713 00:37:46,281 --> 00:37:48,580 714 00:37:48,580 --> 00:37:51,650 Du kan angive, hvad funktion du ønsker at få kaldt der, 715 00:37:51,650 --> 00:37:56,330 så jeg angivet denne initialize_db funktion, som vi havde tilbage i modeller 716 00:37:56,330 --> 00:38:02,390 fil, så før hver anmodning, du vil oprette forbindelse til databasen. 717 00:38:02,390 --> 00:38:04,560 >> Der er to forskellige måder, du kan gøre dette. 718 00:38:04,560 --> 00:38:10,830 Du kan gøreapp., Jeg mener, det er after_request. 719 00:38:10,830 --> 00:38:13,800 Og forskellen mellem after_request og teardown_request, 720 00:38:13,800 --> 00:38:17,590 er, at after_request kun vil ske hvis anmodningen faktisk var gyldig. 721 00:38:17,590 --> 00:38:20,440 Og så, hvis den anmodning lykkedes, 722 00:38:20,440 --> 00:38:22,490 hvis intet gik galt, men teardown_request 723 00:38:22,490 --> 00:38:26,300 sker i tilfælde af et vellykket anmodning eller i tilfælde af fejl. 724 00:38:26,300 --> 00:38:28,252 >> Så normalt, du ønsker at bruge teardown_request, 725 00:38:28,252 --> 00:38:30,460 medmindre du ønsker at gøre noget, især forskellige 726 00:38:30,460 --> 00:38:31,470 i tilfælde af en fejl. 727 00:38:31,470 --> 00:38:35,122 Men bare for at lukke databasen, uanset om det lykkes, eller hvis det ikke lykkes, 728 00:38:35,122 --> 00:38:37,080 vi gør du vil afbryde fra databasen. 729 00:38:37,080 --> 00:38:41,240 Så det hedder, db.close på db objekt. 730 00:38:41,240 --> 00:38:43,740 >> Bemærk, at teardown_request tager i en undtagelse. 731 00:38:43,740 --> 00:38:46,781 Så du kan kontrollere, om der var faktisk en fejl, da det var ved at lukke ned, 732 00:38:46,781 --> 00:38:49,390 men her forhåbentlig der er ikke en hel masse fejl, 733 00:38:49,390 --> 00:38:52,720 så vi bare slags ignorere det. 734 00:38:52,720 --> 00:38:55,990 >> Okay, og resten af ​​det er ikke så slemt. 735 00:38:55,990 --> 00:39:02,240 Så når vi går til startsiden, Vi gjorde dette home.html skabelon 736 00:39:02,240 --> 00:39:03,490 der åbnes op. 737 00:39:03,490 --> 00:39:06,240 Passet er i post lig, og hvad det 738 00:39:06,240 --> 00:39:10,260 gør er, husk vi har dette indlæg model, så vi vælge alle de stillinger, 739 00:39:10,260 --> 00:39:13,890 og derefter en anden ting du kan gøre, du kan angive WHERE, 740 00:39:13,890 --> 00:39:16,910 du kan angive en bestille ved, og så tager vi 741 00:39:16,910 --> 00:39:18,820 alle de stillinger, der får valgt, og derefter 742 00:39:18,820 --> 00:39:22,590 vi bestille dem af post.date.descending. 743 00:39:22,590 --> 00:39:25,030 Og der vil angive, hvor de rent faktisk kommer ud, 744 00:39:25,030 --> 00:39:29,250 den seneste vil være meget første. 745 00:39:29,250 --> 00:39:31,420 >> Og så, vi passerer det ind den home.html skabelon, 746 00:39:31,420 --> 00:39:34,240 så lad os faktisk åbne at Skabelon virkelig hurtig, 747 00:39:34,240 --> 00:39:36,760 og tage et kig på, hvordan det fungerer. 748 00:39:36,760 --> 00:39:42,130 Og det er ikke store HTML, men Forhåbentlig kan vi fokusere på Python. 749 00:39:42,130 --> 00:39:46,960 >> Så der er et link til Tilføj ny Post, og så dette angiver ruten 750 00:39:46,960 --> 00:39:51,580 inden Flask at vi definere, hvilket er lige her. 751 00:39:51,580 --> 00:39:56,310 Dette er den nye indlæg rute, og vi specificere, at heroppe. 752 00:39:56,310 --> 00:40:00,450 Og så er et link, der vil derefter gå til denne rute inden for Flask server. 753 00:40:00,450 --> 00:40:03,820 >> Det mere interessante ting er det for-løkke her. 754 00:40:03,820 --> 00:40:07,685 Så vi angive, at dette indlæg parameter, som 755 00:40:07,685 --> 00:40:09,560 blev ført ind i render_template funktion, 756 00:40:09,560 --> 00:40:13,550 for alle indlæg i post s objekt, der bliver vedtaget i. 757 00:40:13,550 --> 00:40:16,600 Vi ønsker at udskrive stillingen titel, i 1. halvår, 758 00:40:16,600 --> 00:40:21,930 og så nedenfor, vi ønsker at udskrive stillingen tekst i et afsnit. 759 00:40:21,930 --> 00:40:25,710 >> Og her kan vi faktisk kalde en Python-funktion, 760 00:40:25,710 --> 00:40:35,130 så vi kan ringe strftime, ST-RF-tid, og du kan passere i strengen formatet 761 00:40:35,130 --> 00:40:37,064 at du ønsker at udskrive dataene i. 762 00:40:37,064 --> 00:40:39,980 Så det er temmelig rart, at du kan faktisk kalde dette Python-funktion 763 00:40:39,980 --> 00:40:41,090 indefra her. 764 00:40:41,090 --> 00:40:44,370 Du behøver ikke at gøre formateringen på controlleren side, fordi virkelig, 765 00:40:44,370 --> 00:40:47,770 formatering af dato er noget, du ønsker at beskæftige sig inden for View. 766 00:40:47,770 --> 00:40:51,480 >> Og alle disse procent ting er ikke super vigtigt. 767 00:40:51,480 --> 00:40:55,270 Hvis du ser op dokumentationen for strftime funktion i Python, 768 00:40:55,270 --> 00:40:57,040 det specificerer alle disse ting, men det er 769 00:40:57,040 --> 00:40:59,190 hvordan, hvornår vi ledte på hjemmesiden her, 770 00:40:59,190 --> 00:41:04,440 Det formaterer dette med en dejlig dato, og det angiver AM eller PM, 771 00:41:04,440 --> 00:41:09,410 men normalt, hvis vi havde ikke denne her, 772 00:41:09,410 --> 00:41:14,024 du skal nok få nogle skrald dato, der ikke ser meget godt. 773 00:41:14,024 --> 00:41:15,940 Og så har vi specificere post.text, kunne, og jeg 774 00:41:15,940 --> 00:41:19,460 har lagt et par linjeskift her, bare 775 00:41:19,460 --> 00:41:21,820 at sætte nogle mellemrum mellem hvert indlæg. 776 00:41:21,820 --> 00:41:26,270 >> Så jeg tror, ​​det vigtigste ting i dette eksempel, 777 00:41:26,270 --> 00:41:28,697 er, at du kan bruge dette til løkke. 778 00:41:28,697 --> 00:41:30,780 Og dette svarer til ting du kan gøre i PHP. 779 00:41:30,780 --> 00:41:32,905 Du kan gentage gennem, alt bliver vedtaget i, 780 00:41:32,905 --> 00:41:36,719 og så, i stedet for at skulle gøre copy / paste, copy / paste al HTML, 781 00:41:36,719 --> 00:41:40,010 du bare nødt til at skrive det én gang, og derefter du kan gentage over alle de stillinger. 782 00:41:40,010 --> 00:41:41,510 >> Og det er noget almindeligt, at du vil 783 00:41:41,510 --> 00:41:44,510 at gøre, når du har en masse data, er, at for alt i dine data, 784 00:41:44,510 --> 00:41:48,370 du ønsker at gøre en lignende ting. 785 00:41:48,370 --> 00:41:51,690 Og så, bare huske, at når du ønsker at udskrive noget eksplicit 786 00:41:51,690 --> 00:41:54,780 i HTML, du bruger de dobbelte seler her, 787 00:41:54,780 --> 00:41:57,820 men så når du ønsker at specificere nogle oplysninger om en tilstand, 788 00:41:57,820 --> 00:42:02,430 eller om en for-løkke, du bruge procent beslag. 789 00:42:02,430 --> 00:42:08,730 >> Så går tilbage til Python kode, så der forklarer 790 00:42:08,730 --> 00:42:12,242 hvad der sker i de vigtigste vej, når vi går der, 791 00:42:12,242 --> 00:42:14,450 det bare viser alle de indlæg, men så er spørgsmålet 792 00:42:14,450 --> 00:42:17,440 er, hvordan vi rent faktisk får stillinger til databasen, som 793 00:42:17,440 --> 00:42:18,970 er lidt mere interessant. 794 00:42:18,970 --> 00:42:23,960 >> Så når du klikker på Ny Indlæg link, som vi så her, 795 00:42:23,960 --> 00:42:26,000 det omdirigerer dig til denne form. 796 00:42:26,000 --> 00:42:29,580 Og det er bare en simpel opfordring til render_template funktion, som derefter 797 00:42:29,580 --> 00:42:32,110 passerer i den nye post i HTML-formular. 798 00:42:32,110 --> 00:42:36,212 Så lad os tage et kig på det. 799 00:42:36,212 --> 00:42:37,420 Så denne ene er ret enkel. 800 00:42:37,420 --> 00:42:45,110 Det har en simpel HTML-formular, som vil se en lille smule bekendt, 801 00:42:45,110 --> 00:42:47,380 baseret på formularerne i CS50 Finance. 802 00:42:47,380 --> 00:42:49,940 Og så, vi angiver her, handlingen. 803 00:42:49,940 --> 00:42:52,435 Og her, hvis du arbejder med PHP, normalt, det 804 00:42:52,435 --> 00:42:55,930 ville være noget lignende, create.PHP, men her 805 00:42:55,930 --> 00:42:59,960 vi faktisk angive en rute inden for Flask server. 806 00:42:59,960 --> 00:43:02,520 Og så denne rute svarer til at skabe rute 807 00:43:02,520 --> 00:43:05,680 at vi har her, som vi vil gå ind i en anden. 808 00:43:05,680 --> 00:43:07,630 >> Og så, vi angive, at det er en post-metoden, 809 00:43:07,630 --> 00:43:09,820 fordi vi ønsker at sende denne formular data, og som regel 810 00:43:09,820 --> 00:43:12,945 når du sender data fra en formular, du måske ønsker at bruge en post anmodning 811 00:43:12,945 --> 00:43:15,760 bare så du ikke ender med denne store, uhåndterlige URL. 812 00:43:15,760 --> 00:43:18,970 Men du kan også bruge en GET-anmodning, og videregive det ind med variabel routing, 813 00:43:18,970 --> 00:43:21,170 men for formularer, er det rart til en stilling anmodning her. 814 00:43:21,170 --> 00:43:24,620 Og så da, ligesom du ville gøre med HTML og PHP, 815 00:43:24,620 --> 00:43:28,420 kan du angive disse tekst input, og du kan angive navnet på dem, 816 00:43:28,420 --> 00:43:33,490 og det er det navn, der vil blive vedtaget i anmodningen objekt inden kolbe. 817 00:43:33,490 --> 00:43:36,960 >> Og så har vi en Indsend knap, der hedder Post. 818 00:43:36,960 --> 00:43:40,760 Og her, Post er navnet på den knap, fordi det er et blog-indlæg, 819 00:43:40,760 --> 00:43:42,700 men her, indlæg er anmodningen metode. 820 00:43:42,700 --> 00:43:47,060 Så dem er det samme ord men faktisk uafhængige. 821 00:43:47,060 --> 00:43:48,460 Ja 822 00:43:48,460 --> 00:43:54,800 >> Går tilbage til Python-kode, når vi kaldes skabe metoden, 823 00:43:54,800 --> 00:43:57,702 bemærke her, at du kan faktisk angive inden ruten 824 00:43:57,702 --> 00:44:00,650 anmodningen metoder at du ønsker at acceptere, 825 00:44:00,650 --> 00:44:04,770 og så her, jeg angive, at jeg kun vil acceptere en Post-metoden. 826 00:44:04,770 --> 00:44:09,800 Så hvis jeg rent faktisk forsøger at besøge siden direkte, hvilket bruger en GET-anmodning, 827 00:44:09,800 --> 00:44:11,700 det vil fortælle mig "Metode ikke tilladt." 828 00:44:11,700 --> 00:44:15,840 >> Og så har du sider, lidt ligesom denne oprette siden, som jeg kun 829 00:44:15,840 --> 00:44:20,192 virkelig bruge som en måde for formularen til at få indsendt, 830 00:44:20,192 --> 00:44:22,900 du kan angive, at du ikke ønsker, at folk skal kunne gå der 831 00:44:22,900 --> 00:44:25,650 direkte via en GET-anmodning, eller hvis du ikke ønsker, 832 00:44:25,650 --> 00:44:28,580 en eller anden grund, en anmodning Post, du bare kunne angive GET her, 833 00:44:28,580 --> 00:44:32,720 men i dette eksempel har vi lige ønsker anmodningen post til at gå ud. 834 00:44:32,720 --> 00:44:38,700 >> Så når create_post kaldes, når besøger vi, at via anmodningen Post, 835 00:44:38,700 --> 00:44:43,600 når du går til en bestemt rute, der er denne anmodning objekt, 836 00:44:43,600 --> 00:44:46,640 og vi havde til at importere anmodninger på toppen, 837 00:44:46,640 --> 00:44:49,640 men der er denne anmodning objekt, der bliver vedtaget i, 838 00:44:49,640 --> 00:44:53,210 og du kan få adgang til formulardata, som automatisk vil få fyldt 839 00:44:53,210 --> 00:44:55,070 når du sender en anmodning fra en formular. 840 00:44:55,070 --> 00:44:56,990 >> Og så, hvad jeg tror er virkelig cool, er 841 00:44:56,990 --> 00:45:02,840 at formen formål at få øjeblikkeligt i, er blot en Python ordbog, 842 00:45:02,840 --> 00:45:10,560 indeholder, hvis du access-- så her, lad mig trække op HTML siden af ​​det, bare 843 00:45:10,560 --> 00:45:17,670 så du kan have det som reference, ja, så 844 00:45:17,670 --> 00:45:21,060 de navne, vi angiver her for de forskellige områder, så 845 00:45:21,060 --> 00:45:23,900 titlen og teksten, vi så bare bruge dem over her 846 00:45:23,900 --> 00:45:27,110 som indeks i formularen 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å vi kalder post.create, som vil oprette og automatisk indsætte 849 00:45:33,320 --> 00:45:36,850 denne nye stilling objekt i databasen. 850 00:45:36,850 --> 00:45:40,690 Og jeg tror, ​​det skabe funktion her er en virkelig cool eksempel på, hvordan 851 00:45:40,690 --> 00:45:44,900 kraftfulde kolbe og arbejde med det, fordi hvis du gjorde noget 852 00:45:44,900 --> 00:45:48,660 i PHP, skal du muligvis gøre en masse validering, 853 00:45:48,660 --> 00:45:51,730 du skulle da oprette en database forbindelse, 854 00:45:51,730 --> 00:45:55,210 du skulle da udføre SQL-forespørgslen, 855 00:45:55,210 --> 00:45:59,550 men her har vi bare have denne nice post.create, som vi kan så bare 856 00:45:59,550 --> 00:46:01,520 få de oplysninger ud af objektet anmodning 857 00:46:01,520 --> 00:46:05,370 og derefter sende den til en ny bogføre, at vi er ved at oprette. 858 00:46:05,370 --> 00:46:07,850 >> Og så den allersidste ting, vi ønsker at gøre, 859 00:46:07,850 --> 00:46:09,630 er at omdirigere bruger tilbage til hjemmet. 860 00:46:09,630 --> 00:46:13,020 Og så bruger vi denne Kolben omdirigere funktion. 861 00:46:13,020 --> 00:46:17,770 Og noget, som vi ikke havde set før, var denne URL funktion. 862 00:46:17,770 --> 00:46:21,970 Så webadressen for funktion kan du passerer i faktisk navnet 863 00:46:21,970 --> 00:46:26,090 af en funktion i din Python-koden, snarere end bestemt rute 864 00:46:26,090 --> 00:46:26,720 at det er på. 865 00:46:26,720 --> 00:46:32,107 >> Så jeg kunne have lige så let omdirigeret en bruger til at skråstreg, 866 00:46:32,107 --> 00:46:37,050 hvilket ville sende det tilbage hjem, men ved hjælp af URL'en for funktion er rart, 867 00:46:37,050 --> 00:46:39,990 fordi hvis du ændrer sted, hvor tingene er, 868 00:46:39,990 --> 00:46:44,080 så lad os sige, at jeg ændrer hjem for at være på / hjem i stedet, 869 00:46:44,080 --> 00:46:47,040 dette vil stadig derefter vende tilbage / hjem, fordi faktisk går og ser op 870 00:46:47,040 --> 00:46:50,770 navnet på den funktion, og det vil give dig tilbage webadressen for det. 871 00:46:50,770 --> 00:46:52,490 >> Så slags på antagelse, at du er 872 00:46:52,490 --> 00:46:55,489 mere tilbøjelige til at ændre, hvor tingene er, end navnene på de funktioner. 873 00:46:55,489 --> 00:46:58,840 Du kan bruge dette virkelig dejligt URL for funktion. 874 00:46:58,840 --> 00:47:02,470 Og én ting at være opmærksom på der er en lille smule tricky, 875 00:47:02,470 --> 00:47:05,750 er, at du tror, ​​du kunne bare kalder omdirigering på webadressen for, 876 00:47:05,750 --> 00:47:10,600 men faktisk alle ruterne har at returnere en slags tekst og HTML, 877 00:47:10,600 --> 00:47:14,360 så du faktisk nødt til at returnere redirect opkald. 878 00:47:14,360 --> 00:47:18,379 Ellers vil du få noget ugyldig om ikke at returnere en streng, 879 00:47:18,379 --> 00:47:21,420 Fordi alle disse er nødt til at vende tilbage HTML du rent faktisk ønsker at gøre. 880 00:47:21,420 --> 00:47:26,980 >> Og så, når du ringer omdirigeringen, det omdirigerer dig til siden, 881 00:47:26,980 --> 00:47:30,270 men det faktisk returnerer HTML du nødt til at udføre, at omdirigering. 882 00:47:30,270 --> 00:47:34,430 883 00:47:34,430 --> 00:47:37,110 Gå tilbage til startsiden. 884 00:47:37,110 --> 00:47:39,200 Så vi har disse to forskellige synspunkter. 885 00:47:39,200 --> 00:47:40,132 Vi har den hjem visning. 886 00:47:40,132 --> 00:47:41,590 Eller, jeg gætte, jeg bør sige skabeloner. 887 00:47:41,590 --> 00:47:44,190 Vi har disse to skabeloner, hjemmet skabelon, som 888 00:47:44,190 --> 00:47:48,500 viser alle vores indlæg, og så har vi denne annonce ting, 889 00:47:48,500 --> 00:47:52,970 og når du klikker på posten, det går til en ny rute inden Flask, 890 00:47:52,970 --> 00:47:55,920 men at ruten ikke nødvendigvis har en tilsvarende skabelon. 891 00:47:55,920 --> 00:47:59,290 892 00:47:59,290 --> 00:48:01,560 Du behøver ikke at se noget, men du kan stadig 893 00:48:01,560 --> 00:48:04,090 har dette arbejde vil bag kulisserne. 894 00:48:04,090 --> 00:48:07,450 Og så får du omdirigeret tilbage til hjemmesiden. 895 00:48:07,450 --> 00:48:12,230 Og helt sikkert, det er nemt at arbejde i nogle pænere CSS i skabelonen 896 00:48:12,230 --> 00:48:15,580 og gøre dette ser meget pænere, men alle de vigtigste logik 897 00:48:15,580 --> 00:48:18,590 er der i Python. 898 00:48:18,590 --> 00:48:20,020 >> Eventuelle spørgsmål om dette eksempel? 899 00:48:20,020 --> 00:48:22,760 Jeg ved, der er en masse forskellige ting foregår dér, 900 00:48:22,760 --> 00:48:25,341 en masse ting, vi ikke havde set før, men gerne noget. 901 00:48:25,341 --> 00:48:25,840 Ja. 902 00:48:25,840 --> 00:48:28,346 >> PUBLIKUM 1: Har du nødt til at gøre noget særligt at skrubbe de data, der er 903 00:48:28,346 --> 00:48:29,600 kommer ind fra formen? 904 00:48:29,600 --> 00:48:31,109 Jeg har bemærket, du lige sagde "skabe" 905 00:48:31,109 --> 00:48:33,900 EZRA Zigmond: Ja, så det er faktisk, det er en rigtig god pointe. 906 00:48:33,900 --> 00:48:36,350 Så spørgsmålet var, gør du nødt til at tjekke og sørg 907 00:48:36,350 --> 00:48:39,190 at data er gyldige, og gøre nogen form for skrubbe 908 00:48:39,190 --> 00:48:41,840 for at sikre, at det er gyldigt, fordi som du kan se her, 909 00:48:41,840 --> 00:48:42,660 Jeg er ikke at gøre det. 910 00:48:42,660 --> 00:48:48,140 Så lad os se hvad der sker hvis jeg sender noget tom. 911 00:48:48,140 --> 00:48:51,190 Så vil det faktisk bare lave en blank post og udfylde DateTime. 912 00:48:51,190 --> 00:48:55,990 >> Så i virkeligheden, ville du sikkert ønsker at gøre noget lignende, 913 00:48:55,990 --> 00:49:04,749 måske angive, om titlen er lig med den tomme streng, så skal du ikke gøre dette. 914 00:49:04,749 --> 00:49:07,290 Eller gør det kun, hvis titel er ikke lig med den tomme streng. 915 00:49:07,290 --> 00:49:10,330 Så det gør faktisk ikke automatisk tage sig af det skrubbe 916 00:49:10,330 --> 00:49:12,820 for dig, så du stadig nødt til at gøre det. 917 00:49:12,820 --> 00:49:14,330 Ja, godt spørgsmål. 918 00:49:14,330 --> 00:49:18,497 >> PUBLIKUM 2: Er det krat til efterfølger injektion? 919 00:49:18,497 --> 00:49:19,890 Ved du? 920 00:49:19,890 --> 00:49:22,830 >> EZRA Zigmond: Forhåbentlig peewee gør det. 921 00:49:22,830 --> 00:49:25,830 Jeg tror, ​​det ville helt sikkert være en temmelig dårlig bibliotek, hvis det ikke gjorde det. 922 00:49:25,830 --> 00:49:29,511 923 00:49:29,511 --> 00:49:32,690 Jeg ved ikke præcis. 924 00:49:32,690 --> 00:49:34,820 Jeg ville have til at se på forespørge det genereres. 925 00:49:34,820 --> 00:49:38,980 Jeg tror, ​​at hvis jeg har skrevet i en blogindlæg slags set 926 00:49:38,980 --> 00:49:46,370 ligesom en SQL-injektion angreb, noget som dette, hvis det 927 00:49:46,370 --> 00:49:49,370 er som et felt adgangskode eller noget, du kan gøre noget som dette. 928 00:49:49,370 --> 00:49:53,410 >> Jeg tror, ​​der vil stadig får bogstaveligt udstationeret, 929 00:49:53,410 --> 00:49:59,200 men jeg tror, ​​at peewee gør, en slags skrubning af data 930 00:49:59,200 --> 00:50:01,680 før det rent faktisk udfører den. 931 00:50:01,680 --> 00:50:04,510 >> PUBLIKUM 1: At tekstfeltet er designet til at tage almindelig tekst, ikke? 932 00:50:04,510 --> 00:50:05,710 >> EZRA Zigmond: Ja, det er. 933 00:50:05,710 --> 00:50:06,465 Ja. 934 00:50:06,465 --> 00:50:09,590 Så jeg tror, ​​at alle de, så dette er korrekt adfærd, vil det gøre det, 935 00:50:09,590 --> 00:50:12,170 men jeg tror, ​​at peewee forhåbentlig gør gøre 936 00:50:12,170 --> 00:50:13,780 en slags beskyttelse på deres ende. 937 00:50:13,780 --> 00:50:16,090 Og hvis du ønsker at dobbelttjekke, at der 938 00:50:16,090 --> 00:50:19,530 er måder, når du genererer en forespørgsel. 939 00:50:19,530 --> 00:50:22,622 så du ikke behøver at udføre det direkte. 940 00:50:22,622 --> 00:50:24,330 Jeg ville have til at tage en se dokumentation, 941 00:50:24,330 --> 00:50:27,930 men du kan faktisk se den SQL, at det genererer, 942 00:50:27,930 --> 00:50:30,840 og tage et kig på det, og gøre sikker på, at det er flygter ting. 943 00:50:30,840 --> 00:50:33,700 >> En anden grund til, at du måske ønsker at se på SQL 944 00:50:33,700 --> 00:50:37,920 at peewee udsender, er, hvis ting synes at være at gå rigtig langsomt, 945 00:50:37,920 --> 00:50:41,090 du kan tage et kig og se, hvad det er faktisk gør, fordi det er nogle gange 946 00:50:41,090 --> 00:50:44,670 let at uheld tilføje på, den måde du skriver det, 947 00:50:44,670 --> 00:50:47,880 du kan ved et uheld have det vælge hele databasen først, 948 00:50:47,880 --> 00:50:50,230 og derefter gøre en slags operation på, at når du virkelig 949 00:50:50,230 --> 00:50:51,320 betød at vælge en delmængde. 950 00:50:51,320 --> 00:50:53,560 >> Og så, hvis tingene ikke er helt går til højre, 951 00:50:53,560 --> 00:50:57,300 det er godt at tage et kig på anmodning der er faktisk at få genereret. 952 00:50:57,300 --> 00:50:57,800 Ja. 953 00:50:57,800 --> 00:51:02,100 >> PUBLIKUM 2: Når du først startede, du lægger i havnen som 5000. 954 00:51:02,100 --> 00:51:02,904 >> EZRA Zigmond: Ja. 955 00:51:02,904 --> 00:51:06,070 PUBLIKUM 2: Er standard med peewee, eller er det noget, du kan ændre? 956 00:51:06,070 --> 00:51:10,870 EZRA Zigmond: Ja, så det havn er standard med kolbe. 957 00:51:10,870 --> 00:51:13,061 Hvis du kører det uden angivelse af noget, 958 00:51:13,061 --> 00:51:14,310 Det vil automatisk gøre det. 959 00:51:14,310 --> 00:51:16,060 Jeg tror, ​​jeg ville have at dobbelttjekke dette, 960 00:51:16,060 --> 00:51:19,130 men du kan angive, at der i app.run, Jeg tror, ​​du kan gøre noget lignende, 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 Lad os give, at en prøve reelle hurtig. 964 00:51:23,750 --> 00:51:29,100 965 00:51:29,100 --> 00:51:32,230 Ja, så kan du bare angive port = 8080, og det vil køre det der, 966 00:51:32,230 --> 00:51:36,130 som jeg tror, ​​hvis du ønsker at køre det på IDE, jeg har ikke prøvet det ud, 967 00:51:36,130 --> 00:51:38,527 men jeg tror, ​​at hvis du løb det på port 8080, 968 00:51:38,527 --> 00:51:40,360 du ville nok være i stand til få adgang til serveren, 969 00:51:40,360 --> 00:51:41,870 ligesom du var til hjemmesiden. 970 00:51:41,870 --> 00:51:44,390 >> Ja, men det er nemt at ændre det, hvis du 971 00:51:44,390 --> 00:51:48,540 har nogen slags ligesom port-forwarding ting, du skal gøre. 972 00:51:48,540 --> 00:51:50,410 >> Andre spørgsmål? 973 00:51:50,410 --> 00:51:50,916 Ja? 974 00:51:50,916 --> 00:51:53,416 PUBLIKUM 1: Så, jeg så i dit modeller, der, som du nævnte, 975 00:51:53,416 --> 00:51:55,647 du nødt til at angive database for hvert objekt. 976 00:51:55,647 --> 00:51:58,105 Har du tilfældigvis kender, gør der gør det virkelig let, hvis du 977 00:51:58,105 --> 00:52:03,210 har masser af SQLite databaser, som du vil bruge til en enkelt web-app, 978 00:52:03,210 --> 00:52:07,210 at du bare kan angive en flok af forskellige dem i din model? 979 00:52:07,210 --> 00:52:11,620 >> EZRA Zigmond: Ja, lad mig åbne det op virkelig hurtig. 980 00:52:11,620 --> 00:52:17,570 Så du siger, hvis du vil have en masse forskellige noget, måske 981 00:52:17,570 --> 00:52:22,670 gerne og de studerende, for nogle grund, sådan noget? 982 00:52:22,670 --> 00:52:26,870 Ja, så jeg tror, ​​at du stadig, hver model 983 00:52:26,870 --> 00:52:30,652 skulle stadig have lige en database, overdraget til det, 984 00:52:30,652 --> 00:52:32,610 men hvis du ønskede at have forskellige modeller, 985 00:52:32,610 --> 00:52:35,818 har forskellige databaseobjekter tildelt til det, kan du helt sikkert gøre det. 986 00:52:35,818 --> 00:52:43,070 Så hvis jeg oprettet en ny, noget som dette, 987 00:52:43,070 --> 00:52:47,000 og nu er det en elev, der ser underligt gerne en blog-indlæg, 988 00:52:47,000 --> 00:52:49,390 Jeg kunne angive, at database er lig med db_2 her. 989 00:52:49,390 --> 00:52:51,390 Så jeg tror det er den vigtigste måde du kan gøre det. 990 00:52:51,390 --> 00:52:54,560 991 00:52:54,560 --> 00:52:56,200 >> Afkøle. 992 00:52:56,200 --> 00:52:58,410 Andre spørgsmål? 993 00:52:58,410 --> 00:53:02,170 >> Så bare for at slutte op lidt bit, her er nogle ressourcer, 994 00:53:02,170 --> 00:53:06,030 og disse dias vil blive offentliggjort online så du kan faktisk komme til disse links. 995 00:53:06,030 --> 00:53:08,500 De bedste ressourcer er virkelig dokumentationen for Kolbe 996 00:53:08,500 --> 00:53:09,930 og Peewee selv. 997 00:53:09,930 --> 00:53:12,940 De er skrevet rigtig godt, synes jeg. 998 00:53:12,940 --> 00:53:18,180 Så Flask hjemmeside er her, og de har en quickstart tutorial, 999 00:53:18,180 --> 00:53:20,710 vil gå gennem lignende ting til, hvad jeg gik igennem, 1000 00:53:20,710 --> 00:53:23,560 men hvis du vil enhver form for revision af de ting, jeg gik forbi, 1001 00:53:23,560 --> 00:53:26,200 eller du troede, at jeg forklarede noget i en forvirrende måde, 1002 00:53:26,200 --> 00:53:28,390 de vil have lignende eksempler der. 1003 00:53:28,390 --> 00:53:31,570 >> Peewee har dokumentation, og de har en quickstart tutorial 1004 00:53:31,570 --> 00:53:34,650 der går over de vigtigste parametre som du ønsker at bruge. 1005 00:53:34,650 --> 00:53:38,900 Så de ting, jeg talte om med de unikke, og specificerer defaults, 1006 00:53:38,900 --> 00:53:42,710 de forskellige former for felter, du kan bruge, dem ville alle være der. 1007 00:53:42,710 --> 00:53:44,690 >> Også, hvis du har spørgsmål om peewee, 1008 00:53:44,690 --> 00:53:47,530 og du sende dem på StackOverflow, den fyr, der gjorde peewee faktisk 1009 00:53:47,530 --> 00:53:49,500 bliver ved og besvarer dem nogle gange. 1010 00:53:49,500 --> 00:53:53,200 Hvis du har et spørgsmål, forhåbentlig han vil være i stand til at svare på det, 1011 00:53:53,200 --> 00:53:54,867 fordi han skrev det hele. 1012 00:53:54,867 --> 00:53:56,700 Jeg tror, ​​det er alt Jeg ønskede at dække. 1013 00:53:56,700 --> 00:53:58,930 Tak for at komme ud. 1014 00:53:58,930 --> 00:54:02,688