[MUZIKO Ludante] Ezra ZIGMOND: Saluton, ĉiuj. Dankon pro eliranta hodiaŭ. Tiu seminario estas "Pitono Retejo Apps kun Flask. " Do, mi tuj parolos iomete pri kial vi eble deziras uzi Flask fari retejo apps kun Python, kontraste al iuj aliaj kadroj tie ekstere, kiel Django, kiu estas la plej konata. La subtitolo estas "kaj Peewee ", kiu estas io ni tuj parolos pri kiom interrilati kun SQL datumbazoj. Ĝi faras ĝin vere bela. Do, jen nur rapida resumo kion mi volas transiri. Do, unue, nur unu glito ke tuj estos Quickstart, kiu estas kiel akiri ĉio starigita sur via komputilo. Mi tuj estos pruvante tio sur mia loka maŝino Mac, nur ĉar tio estas kie mi faris tiun antaŭe, mi estas plej komforta kun ĝi, sed tiu estas definitive ebla sur la CD50 IDE. Do, post tiu, mi volas enkonduki kion Flask estas, kaj konvinki vin kial vi devus uzas ĝin en la unua loko. Tiam, mi doni rapidan ekzemplo de kion vi povas fari en Flask, rapida ekzemplo de kio vi povas fari en Peewee, kaj tiam mi klarigos al vi pli kompleta ekzemplo apliko ke mi kunmetis ke ni promenadas tra kune. Kaj poste fine, en la lasta slide, mi havas iuj rimedoj kiujn vi rigardas ĉe enreta por pli informo. Tio ne estas kompleta tutorial de kiel uzi Flask. Kaj mi esperas foriri tempo por demandoj. Iu ajn rigardanta loke, nur kiel, krii en la mezo se vi havas demandojn. Do rapida instalado stuff, se vi volas sekvi kune, aŭ se vi volas akiri ĉi sur via propra maŝino, Mi tuj estos uzante Python 2.7.10. Flask faras laboron kun Python 3, sed mi ŝatas uzante Python 2, ĉar estas iuj Python pakoj kiuj ne funkcias kun 3 ankoraŭ. Se vi Pip instalita, kiu estas Python pako direktisto, Mi pensas, se via Python estas pli granda ol aŭ egala al 2.7.9, vi havas ĝin instalita jam, ĝi estas super facile instali tiuj pakoj. Vi povas fari Pip instali Flask, Pip instali Peewee, kutime vi devas kuri ŝvitas nur tiel ke la permesoj funkciis. Kaj, se vi uzas súper malnovan version de Pitono, Mi rekomendas ĝisdatigi via Python, aŭ uzante EasyInstall instali Pip. Do, la sekva demando estas, kio estas Flask? Kaj mi supozas, unue al racia demando mi miris Dum longa tempo estas, kion estas ttt app? Ĉar tio estas vorto kiu mi pensi estas ĵetitaj ĉirkaŭe multe ke mi ne vere scias. Kaj mi kredas ke la plej bona ekzemplo de kio ttt app estas, vere estas CS50 Financoj, kie ĝi ne estas vere nur retejo, sed estas iu kiu vi povus ia interagas kun. Estas uzanto kontojn kaj ĉiaj malsamaj aferoj. Do, kie ekzakte vi desegnas la linio inter kio estas retejo, kaj kio estas retejo app, estas ia arbitra, sed mi supozas ke la ideo, ĝi estas io pli ol retejo kaj ĝi estas utila apliko. Do, Flask estas enkadrigi farante retejo apps uzante Python. Kaj espereble, fine tio, mi konvinkos vin ke vi povis skribi ion kiel CS50 Financoj uzante Python, kiun mi kiel multe pli bona ol PHP, persone. Do, Flask estas, ili nomas microframework, por kiu, Ili signifas ke estas tre Simpla, sed etendebla. Do, ĝi havas nur kion vi devas, sed se vi volas pli akcidentoj, estas facile venigi ilin en. Sed ĝuste ĉar ĝi estas microframework, ne signifas ke ĝi estas nur por malgrandaj projektoj. Mi havas ligilon ĉi tie kiu diras ke Obama uzita Flask en 2012 por lia kampanjo retejo, kiu espereble, Estas io aŭ reklamo. Sed la afero, kiun mi vere ŝatas pri Flask estas ke, ĝi ne vere fari omnaspeca decidojn por vi. Nur ĉar ni estas parolas retejo apps, Mi devas kompari ĝin al Ruby on Reloj kaj Django, kiuj ambaŭ estas grandaj kadroj, sed ili ambaŭ faras supozojn pri kiel vi volas interagi kun datumbazoj, kiel vi volas prezenti vian opinioj, kaj ili estas sendube bonajn aspektojn al tio. Ekzemple, Ruby on Rails havas ĉi aktivaj rekordo sistemo, kiu estas vere bela maniero interagi kun datumoj, sed se vi volas uzi Ruby on Reloj, vi ia ligis en tiun. Sed kun Flask, kiel Mi timige montri vin kun Peewee, vi povas uzi ajn speco de datumbazo vi volas, kaj vi povas simple tiri ke en kiel etendaĵo en Flask. Tial do mi vere kiel Flask, estas ke ĝi ne faras supozojn por vi bazita sur aferoj vi ne bezonas vere. Do, kial vi uzas Flask? La avantaĝoj estas, ĝi nur havas vere la kerno karakterizaĵoj konstruita en ĝi, ke vi bezonas. Do, vi ne devas maltrankviligi kompreni tutan faskon da aferoj ke vi ne vere bezonas. Vi ne devas devi maltrankvili pri elŝalti trajtoj ke vi ne vere bezonas. Kaj, kiel mi menciis, ĝi estas super facile aldoni en etendoj de aferoj ke vi bezonas. Kelkaj el ili, Flask havas ilia propra subteno por ĝi. Do ekzistas io nomata Flask administristo, kiu respegulas tiun interfacon panelo kiu Django provizas, kiu donas al vi belan vida maniero administri via retejo. Sed denove, se vi estas farante ion simplan, vi probable ne bezonas grandan admin panelo, do mi kredas ke estas super bela. Kaj la malavantaĝoj estas, ke vi havas malpli povon el la skatolo. Do, kiam vi unue malfermi Flask, kaj en via Python programo, vi simple tajpu el Flask import *, aŭ kio ajn, vi ne ĝuste akiri ĉiujn de trajtojn vi povus volas. Kaj do vi devas pli eksplicite listigi la trajtoj vi volas. Do jen unu malavantaĝon, sed mi opinias ke por konstrui malgrandan ttt apps kiel mi tuj montros vi, tio ne estas vere problemo. Kaj kio la lasta objekto estas supozis diri, kio estas tajperaro, estas ke estas malpli normigitaj konvenciojn por kiel uzi Flask, nur ĉar ne estas tiom da personoj kiuj uzas ĝin profesie kompare al Django. Do, se vi rigardas ion kiel, "kiel mi faru x" en Django, vi probable trovos. Ekzistas bona dezajno ŝablonoj vi povas uzi, sed kun Flask, estas ia iri vian propran vojon, nur ĉar ĝi estas bela malgranda biblioteko. Do tiuj estas la malavantaĝojn, sed mi pensas ke ĝi estas ankoraŭ bona biblioteko uzi. Do ni nur salti rekte en Flask. Tio estas definitive ne tuj esti kompleta lernilo, sed ĝi estas doni al vi ideon de kiel strukturi aferojn, kaj tial vi sentas komforta iranta ekstere kaj rigardis la dokumentado kaj elŝeligi pli. Do, lasu min malfermi vere Simpla ekzemplo unue, kaj al vi, kion tiu similas, kaj poste ni rompi ĝin malsupren iomete pli. Do ĉi tie, mi povas akiri ĝin kuranta. Do, mi nun havas mian apliko kurado. Mi tuj malfermu Safari, kaj ĝi estas kurante sur mia loka gastiganto. Do mi simple tuj fari tiun pli grandan. Sed localhost: 5000 Kaj do, nun, ĉiu tiu faras estas, kiam vi vizitos la retejon, ĝi presas el "Saluton Flask" Kiu ne estas super utila, sed mi kredas ke estas cool, ke en tiu malgranda dosiero tie, ni havos retservilo kurado ke estas presi el io. Do, ni vere rigardi ĉe la kodo por dua, kaj gxin detruis iomete. Estas la grandeco bona por ĉiu ĉi tie? Do, espereble, vi estas iom komforta uzante Python. Mi supozas ke ni povas rigardi la Python kaj tralegis ĝin. Se vi havas demandojn pri ion, mi povas iri ankaŭ trans tio. Do la unua linio estas, de Flask, ni importi, Flask kun majuskla "F" kiu estas speco de ĉiuj ĉefaj karakterizaĵoj kiujn vi bezonas. Kiam ajn vi skribas dosiero kaj uzante Flask, vi tuj volas importi ke, nur ĉar kiu havas ĉiujn ĉefajn aferojn. La sekva afero, kiun ni faras, estas ni nomas tiun funkcion Flask, ĵus krei app celon, kaj vi estas ĉiam tuj volos fari tion. Kaj poste, saltante malsupren al la malsupro rapide, ĉi tiu parto estas ĉi tie, 'if_nomo _ == "_ main_"' kiu estas ia Python konvencio. Do ĉi nur ekzekuti se vi kuri tiun dosieron rekte uzanta Python. Tiam ni nomas app.run, kiuj volas efektive komenci la app iras. Do, jen la ĉefa strukturo kiu vi devos en neniun Flask apliko, Estas vi havos tiun app = Flask (_name_), kaj tiam app.run. Do, la du aĵoj kiujn mi havas en tie, estas kion ni nomas itineroj. Do, ni parolu pri routing iomete pli. Mi reiros al la diapozitivo. Do la plej fundamentaj koncepto en Flask estas routing. Kaj ĝi estas la ideo ke vi asigni funkciojn en Python al aparta adresoj sur via retpaĝo. Do, kiam ajn vi volas krei novan itineron, vi uzas tiun @ app.route funkcio logejdezajnisto. Do, se vi ne kutimas funkcio decoradores en Python, ĝi estas tiu koncepto kiu permesas preni funkcio kaj ĉirkaŭas ĝin per io alia. Do vere, kion tiu logejdezajnisto faras, estas kiu portas la funkcio sub ĝi, kaj ĝi aldonas pli informo al ĝi, sed kion Flask reale faras fari kiuj okazas ne estas súper crucial, sed kio estas grava, estas ke antaŭ la itinero, vi metis tiun @ app.route, kaj tiam la adreso de la itinero, do la oblikvo estas kion ni vidis kiam ni simple malfermi la retpaĝon. Do jen la hejmpaĝo. Estas nur la oblikvo itinero. Kaj tiam vi havas tiun funkcion. La nomo de la funkcio povas esti kion vi volas. Ĝi ne devas nepre devi fari kun la itinero. Kaj tiam, kio ajn la funkcio reveno, la funkcio devus reveni kordo. Kaj ke kordoj povas enhavas HTML aŭ nenion, kaj tio estas vere kio ricevos Revenis al via retumilo kiel HTML, kaj ĝi redonos tion. Do tiu estas la sama kodo kiu estis de la ekzemplo ke mi ĵus kuris, do kiam ni vizitas oblikvo, ĝi nomas Saluton Mondo funkcio, kiun ĝuste redonas ĉenon, Saluton Flask, kaj ke gets presita sur la ekrano. Do ekzistas alia ekzemplo, kio estas, kiam vi vizitas / saluton, ĝi presas el Saluton Vorto, kiu devus reale diri, Saluton Mondo, sed ni ŝajnigi ke estis intenca. Do ni tiri ke ĝis reala rapida. Do se vi iros al localhost / saluton, ĝi nun presi ion alian. Do jen nur rapida ekzemplo de kiel vi povas krei du malsamajn itinerojn. Do, ĝis nun ĉi tio ne estas super utila, ekzistas ne tuta multo vi povas fari, vi povus simple fari cxion per havante malsamaj HTML paĝoj, kaj kiam vi vizitas apartan Paĝa ĝi nur ŝarĝas la paĝon. Do ni vidu iom pli utilaj aĵoj vi povas fari. Do, unu afero ke vi havu rimarkis en la ekzemplo kiun mi tiris supren, estas ke mi app.run (debug = Vera). Kaj do, kio estas tiu debug argumento faras, estas ke kiam vi kuros viaj retservilo, kiam vi estas en via apliko, se vi ŝanĝas dosiero, ĝi volo aŭtomate reload la servilo. Kaj tial vi ne efektive devas rekomenco Python, kiu estas super utila. Mi povas montri ke. Lasu min eltiri supren mia kodo kun la tajperaro en ĝi, kaj ŝajnigi ke tajperaro estis metita tie intence por instrua celoj. Do ni aldonu tiun reveni. Do nun diras Saluton Mondo. Mi savos. Kaj se ni tiri reen supren la fina stacio, vi diru ke ĝi estas rekomencanta, ĉar ĝi detektas ŝanĝon, kaj tiel nun kiam ni reŝargi tiun paĝon, ĝi estos presi lin ĝentila. Do debug estas super utila por ke. Ankaŭ, se vi havas neniun ia bruego, tiel lasu min fari ĉi aplikaĵo kraŝo por havi ŝin ne reveni kordo. Do, ni nur havas ĝin reveni Neniu ial. Kaj poste kiam mi vizitas tiun paĝo, ĝi nur kraŝi, sed la servilo ne nur frakasi, ĝi efektive donas vin super utila reen spuro de ĉio fuŝiĝis. Kaj kio estas vere bela, estas ke cxe cxiu pasxo en tiu reen spuro, vi povus malfermi interagan alkanonadi tie, kaj ia presi kio variabloj vi volas rigardu. Kaj elpuriganta tiel estas vere utila por elŝeligi kio okazas kun via servilo, anstataŭ nur vidante io en PHP kiel 500 internajn servilo eraro, kiu estas super senutila. Unu afero esti konscia de estas ke se vi metas vian programon rete do ĝi estas videbla al la publiko, vin neniam volas forlasi debug mode plu, ĉar homoj povas fakte uzas tiun konzolon ke mi montris vin ekzekuti arbitran kodon. Do ili povas presi kiel ajna sekretaj kodoj vi havas en tie, Ili povas rigardi akurate kiel via retejo funkcias. Do estas vere utilaj por testado, sed ĉiam certigi preni gxin antaux vi eldonis nenion rete. Do kiam vi uzas io kiel PHP, ekzistas tiu ideo ke vi povas pasi informo inter retpaĝoj metante la informo reale en la URL, kio estas GET peton, sed en Flask, vi povas efektive fari ion ia kiel tiu, por havi vojon kiu havas ŝanĝiĝema kiel parto de ĝi. Do se vi rigardas tiun ekzemple sur la ekrano tie, ni havos itineron tio ('/ saluton / "), kaj tial, se vi vizitos / saluton / io, ke io tuj reale preni plenigis en la nomo variablo. Kaj rimarki ke la funkcio kiu venas kun tiu itinero devas preni en la parametro nomo, por ke ĝi estos reale get pasis en la funkcio. Kaj tiam, unufoje vi estas interne de tiu funkcio, vi povas trakti ke kiel normala Python ŝanĝiĝema, Kaj tiel do, ĝi volo elprinti Saluton, kaj ĝi plenigos la nomon uzante iuj kordoj strukturado. Do aldoni variablo partoj al enrutamiento, vi uzas la angulo krampo markante. Kaj laŭvole, vi povas uzi kio nomiĝas konvertilo. Kaj do, se vi metas ĉi komentario kun la dupunkto, vi povas specifi ke ĝi estas int aŭ kaleŝego, aŭ vojeto, kaj ĝi aŭtomate konvertiĝos tio. Vi povas ankaŭ fari la konvertiĝon ene la Python funkcio, nur uzante razion, sed kelkfoje se Vi volas certigi ke ĝi estas int, vi povas meti tiun konvertiĝo regulo en tie. Do ni elsxiros ekzemplo de iu variablo reguloj. Do jen, tiu havas la saman bazan strukturo kun la de Flask importado Flask, la app = Flask (_name_), kaj tiam ĝi estas kurante fine. Ni havas tiujn du malsamajn ŝanĝiĝema itineroj tie. Kaj la unua, estas kiu mi montris en la diapozitivoj, kiujn estis ke ĝi nur prenas en ĉeno nomon kaj ĝi estos presi Saluton, Nomo. Kaj tiam, la dua unu uzas la konvertiĝo. Do tiu aŭtomate konverti ĝin al int, kaj tiam duobligi la int, kaj presi ke eksteren. Kaj, ni ne fari ajnan specon de konvertiĝo en ĝi ĉar Flask prizorgas tion. Do ni ricevas ĉi kurado. Kiam vi havas Flask apliko kurado, Vi povas kontroli-C el ĝi haltigi la servilo kurado. Kaj tiam mi kuros la variabloj. Do ni iru al localhost / saluton / Ezra kaj espereble, tiu diros saluton al mi. Do ĝi prenis en mia nomo, en la variablo itinero, kaj ĝi plenigis lin tien. Do mi ankaŭ montras rapidan ekzemplo de la duobligo. Do se vi iros al / duoblaj / 3, ĝi estos presi 6. Do ĉi zorgis pri la konvertiĝo por ni. Do vi povas fari ĝin ankaŭ kun kaleŝego, kaj io speciala, se vi bezonos specifi ion kiel vojeton, kiu lasas ŝin akcepti slashes, sed tio ne devus kutime esti afero. Ĝis nun, ankoraŭ ĵus reveninte kordoj, kiu ne estas tre interesa. Ni povus vere revenos laŭvorta HTML kordo. Do en la kodo oni povas enmeti ion kiel la b-etikedon por fari grasan, sed maksimume la tempo vi Usonanoj ne volas esti skribanta HTML kodo en via Python kodo. Ĝi akiras vere senorda, kaj ĝi ne estas bona tempo. Flask permesas nin disigi ekster la HTML en kio nomiĝas la Ŝablono: kaj do se vi pensas laŭ la modelo MVC ke vi konas, espereble, plu labori kun CS50 Financoj iomete, vi povas pensi pri la Python dosierojn kiel esti pli de la Regilo, kie Ili interagas kun kiom datumoj modelo vi povus havi. Kaj tiam ili estas vokante por Vidoj kaj pasanta informon al tiu View plenigi la informojn en HTML kiu ŝin bezonas. Kaj kion ni nomas tiujn Vidoj Estas Ŝablonoj en klaso. Do Flask uzas alian Pitono modulon ke ĝi aŭtomate instali kiam vi PIP instali Flask nomita Jinja, kiu permesas aldoni tiujn komentarioj al la HTML ke vi vidas sur la ekrano, kiu permesas vi metis en aĵoj kiel Conditionals, kaj loops en la HTML. Do ĝi aspektas iom kiel kiom vi povus uzi PHP ene HTML -dosiero, sed tio estas nur kiam la Flask servilo servas la HTML -dosiero, ĝi kuros ĉi templating motoro kaj analizi tra tiu kaj plenigi aferoj. Do Flask havas render_template funkcio ke vi povas vidi ĉe la fundo tie. Kaj do kiam vi vizitas paĝon, ĝi farus ĉi hello.html Ŝablono: kaj tiam plenigu ĉi HTML-paĝo. Do ni nur kuri ĉi reala rapida, kaj vidi kia gxi aspektas, kaj tiam mi iros tra iomete pli detale. Do, via Ŝablonoj iras iri en Ŝablonoj dosierujo. Ĝi aŭtomate rigardi ene de la Ŝablonoj leterujo por tiu Ŝablono. Do ni malfermos ĉi supre. Do, mi kuros la Templating ekzemplo. Do, se mi iros al / saluton / Ezra, ĝi havas tiun hororan, malnormala karpo etikedo kiun mi metis en. Tre bela, tre dinamikaj. Mi estas granda ŝatanto. Sed kio okazas se Mi simple iru al: / Saluton? Do nur diras Saluton Mondo. Mi ne pasis al li nomon, kaj ĝi plenigis ĝin aŭtomate. Do ni vidu kiel ĝi faris ke, kaj kiel ni povas liveri de tiu markezo eble. Do jen, ĉi tiu estas speco de interesa ekzemplo de, se vi estas familiara kun kiel ŝaltilo deklaroj labori en lingvo. Diru ĉi estas speco de kiel, ke ia falo tra, kie vi efektive alkroĉita du malsamaj vojoj al la sama funkcio. Do ni alfiksi la / saluton itinero kaj la / saluton / nomo itinero al Saluton, kaj ni entajpi using-- Python permesas specifi defaŭlta funkcio arguments-- do se ne ekzistas nomo, do se ni iras al nur / saluton, ĝi estos aŭtomate filtri al nomo egalas Neniu. Tial, ni redonu la Ŝablono kun nomo = nomo, do ĝi pasos en la nomo parametro egala al tiu nomo funkcio parametro, en la ŝablono. Tio ankoraŭ ne klarigas kiel estas decidi ĉu presi Saluton Mondo, aŭ presi mian nomon. Do ni vere rigardi en la ŝablono mem, kaj vidu kie tiu venas de. Do, ene de tiu ŝablono, ni efektive havas iom kondiĉa logiko, kiun iuj personoj havus argumenti, vi efektive ne havu multajn kondiĉa logiko ene via ŝablono mem. Ĝi devus esti pli ene de la Regilo, sed por ĉi tiu ekzemplo ĝi estas io bela malgranda. Do jen, ni kontrolu, se nomo, do se nomo ne estas egala al Neniu, Se nomo estas vere pasis en, tiam ni diru Saluton, Nomo kun la header kaj la karpo, ĉiuj ĉi normalaj HTML, alie, ni volas elprinti Saluton, Mondo nur kutime. Do kelkaj aferoj rimarki tie pri kiel vi formati la templating, estas ke, ĉiuj tiuj kondiĉa deklaroj, ia kiel ni kiel PHP ĝin kiam vi volas enigi iuj PHP, vi uzas la malpli-ol demando markon, ĝi estas speco de analogaj tie kun la {%. Do jen, ni havas niajn kondiĉan kodon. Kaj poste, kiam vi vere volas laŭvorte taksi ion, kaj presaĵo gxin por la ekrano, vi uzi la duoblaj krampoj. Do jen la duobla krampoj, kaj tiam ni specifi nomon do ene de tiu, ĝi devos taksi al la variablo nomo, kiun estis pasita en el redonu ŝablono funkcio, anstataŭ nur printado eksteren, se ni forigis tiujn, estus ĝuste presi la vorto "nomo". Do, jen io rigardi ekstere por. Do alia afero atenton estas ke, kiam ni volas uzi la render_template funkcio, ni efektive devas importi eksplicite el Flask. Kaj tiu estas ekzemplo de la modularidad de Flask, ke vi ne devas importi aferoj, kiujn vi ne bezonas. Vi povas simple venigu la funkcioj vi reale ja bezonas, kiu estas kelkfoje bela, do vi ne devas havi ĉiuj tiuj funkcioj sidas ĉirkaŭ tiu vi ne uzas, sed ankaŭ, se vi forgesas ke vi bezonas importi render_template, vi probable ricevos averton kiu lasos vin scii pri tio. Do, tio estas templating. Do, ni montris kiel fari simplajn retpaĝojn, kaj aldoni iomete pli logiko al ĝi, en terminoj de la variablo enrutamiento. Ĝi permesas fari malsamajn aferojn surbaze kio URL vi iru, kaj ankaŭ tiam, donu la HTML iomete pli sentita en terminoj de kiel vi volas repagi aferojn. Vi ne devas meti ĉiuj via HTML en via Python, sed por sufiĉe tre ĉiu apliko retejo, vi tuj volas ian de datuma modelo asociita kun ĝi. Kaj tiel tradicie, tio esti io kiel SQL datumbazo. Kaj vi povas simple interagi rekte kun SQL. Python havas, mi pensas ĝi nomiĝas. SQLite 3. Vi povas simple importi SQLite 3 kaj ekzekuti SQL sercxoj rekte, sed mi ne scias pri vi, Sed mi vere ne ŝatas, simple, skribado SQL pridemandojn. Ĝi inklinas akiri vere longa kaj komplika. Kaj do, iu kiu Mi ŝatas uzi estas kio estas konata kiel ORM, kiu estas objekto-interrilata mapado. Kaj la punkto de objekto-interrilata mapado, estas ke ekzistas du malsamaj manieroj vi povas pensi pri datumbazoj. Do la ekzemplo kiu Profesoro Malan kutime uzas en klaso, estas la Excel tablo, kie vi havos tiujn vicoj kaj tiujn kolumnojn, kaj tio estas vere utila por kiel estas reprezentita en SQLa kaj kiel vi interagas kun ĝi, sed alia vojo ke fakte utile pensi pri ĝi kelkfoje, estas en terminoj de klasoj kaj objektoj. Do anstataŭ pensado de ĉiu tablo kiel havanta tiu vico kiu havas certajn informoj, vi povas efektive rigardante ĝin kiel estante ĉiu tablo estas klaso, kaj tiam ĉiu petskribo de la klaso havas certaj propraĵoj. Do, en ĉi tiu ekzemplo, la kazoj de la klaso estas la vicoj de la tabulo, kaj tiam ĉiu posedaĵo farus esti kolumnon en la tabelo. Do, la ORM, ke Mi ŝatas uzi nomiĝas Peewee. Estas vere malgranda, ia kiel Flask. Mi opinias ke ili iras bone kune, sed ekzistas multaj aliaj ORMs ke vi povas uzi. Pli populara estas konata kiel SQLAlchemy, kaj mi ne memoras kial mi origine elektis Peewee super SQLAlchemy, aŭ mi rakontus al vi, kial mi kredas ke estas la pli bona, sed ni nur tuj uzos tiun ĉar mi scias kiel uzi ĝin. Do, unu demando estas, kial devus vin ĝeni uzante ORM, anstataŭ nur rekte skribi SQL sercxoj? Kaj mi kredas ke la plej bona kazo, estas ke vi ne vere devas skribi SQL pridemandojn. Ĝi estas multe pli facila, kiel mi montros al vi, al fari aferojn kiel selektado, inserción, forigo, speciale krei tabelojn. Estas multe pli facile Skribi klaso strukturon, ol ĝi estas strukturi Krei Tabelo deklaro, sed unu afero esti konscia de, estas ke la ORM provos lia plej bona elkompreni la plej efika SQL query estus, sed foje ĝi ricevas ĝin malĝusta. Kaj speciale se vi estas laborante kun granda datenbazo, vi povas rimarki ke query kiuj devus esti kurante rapide, fakte prenante plu. Kaj se vi rigardas sub la kapuĉo je kiom la ORM interpretas ke en SQL, ĝi povus esti faranta ion vere ridindaj, nur ĉar ĝi ia gestadis viajn intencojn erara. Kaj, Tie estis tempoj kie Mi devis nuligi ĝin, kaj nur plenumados Miajn proprajn SQL pridemandojn, ĵus ĉar ĝi sintaksa analizo en stranga maniero. Do, ekzistas iu superkape, ĝuste en la maniero ke kompilas via deklaroj malsupren en SQL. Do, ni rigardu súper rapide ĉe simpla ekzemplo de datuma modelo ke vi povus uzi. Do, tiu estas Python kodo, kaj tiel la unua afero vi deziras fari estas el Peewee importado *. Do, kontraste Flask, kie vi havas ĉiuj tiuj individuaj moduloj, kaj vi volas importi Flask, kaj Skribi Ŝablono, kaj kelkaj aliaj ke ni vidos poste, de Peewee, vi povas simple importi ĉio, ĉar ĝi estas bela malgranda biblioteko. Do, la unua afero vi deziras fari, estas fakte krei la datumbazon objekto. Do, vi havas db = SqliteDatabase, kaj tiam la nomo de via datumaro. Kaj tion reale krei datumbazon objekto ke vi povas interagi kun, kun Peewee. Kaj tiam, ni havas la fakta modelo kiun ni volas krei. Do la tablo ni volas krei. Do, ene Peewee, ĉiu klaso havas lia propra tablo ene de via datumbazo. Do, ĉiuj la klasoj heredi de la baza modelo, kaj la ĉefurbo M modelo estas iu kiu estas difinita en Peewee. Do, ĉiuj viaj modeloj devus heredi kiel siaj plej superclase, ili devus heredi de la modelo, sed kio estas vere genia, estas ke vi povas efektive havas vian modeloj heredi de ĉiu alia. Kaj multa la tempo, via datumoj modeloj ne nepre fari belan heredajxon hierarkio, sed fojojn kie ili faras, ĝi estas vere bela, ĉar vi havas la modelon imanenta inter si. Do, ni difinas tiun klason 'studento', kiu heredas modelon, kaj ĝi havas tri propraĵoj. Ĝi havas ID, kiu estas a PrimaryKeyField, kiu Estas iu kiu estas provizita per Peewee, nomo estas Charfield, kaj grado estas IntegerField. Do tio povas esti aŭ ne esti kiom CS50 fakte stokas ĉiujn la studentaj karakteroj. Ĝi ne estas, sed jen kiel mi farus. Kaj tiam ĝi havas, ene tiu klaso, kaj ĉi Estas io, kion vi povas fari kun Python, vi povas havi nestitaj klasoj. Kaj tio estas io ke estas postulataj per Peewee. Do, tiu klaso Meta, vi havas specifi ke la datumbazo estas egala al la objekto ke ni kreis supre. Kaj tiu diras kio dosiero estas ĉi tablo fakte tuj estos enhavita en. Do tiu estas iu kiu vi devas fari ene ĉiujn viajn modelojn. Vi nur devas specifi ene tiu Meta klaso ke datumbazo egalas db. Do kion mi kutime faras, se mi havas faskon de malsamaj modeloj, estas ke mi havas unu bazo modelo, kiun mi kutime simple nomas "baza modelo" kiu havas la Meta klaso, kaj ĝi fiksas la datumbazo egala al db. Kaj poste ĉiuj el miaj postaj modeloj heredontoj de tiu bazo klaso. Kaj tiam mi ne devas maltrankviligi pri fiksanta la Meta klaso. Do, kiam tiu fakte ricevas kompilita malsupren en SQL aserto, ĝi aspektas kiel tiu aĉa afero malsupren tie, "Krei tablo studento ID entjero, "Ajn. Kaj, mi pensas ke ĝi estas pli mallonga, ĉi SQL query ĉi tie, sed se vi rigardas tiun klason tie vi povas vidi ĝuste kio okazas. Vi povas vidi kion specoj de kampoj estas, kion ili nomas, kaj tiel, mi opinias ke rigardante tiun Python kodo estas multe pli legebla ol provas skribi ĉi SQL query. Do, por vere uzi la datumbazo, ni devos konekti ĝin ene Python. Do, mi kutime skribi funkcion nomita initialize_db kiu faras du aferojn. Ĝi portas en la datumbazo objekto db kaj ĝi konektas al ĝi, kiu nur malfermiĝas supren sekcio por la datumbazo. Se vi ĵus kuras kvankam afiŝinto sur via loka maŝino, ne estas super granda interkonsento zorgi pri konektanta kaj desconectar, sed se vi kuras ĝi en retejo, vi volas certigi ke, ĉiufoje kiam uzanto konektas al ĝi, kiam oni fermas eksteren la retejo, ili malkonekti por ke vi ne havas faskon da homoj konektis al via datumbazo ĉiuj samtempe. Kaj poste, kiam vi konekti al la datumbazo, vi volas nomi db.create_tables, kaj listigi la modeloj por kio vi volas por krei tabelojn. Do jen, mi volas nur krei ĝin por tiu studento. Kaj tiam, kio estas grava, estas por specifi sekura = Veraj plej tiutempe. Do kio estas tiu deklaro faros, estas ke ĝi kreas tablojn por la studento modelo, sed nur se tiu tablo havas ne estis kreita jam. Tion la sekura specifas. Do ĝi ne anstatauxigas via ekzistanta tablo ĝi nur kreas novan tablo se neniu el tie. Do, vi povus simple krei la tablojn iam uzante SQL. Kaj tiam havas tiun datumbazon sidado tie kaj tiam konekti al ĉiu tempo, sed estas kutime agrabla nur al metis en tiun create_tables alvoko, por ke, se vi iam forigi viajn datumaron post vi kuras via retejo app denove, gxi rekrei ĝin. Do, nur certigi ke sekura estas precizigita por esti vera, aŭ vi trovos viajn datumojn nur Akiranta clobbered ĉiufoje. Kaj tiam, vi povas simple nomi initialize_db establi rilato, kaj krei tabloj eventuale. Do, la plej ofta afero ke vi volas fari, aŭ unu el la plej komunaj aferoj, estas efektive enigi aferoj en vian datumbazon. Kaj do, prefere ol devi skribi enmeti en komunikaĵo kun ĉiuj la valoroj specifita, vi povas efektive voki funkcio sur la studenta klaso. Do, kiam vi kreas klason kiu heredas de modelo, ĝi havas tiun krei metodo. Do, vi faru klaso name.create, kaj vi specifas la parametroj ke vi volas pasi en. Do, se mi volas aldoni kelkajn lernantojn al nia CS50 lernojaro libro ekzemplo, Mi metos en Davido, kiu havas tre bona grado, li havas 95. Kaj mi, kiu ne estas faranta tiel bone en CS50, Mi havas 50. Kaj do, la bela afero pri kion tio krei funkcio faras, estas ke ĝi revenas la petskribo, aŭ la vico, kiu kreis ene de la tablo, kaj tiel tiam vi stoki ke en variablo, kaj laboro kun ĝi poste. Vi povas ŝanĝi ĉirkaŭe, kiuj Mi montros ekzemplon de. Rimarku ke mi ne devas entajpi la ID, ĉar pro tio ke estas la PrimaryKeyField, ĝi aŭtomate pliigo ĝin se vi ne specifi ĝin. Kaj, fakte, vi probable ne devus specifi ĝin, ĉar vi eble hazarde clobber aliulaj ID. Kaj vi volas fari certas ke ĝi estas unika. Do, fakte, la plej komuna afero vi deziras fari, estas normale elektu el de la datumbazo unufoje vi havas multan informon en tie. Kaj do, se vi volas akiri ĉion, do la ekvivalenton de la unuaranga stelo de studentoj deklaro, ĝi nur estus student.select. Kaj kiu donos vin reen tabelo kun ĉiuj de la studenta objektoj en ĝi ke vi persisti super vi volas. Vi povas akiri aferojn el ĝi. Kaj plejofte, vi ne nur deziras fari unuaranga, vi efektive volas specifi ion. Do, vi povas ĉeno kune tiuj funkcio vokoj, kiel kiel vi tajpus ĉeno kune la deklaroj en SQL. Do vi povas fari student.select (). Kie en ĉi tiu ekzemplo. Kaj tiam, vi povas specifi la kondiĉoj, nur uzante normala Pitono Booleans kontroli aferojn. Do, en tiu kazo, vi volas limigi kion vi elektante al, kie student.grade egalas 50, kaj student.name egalas al Ezra, tial estos nur akiras min el ĝi. Kaj rimarku, vere subtila afero ĉi tie estas ke, se vi volas specifi an kaj / kaj aŭ aŭ / aŭ, en Python, vi normale uzas, Mi kredas ke la vorto "kaj" fakte, sed ĉi tie oni uzas la solan ampersand, kiu normale estas bitlarĝa operatoro, sed en tiu speciala okazo, nur la vojo Peewee faras ĝin, vi uzas la sola ampersand specifi "kaj." Tio estas io kion Mi konfuzas multajn, sed ne supreniru ke multe praktike. Kaj tiam, kiam vi havas ĉiujn la studentoj el la datumbazo, Unufoje vi faris ke vi estas unuaranga kaj via eluziĝo aŭ kio ajn, vi povas uzi foreach buklo, nur kiel normalaj en Python, kun ia iterator aŭ kun ajna speco de tabelo. Do vi povas fari, por s en student.select (). whe re (Student.grade <75), kaj tiel tiu volo persisti super ĉiu studento en la tablo kies grado estas malpli ol 75, kiu en tiu kazo, estas ankoraŭ nur min. Kaj tiam vi povus fari ion interne ke buklo, kiel sendi mi retpoŝto kaj diru al reale envenu en mia Problemo Aroj. Do, alia afero vi povas do, ĉu ĝi estas vere facila ĝisdatigi vicoj ene la tablo. Do, memoru tien, via kiam mi enigita, Mi prenis la valoro kiu estis revenis por student.create, kaj mi atribuis al nomo nomita Ezra. Kaj tial nun, oni povas ŝanĝi la valoroj ene tiu petskribo, samkiel vi volus normala klaso en Python. Do vi povas agordi ezra.grade = 95 kaj kiu ĝisdatigos la lokan kopion, sed se vi vere volas commit ke ŝanĝo al datumbazo, vi devas voki ezra.save, tiel vi nomas la .save metodo sur la petskribo. Kaj tial nun, mi sukcese ŝanĝis mia propra grado ene de la datumbazo. Do, tiam diru, ke mi akiras kaptita ŝanĝanta mia grado ene de la datumbazo. Profesoro Malan estas probable tuj voli forviŝi min el la klaso, kaj tiel vi povas voki la .delete Ekzemple metodo ĝuste en tiu afero. Do, se vi volas iri reen en ĉi buklo tie, kaj efektive, anstataŭ de sendanta retpoŝtojn ĉiuj de la studentoj kies grado estas malpli ol 75, vi volis forigi ilin, ene tiu buklo vi povis voki s.delete ekz. Kaj la lasta afero vi deziras fari, estas whenever vi establi konekton, kaj vi faris kun via laboro, vi volas nomi db.close, kie db estas ke datenbazo kontesti ke ni havis antaŭe. Kaj vi volas certigi ke ĉio iĝas fermita el. Malvarmeta. Do nun, mi havas ekzemplon apliko. Mi jam ian pre-farita ĉio ĝuste tiel ke ne estos ajna rekta kodigo erarojn, sed ni povas marŝi tra ĝin kaj vidi kiel vi metus Flask kaj Peewee kune, kaj fari simplan programon. Mi nomas ĝin CS50 rant, kaj ĝi estas speco de simpla blogo platformo. Do, unue, mi kuros ĝin kaj montri kiel brilas, kaj tiam ni povas rigardi pli en la kodo. Konsentite, do ni nur kuri ĉi. Cool, mi faros ĉi iomete pli malgranda. Ĝi ne estas tre belaj, ĝuste ĉar Mi ne faris multajn CSS, sed kio faras estas, ĝi havas tiun datumbazon de posts, kaj gxi iras tra ĉiuj ili, kaj ĝi montros ilin sur la paĝo en ordo de la plej freŝaj. Do, tiuj estas nur iuj posts ke mi savigxu en la datumbazo. Do se ni volas krei novan post, ni povas iri al Aldonu novan postenon, kaj ni povas eniri la titolon de la post, do io kiel, CS50 seminario. Wow, vere ĝuas la seminarion. Malvarmeta. Tiam vi premas post, kaj ĝi volas redirekti vin al la hejmpaĝo, kaj tiam vi vidos, ke la lasta posteno estis aldonita. Kaj ni ankoraŭ havas ĉiuj la ones tie. Do nun, ni tretas tra ĉiuj de la kodon kaj vidi kiel ĉi estas implementado. Do, mi kredas ke la unua kiu ni rigardu, estas vere la modeloj. Multa la tempo, kiam vi desegni ion, Vi volas pensi pri kiel unua vi tuj reprezenti via datumo, kaj tiam desegni aferojn ĉirkaŭ tiu, tiel ke ĉiu havas sencon. Kaj tio estas vere kiel mi faris ĝin kiam mi estis faranta tion, Mi sidiĝis kaj pensis, kion mi volas en fosto. Do, ĉi tie, ni havas la saman strukturon ke mi menciadis antaŭe, kie ni fari db = Sqldatabase ('posts.db'). En realo, vi probable ne volas forte kodo en via nomo datumbazoj. Tio devus probable esti parametro kiu estas stokita ie, eble en config dosiero, sed en malgrandan ekzemplon kiel tiu, ĝi estas bone forte kodo ke en. Do nun, ni havas ĉi Afiŝu klaso, kiu heredas de la baza modelo. Kaj ĝi havas, denove, la ID = PrimaryKeyField. Reale, se vi ne specifas, se mi fakte liveris tion, tiam Peewee ni prizorgos aŭtomate kreas ke ID kampo, kaj ĝi aŭtomate igi ĝin PrimaryKey, kiu Mi pensas estas vere bela, ĉar kutime, tio estas io vi deziras havi, sed mi ŝatus meti ĝin en specife, nur tiel mi memoras ke estas tie interne. Sed se vi ne specifas ke, ke estos tie aŭtomate. Tial, mi havas daton kiu Estas DateTimeField, kaj ĉiuj tiuj malsamaj kampoj, se vi rigardi la Peewee dokumentaron, ĝi donos al vi liston de la malsamaj tipoj de kampoj kiuj povas uzi. Plejparte, ĝi estas analoga kion vi vidus en SQL. Do estas Charfield, a VarCharFields, TextFields, kiu estas por tre longa tekstoj, kiel blog Potenciale, DateTimeFields, DoubleFields, FloatFields, cxion tiel. Kaj vi povas pasi en aliaj argumentoj al ĝi, kiun mi ne specifis tie. Diru, ekzemple, vi ne volas permesi du afiŝojn havi la sama titolo, vi povus entajpi io kiel unika = True, kaj tio estas nur ekstra parametro la kampo kiu kiam kompilas ĝin en la SQL, ĝi specifas ke ĝi devas esti unika. Vi ankaŭ povas difini ion kiel ne nula kaj ĉiuj aliaj aĵoj vi kutime faras en SQL. Do, ĉi tiu estas sufiĉe simpla modelo kiu havas la daton. Rimarku tie, ene de la DateTimeField, Mi specifita kion la defaŭlto estas. Mi specifita ĝin esti datetime.datetime.now, pro la maniero ke ĉi gets taksita, ĝi reale taksas la datetime.now kiam gets enmetita en la datumbazo. Mi pensas ke mi devus duobligi ĉi, sed se vi faris ion tiel, tiam estus reale taksi ke fojo, kaj tiam la DatoTempo ĉiam estus la sama. Do, nur se vi estas faranta ion kun datetimes, duobla ĉeko ke ĝi estas taksi kiam fakte gets enmetita, aŭ alie vi eble estos konfuzita. La titolo estas nur Charfield, kiu tie estas pli argumentoj vi povas pasi en preciziganta precize kiom longe vi deziras ĝin esti, sed ĉi tie, ĝi ne vere gravas. Kaj Teksto tuj estos la teksto de la tuta poŝto, kaj ke tuj esti TextField nur ĉar vi volas por permesi ĝin esti bela longa ŝnuro. Tiam ni havas ĉi Meta subklaso ke nur specifas ke ni volas la datumbazo kie tiu estas efektive malfermis en esti la db celo kiun ni havas tie ĉi. Kaj lasta afero ni havas tie, estas ĝuste tiu funkcio ke ni tuj uzi el niaj ĉefaj app pravalorizi la datumbazo por konekti al ĝi kaj poste krei la Post tablo. Nun, ni rigardu la ĉefa app mem. Do ĉi tiu estas tre iom pli longa ol la ones ke ni vidis antaŭe, sed espereble ne tro malbona. Do, lasu min etendi ĉi ekstere. Okay. Do, rimarki kaj la supro mi importita tuta aro da aliaj aĵoj el Flask ke ni havas ne vere vidis antaŭe. Kaj espereble, ni povas iri tra ĉiu de tiuj por oni kaj paroli iom pli pri ilin, ordigitaj laŭ ekzemplo. Do, ni havas la Flask, kaj la render_template, kion ni vidis antaŭe, tiu peto objekto, kiuj venos supren kiam ni rigardas kiel la formo kiun mi montris reale funkcias. Alidirektila, kiu permesas redirect reen de la Krei novan Afiŝo Reen al la originala hejmpagxo, kaj tiam URL, kiu estas iu kiu permesas elkompreni kie sur la retejo aparta paĝo estas. Tial do, la sekva aferon mi faras, estas mi importado ĉiuj la informo de la Modeloj dosierojn, ke ni nur rigardante. Kaj, jes. Do, io alia nova kiu venas ĝis kiam vi pritraktas, speciale datumbazoj, estas ke vi povas specifi funkcio kiu prenas nomita antaŭ ĉiun peton kaj funkcio kiu alvenas vokis post ĉiu peto, uzante tiun funkcio logejdezajnisto app.before peto. Kaj tiel tio estos get ekzekutita kien tiu funkcio estas. Tio ne devas esti nomita antaŭ peto, sed kutime tio estas io saĝa nomi ĝin. Vi povas specifi ajn funkcio vi deziras akiri pregxis tie, do mi specifita ĉi initialize_db funkcio kiun ni havis reen en la Modeloj dosiero, do antaŭ ĉiu peto, vi volas konektiĝi al datumbazo. Estas du malsamaj manieroj vi povas fari tion. Vi povas fariapp., I kredas ke estas after_request. Kaj la diferenco inter after_request kaj teardown_request, estas ke after_request nur okazos se la peto vere estis valida. Kaj tial, nur se la peto estis sukcesa, se nenio fuŝiĝis, sed teardown_request okazas en la kazo de sukcesa peto, aŭ en la kazo de eraro. Do, kutime, vi volas uzi teardown_request, krom se vi volas fari io, precipe malsamajn en la kazo de eraro. Sed nur por fermi la datumbazo, ĉu ĝi sukcesos aŭ se ĝi malsukcesas, ni ĉu vi volas malkonekti el la datumbazo. Do ĝi nomiĝas, db.close sur la db objekto. Rimarku ke la teardown_request prenas en escepton. Do vi povas kontroli se estis fakte eraro kiam fermante malsupren, sed ĉi tie, espereble, tie ne tuta multo de eraroj, tiel ni nur speco de ignori tion. Okay, kaj la resto de ĝi estas ne tro malbona. Do, kiam ni iros al la hejmpaĝo, ni sendadis ĉi home.html Ŝablono ke malfermos. La enirpermesilo estas en post egala al, kaj kion tiu faras estas, memoru ni havas afiŝo modelo, tiel ni elektu ĉiujn afiŝojn, kaj poste alia afero vi povas fari, vi povas entajpi la KIE klaŭzo, vi povas specifi ordigi de, kaj tial ni preni ĉiuj posts kiu akiri selektitaj, kaj tiam ni ordigi ilin per post.date.descending. Kaj kiu specifas, kiam ili fakte eliru, la plej nova Estos plej unua unu. Kaj poste, ni pasas ke en la home.html ŝablono, do ni vere malfermi ke Ŝablono vere rapida, kaj rigardu kiamaniere tio funkcias. Kaj tio ne grandajn HTML, sed espereble, ni povas enfokusigi la Python. Do tie estas ligo al la Add New Post, kaj tiel ĉi specifas la itinero ene la Flask ke ni difini, kio estas gxusta cxi tie. Tiu estas la nova posteno itinero, kaj ni specifi ke tien. Kaj por ke estas ligo kiu tiam iru al tiu itinero ene la Flask servilo. La pli interesa estas tiu por buklo tie. Do ni specifas ke ĉi post parametron kiu estis pasita en la render_template funkcio, por ĉiu posteno en la post la celo kiun gets pasis en. Ni volas presi la posteno titolo, en H1, kaj tiam sube, ni volas presi la afiŝan tekston ene de alineo. Kaj tie, ni povas reale voki Python funkcio, tiel ni povas nomi strftime, ST-RF-tempo, kaj vi povas pasi en la formato kordoj ke vi volas printi la datumoj en. Do ĝi estas sufiĉe bela, ke vi povas fakte nomas tiun Python funkcio de ene tie. Vi ne devas fari la formatado sur la regilo flanko, ĉar vere, formati la dato estas iu kiu vi volas trakti ene la Vido. Kaj ĉiuj tiuj procentoj aferoj ne estas super grava. Se vi rigardas la dokumentado por la strftime funkcio en Python, ĝi precizigas ĉiuj tiuj aferojn, sed tio estas kiel, kiam ni serĉis ĉe la hejmpaĝo ĉi tie, ĝi formatoj ĉi kun bela dato, kaj ĝi specifas AM aŭ PM, sed normale, se ni ne havis ĉi tie, vi probable akiri iuj rubo dato kiu ne aspektis bonaj. Kaj tiam ni specifi la post.text, kaj mi povis metis kelkajn linisaltojn tie, nur meti iun spacoj inter ĉiu poŝto. Do, mi pensas la plej grava afero en tiu ekzemplo, estas ke vi povas uzi tion por buklo. Kaj tiu estas analoga al aferoj vi povas fari en PHP. Vi povas persisti tra, ĉiu gets pasis en, kaj tiel, anstataŭ devi fari kopio / alglui, kopii / almeti ĉiujn HTML, vi nur devas skribi ĝin unufoje, kaj tiam vi povas persisti super ĉiuj el la afiŝoj. Kaj tio estas io komuna kiu vi volas fari, kiam vi havas multajn datumojn, estas ke por ĉiu en via datumo, vi volas fari similan aferon. Kaj tiam, nur memoras, ke kiam vi volas presi ion eksplicite en la HTML, vi uzas la duoblaj krampoj tie, sed tiam, kiam vi volas specifi kelkaj informoj pri kondiĉo, aŭ pri por ciklo, vi uzi la procento krampo. Do, irante reen al la Python kodo, tiel ke klarigas kio okazas en la ĉefa itinero, kiam ni iru tien, ĝi nur montras la tutan afiŝojn, sed tiam la demando estas, kiel ni reale preni fostoj en la datumbazo, kiu estas iomete pli interesa. Do, kiam vi klakas sur la Nova Afiŝu ligon, kiun ni vidis ĉi tie, ĝi alidirektilojn vi al tiu formo. Kaj tio estas nur simpla alvoko al la render_template funkcio, kiu tiam pasas en la nova post en HTML formo. Do ni rigardu tion. Do ĉi tiu estas sufiĉe simpla. Ĝi havas simplan HTML formo, kiu aspektos iomete familiara, bazita sur la formoj en CS50 Financoj. Kaj do, ni tie specifitaj, la ago. Kaj tie, se vi laboras kun PHP, kutime, ĝi estus iu kiel: create.PHP, sed tie ni fakte specifi itinero ene la Flask servilo. Kaj do, ĉi itinero respondas al la krei itineron ke ni havas ĉi tie, kio ni iros en en dua. Kaj tiel, ni specifi ke ĝi estas fosto metodo, ĉar ni volas sendi tiu formo datumoj, kaj kutime kiam vi sendas datumojn de formo, vi eble deziras uzi post peto, nur do vi ne finos kun tiu granda nelertaj URL. Sed vi povus ankaŭ uzi GET peton, kaj fordoni en variajn enrutamiento, sed por formoj, ĝi estas bela al fosto peton tie. Kaj tiel do, nur ŝatas vin farus kun HTML kaj PHP, vi povas specifi tiujn teksto enigoj, kaj vi povas specifi la nomon de ili, kaj tio estas la nomo kiu estos get pasis en peto objekto ene Flask. Kaj tiam ni havas Submit butono kiu diras Post. Kaj tie, Post estas la nomo de la butono, ĉar ĝi estas la blog, sed tie, post estas peto metodo. Do tiuj estas la sama vorto sed fakte senrilata. Yeah Irante al la Python kodo, kiam ni nomas la metodon krei, rimarki ĉi tie ke vi povas fakte specifi ene la itinero peto metodoj ke vi volas akcepti, do tie, mi specifi ke mi nur volas akcepti Afiŝo metodo. Do, se mi vere provos viziti la paĝon rekte, kiu estas uzanta GET peton, ĝi diras min "Metodo malpermesataj." Do, vi havas paĝojn, ia kiel tiun kreas artikolon, kiu mi estas nur vere uzante kiel rimedon por formo akiri submetitaj, vi povas specifi ke vi faras ne volas ke oni povos iri tien rekte tra GET peton, aŭ se vi ne volas, ial, POST peto, vi povus nur entajpi GET tie, sed en ĉi tiu ekzemplo, ni nur volas la Post peto eliri. Do, kiam create_post nomiĝas, kiam ni vizitu ke tra la Post peto, kiam vi iras al aparta itinero, ekzistas tiu peto objekto, kaj ni devis importi petoj ĉe la plejsupro, Sed tie estas ĉi tiu peto celo kiun gets pasis en, kaj vi povas aliri la formo datumoj, kiu aŭtomate akiri plenigis kiam vi sendas peton de formo. Kaj tiam, kion mi pensas Estas vere cool, estas ke la formo objekto al get pasis en, estas nur Python vortaro ke enhavas, se vi access-- do jen, lasu mi elsxiros la HTML apud ĝi, ĝuste Do vi povas havi tiun kiel referencon, jes, tiel la nomoj kiujn ni tie specifitaj por la malsamaj kampoj, tiel la titolo kaj la teksto, ni tiam nur uzi tiujn ĉi tien kiel indeksoj en la formo de datumoj. Do jen super oportuna. Tial do ni nomas post.create, kiu kreos kaj aŭtomate enmeti tiu nova posteno objekto en la datumbazo. Kaj mi kredas ĉi krei funkcio tie estas vere freŝa ekzemplo de kiel potenca Flask estas kaj laborante kun ĉi, ĉar se vi estis faranta ion en PHP, vi eble devas fari multajn validación, Vi devus tiam establi datumbaza konekto, Vi devus tiam ekzekuti la SQL query, sed tie ni simple havas tiun belan post.create, kiun ni povas do simple akiri la informon eksteren de la peto objekto, kaj tiam pasi ĝin en novan afiŝi ke ni kreas. Kaj tiam, la tre lasta afero ni volas fari, estas al redirekti la uzanto reen al la hejmo. Kaj tial ni uzas tiun Flask redirect funkcio. Kaj iu kiu ni ne vidis antaŭe, estis jena URL funkcio. Do la URL por funkcio ebligas vi pasas en la praktiko la nomo de funkcio en via Python kodo, anstataŭ la aparta vojo ke ĝi estas ĉe. Do mi povis havi same facile redirektita al uzanto oblikvo, kiu sendus ŝin reen hejme, sed uzanta la URL por funkcio estas bela, ĉar se vi ŝanĝas la loko kie aferoj estas, Do diru ke mi ŝanĝas la hejmo esti ĉe / home anstataŭe, tiu estus ankoraŭ tiam revenu / hejmo, ĉar efektive iras kaj rigardas supren la nomo de la funkcio, kaj ĝi donos vin reen la URL por ke. Do, ia sur la antaŭsupozo ke vi estas pli verŝajna por ŝanĝi kie aferoj estas, kiu la nomoj de la funkcioj. Vi povas uzi ĉi vere bela URL por funkcio. Kaj unu afero esti konscia de ke estas iom delikata, estas ke vi pensas vi povus nur voki redirect sur la URL por, sed fakte ĉio el la itineroj havas reveni ia tekston kaj HTML, tiel vi efektive devas redoni la alidirektilo alvokon. Alie, vi devos akiri ion nevalida pri ne revenante cxeno, ĉar ĉiuj tiuj devas reveni la HTML vi vere volas repagi. Kaj tiel, kiam vi nomas la alidirektado, ĝi alidirektilojn vin al la paĝo, sed fakte revenas la HTML vi devas ekzekuti ke alidirektadon. Reiru al la hejmpaĝo. Do ni havas tiujn du malsamajn vidpunktojn. Ni havas la hejmo vido. Aŭ, Mi konjektas min devus diri ŝablonoj. Ni havas tiujn du ŝablonojn, la hejmo ŝablonon kiu vidigas ĉiujn niajn afiŝojn kaj tiam ni havas ĉi ad aferon, kaj kiam vi alklakas la post, ĝi iras al nova itinero ene la Flask, sed tiu itinero ne nepre havas respondan ŝablonon. Vi ne devas vidi nenion, sed vi povas ankoraŭ havi tiun verkon iranta sur malantaŭ la scenoj. Kaj tiam vi akiras nomumata Reen al la ĉefa paĝo. Kaj sendube, estas facile labori en iu agrabla CSS en la ŝablono kaj ke tio aspektas multe pli agrable, sed ĉiuj el la ĉefaj logiko ĉu estas en la Python. Demandojn pri tiu ekzemplo? Mi scias estas multaj malsamaj aferoj okazas tie, Multon ni ne vidis antaŭe, sed kiel ion. Yeah. Spektantaro 1: Ĉu vi devi fari ion speciala al arbustaro la datumojn tio venon de la formo? Mi rimarkis vin diris nur "krei" Ezra ZIGMOND: Yeah, tiel ke estas fakte, tio estas vere bona punkto. Do la demando estis, ĉu vi bezonas kontroli kaj certigi ke la datumoj estas valida, kaj fari omnaspeca scrubbing por certigi ke ĝi estas valida, ĉar kiel vi povas vidi ĉi tie, Mi ne faras tion. Do ni vidu kio okazas se mi afiŝi ion malplenan. Do, gxi devos vere nur fari malplenan fosto kaj plenigu la DatoTempo. Do fakte, vi versxajne volas fari ion kiel, eble specifi se titolo estas egala al la malplena linio, tiam ne faru tion. Aŭ, nur fari tion se la titolo estas ne egala al la malplena linio. Do ĝi faras ne efektive aŭtomate prizorgi ke Profunde lavos por vi, do vi ankoraŭ bezonas fari tion. Jes, bona demando. Spektantaro 2: Ĉu ĝi arbustaroj por sekvo injekto? Ĉu vi scias? Ezra ZIGMOND: Espereble, Peewee faras tion. Mi pensas certe estus bela malbona biblioteko se ĝi ne faros tion. Mi ne scias ekzakte. Mi devas rigardi la konsulti kiu generis. Mi pensas ke, se mi tajpas en blog tian rigardis kiel SQLa injekto atako, io tiamaniere, se tiu estas kiel pasvorto kampo aŭ io, vi eble faros ion kiel tiu. Mi pensas ke ankoraŭ akiri laŭvorte poŝtis, sed mi pensas ke Peewee does fari ia scrubbing de la datumoj antaŭ ĝi efektive ekzekutas lin. Spektantaro 1: Tiu teksto kampo estas desegnita preni plata teksto, ĉu ne? Ezra ZIGMOND: Jes, ĝi estas. Yeah. Do mi pensas, ke ĉiuj el la, do tio estas korekta konduto, kiu faros ke, sed mi pensas ke Peewee espereble faras faras ian protekton sur ilia fino. Kaj se vi volis duobla ĉeko ke, tie Estas manieroj kiam vi generi mendo. tial vi ne devas ekzekuti ĝin rekte. Mi voli devi preni rigardas dokumentaron, sed vi povas fakte vidi la SQLa ke ĝi iras generante, kaj rigardu tion, kaj fari certa, ke ĝi eskapis aferojn. Alia kialo kial vi povus volas rigardi la SQL ke Peewee estas elirigi, estas se aĵoj ŝajnas esti irante vere malrapide, Vi povas rigardi kaj vidi kio ĝi estas fakte faras, ĉar ĝi estas kelkfoje facile hazarde aldonu en, kiel vi skribas, vi povas hazarde havas ĝin elektu la tuta datumbazo unua, kaj tiam fari ian operacion sur tiu, kiam vi vere signifis elekti subaro. Kaj do, se aĵoj ne tute iranta rajton, estas bone rigardu la peton kiu estas reale akiranta generita. Yeah. Spektantaro 2: Kiam vi unue komencis, vi metis en la haveno kiel 5000. Ezra ZIGMOND: Yeah. Spektantaro 2: Ĉu la defaŭlta kun Peewee, aŭ estas, ke io povas ŝanĝi? Ezra ZIGMOND: Jes, do la haveno estas implicite kun Flask. Se vi ruli ĝin sen preciziganta ion, ĝi estos aŭtomate fari tion. Mi kredas, ke mi havas duobligi ĉi, sed vi povas specifi ke en la app.run, Mi kredas ke vi povas fari ion kiel, port = 8080. Ni donu ke provi reala rapida. Jes, do vi povas simple entajpi port = 8080, kaj ĝi kuros ĝin tie, kiu miaopinie, se vi volis kuri ĝin sur la IDE, Mi ne provis ĉi ekstere, sed mi pensas ke se vi kuris sur haveno 8080, vi aperus povos aliri la servilon, nur ŝatas vi estis por la retejo. Jes, sed ĝi estas facile ŝanĝi ke se vi havas ia kiel haveno-plusendado aferoj, kiujn vi devas fari. Aliajn demandojn? Yeah? Spektantaro 1: Do, mi vidis en via modeloj kiuj, kiel vi menciis, Vi devas indiki la datumbazo por ĉiu celo. Ĉu vi hazarde scias, ĉu kiuj faras ĝin vere facila se vi havas multajn SQLite datumbazoj ke vi volas uzi por unu sola retejo app, ke vi povas simple entajpi faskon de malsamaj en via modelo? Ezra ZIGMOND: Jes, lasu min malfermu ke ĝis reala rapida. Do, vi diras, se vi volas havi faskon de malsamaj ion, eble ŝatas kaj la studentoj, por kelkaj Tial io simila? Jes, do mi pensas ke vi retenos, ĉiu modelo devus ankoraŭ havas nur unu datumbazon al ĝi atribuitaj, sed se vi volis havi malsamaj modeloj kiu esti malsamaj datumbazo objektoj atribuita por tio, vi povus definitive fari tion. Do, se mi kreis novan, ion tiel, kaj nun tiu estas studanto ke aspektas strange kiel blog, Mi povus specifi ke la datumbazo egalas db_2 tie. Do, mi kredas ke tio estas la ĉefa vojo vi povas fari tion. Malvarmeta. Aliajn demandojn? Do simple fini supre malgranda iom, jen kelkaj rimedoj, kaj tiuj diapozitivoj estos poŝtita rete do vi povas reale atingi tiujn ligilojn. La plej bonaj rimedoj estas vere la dokumentaro por Flask kaj Peewee sin. Ili skribas vere bone, mi opinias. Do, la Flask retejo estas tie, kaj ili havas Quickstart lernilo ke irados tra similaj aferojn al kio mi povis iri, sed se vi volas omnaspeca revizio el la aĵoj kiujn mi travivis, aŭ vi pensis ke mi klarigis ion en konfuzanta maniero, ili havos similajn ekzemplojn tie. Peewee havas dokumentadon, kaj ili havas Quickstart lernilo kiu iras trans la ĉefa parametroj ke vi volus uzi. Do, tion mi parolis kun la sola, kaj preciziganta defaŭltoj, la malsamaj specoj de kampoj kiuj vi povas uzi, tiuj ĉiuj estus tie. Ankaŭ, se vi havas demandoj pri Peewee, kaj vi afiŝi ilin sur StackOverflow, la ulo kiu faris Peewee reale daŭrigas kaj respondas tiuj kelkfoje. Se vi havas demandon, espereble Li povos respondi gxin, ĉar li verkis la tutan aferon. Mi pensas ke estas ĉio Mi volis kovri. Dankon pro eliranta.