[MUSIC JOC] EZRA Zigmond: Salut, toată lumea. Mulțumesc că ai venit azi. Acest seminar este "Python Web Apps cu Flask. " Deci, am de gând să vorbim un pic despre ce s-ar putea doriți să utilizați pentru a face Flask aplicații web cu Python, spre deosebire unor alte cadre acolo, cum ar fi Django, care este cel mai bine-cunoscut. Subtitlul este "și pitic ", care este ceva vom vorbi despre modul în care pentru a interacționa cu baze de date SQL. Ea face foarte frumos. Deci, aici e doar o consultare rapidă din ceea ce vreau să merg peste. Deci, în primul rând, doar un diapozitiv care va fi QuickStart, care este modul de a obține tot ceea ce instalat pe computer. Am de gând să fie demonstreze acest lucru pe masina mea locale Mac, doar pentru că în cazul în care am făcut acest lucru înainte, eu sunt cel mai confortabil cu ea, dar acest lucru este cu siguranta posibil pe IDE CD50. Deci, după aceea, vreau să introduce ceea ce este Flask, și te convinge de ce ar trebui să-l utilizați în primul rând. Apoi, voi da o scurtă exemplu de ceea ce poate face în Flask, un exemplu rapid de ceea ce se poate face în pitic, și apoi vă voi arăta o mai cerere completă exemplu că am pus împreună pe care le pot merge prin împreună. Și apoi în cele din urmă, în ultimul diapozitiv, am unele resurse pe care le arata la on-line pentru mai multe informații. Aceasta nu este o complet tutorial de modul de utilizare a Flask. Și voi sper să plec ceva timp pentru întrebări. Oricine vizionarea la nivel local, doar cum ar fi, striga în mijlocul Dacă aveți întrebări. Deci, chestii rapid de instalare, dacă doriți să urmeze de-a lungul, sau dacă doriți să obțineți acest pe cont propriu de mașini, Am de gând să fie folosind Python 2.7.10. Balon funcționează cu Python 3, dar îmi place folosind Python 2, pentru că nu e unele pachete Python care nu funcționează cu 3 încă. Dacă ați instalat PIP, care este un manager de pachete Python, Cred că dacă Python este mai mare sau egală cu 2.7.9, aveți instalat deja, e super usor de instalat aceste pachete. Puteți face instala PIP Balon, pip instala pitic, de obicei, trebuie să rulați sudo doar astfel că permisiunile lucra. Și, dacă utilizați un super-versiune veche Python, Vă recomandăm actualizarea Python dvs., sau folosind EasyInstall pentru a instala pip. Deci, următoarea întrebare este, ceea ce este Flask? Și cred că, în primul rând un întrebare rezonabilă M-am întrebat pentru o lungă perioadă de timp este, ceea ce este o aplicatie web? Pentru că e un cuvânt pe care am cred că este aruncat în jurul o mulțime ca nu am știu cu adevărat. Și cred că cel mai bine exemplu de ceea ce o aplicatie web este, într-adevăr este CS50 Finanțe, în cazul în care nu este de fapt doar un site web, dar e ceva ce ar putea fel de a interacționa cu. Există conturi de utilizator și tot felul de lucruri diferite. Deci, unde ai trage linie între ceea ce este un site web, și ceea ce este o aplicatie web, este un fel de arbitrar, dar cred că ideea, e ceva mai mult decât un site web și este o aplicatie utila. Deci, Flask este un cadru pentru făcând aplicații web folosind Python. Și sperăm, până la sfârșitul anului de acest lucru, eu vă va convinge pe care le-ar putea scrie de fapt ceva ca CS50 Finante folosind Python, pe care am ca o mult mai bine decât PHP, personal. Deci, Flask este, ei numesc o microframework, prin care, ei spun că e foarte simplu, dar extensibil. Deci, ea are doar ceea ce ai nevoie, dar daca vrei mai multe caracteristici, este ușor pentru a le aduce în. Dar, doar pentru că e un microframework, nu inseamna ca e doar pentru proiecte mici. Am un link aici care spune că că Obama folosit Flask în 2012 pentru campania sa site-ul, care sperăm, este un fel de aprobare. Dar lucrul pe care am place foarte mult despre Flask este că, aceasta nu face cu adevărat orice fel de decizii pentru tine. Doar pentru că suntem vorbesc despre aplicații web, Am să-l compara cu Ruby on Rails si Django, ambele sunt cadre mari, dar ambele fac presupuneri despre modul în care doriți să interacționează cu bazele de date, modul în care doriți să prezinte dvs. opinii, și sunt sigur aspecte bune la asta. De exemplu, Ruby on Rails are acest sistem de înregistrare activ, care este un foarte frumos modalitate de a interacționa cu date, dar dacă doriți să utilizați Ruby on Rails, te un fel de legat în asta. Dar, cu vasul cum voi vă arată cu pitic, puteți folosi orice fel de baze de date pe care doriți, și puteți trage doar că în ca o extensie în Flask. Deci, de aceea eu chiar ca vasul e că nu face presupuneri pentru tine bazate pe lucruri pe care nu ai nevoie de prea. Deci, de ce ar trebui să utilizați Flask? Avantajele sunt, doar are într-adevăr caracteristicile principale construit în el de care aveți nevoie. Deci, nu trebuie să vă faceți griji cu privire la înțelegerea o grămadă de lucruri că nu într-adevăr nevoie. Nu trebuie să trebuie să vă faceți despre dezactivarea caracteristicile că nu într-adevăr nevoie. Și, așa cum am menționat, e super- ușor să adăugați în extensii de lucruri care aveți nevoie. Unele dintre ele, Flask are propria lor sprijin pentru ea. Deci nu e ceva numit Flask admin, care reflectă faptul că admin panou care Django prevede, care vă oferă un mod vizual frumos pentru a administra site-ul tau. Dar, din nou, dacă ești face ceva simplu, probabil că nu aveți nevoie de un admin mare panou, deci cred că e foarte frumos. Și dezavantajele sunt, ca aveți mai puțină putere din cutie. Deci, atunci când deschideți prima dată Flask, și în programul Python, doar să tastați din Flask import *, sau orice altceva, nu te exact toate caracteristicile ați putea dori. Și deci va trebui să mai explicit lista caracteristicile pe care doriți. Deci asta e un dezavantaj, dar eu cred că pentru construirea de mici web aplicații, cum ar fi Voi fi afișat tu, asta nu e chiar o problemă. Și ce ultimul lucru este ar trebui să spun, care este o greșeală de scriere, este că există mai puțin standardizate convențiile de modul de utilizare a Flask, doar pentru că nu sunt la fel de multe oameni care se folosesc profesional comparativ cu Django. Deci, dacă te uiți ceva de genul, "cum fac X" în Django, veți găsi, probabil,. Nu e bun design modele care le puteți utiliza, dar cu vasul e un fel de du-te în felul tău, doar pentru că este un bibliotecă destul de mici. Astfel încât cei sunt dezavantaje, dar cred că că este încă o bibliotecă bună de a utiliza. Deci, hai să sari direct în balon. Acest lucru este cu siguranta nu merge să fie un tutorial complet, dar este pentru a vă oferi o idee de modul de structurare lucrurile, și așa vă simțiți confortabil de gând off și se uită la documentația și a afla mai multe. Deci, lasă-mă să deschid un adevărat exemplu simplu la început, și vă ce arată că arata ca, si apoi vom rupe-l jos un pic mai mult. Deci asta aici, lasă-mă să-l rulează. Deci, acum am rulează meu aplicație. Am de gând să se deschidă Safari, și se rulează pe gazda mea locală. Așa că am doar de gând să facă acest lucru mai mare. Dar localhost: 5000 Și astfel, chiar acum, toate acestea nu este, atunci când vizitați site-ul, se afiseaza "Hello balon" care nu este foarte util, dar cred că e mișto că în acest mic fișier aici, avem o funcționare server web care imprimă ceva. Deci, să ne uităm de fapt la codul pentru un al doilea, și-l rupe în jos un pic. Este dimensiunea bun pentru toată lumea aici? Deci, sperăm, ești oarecum confortabil folosind Python. Sunt presupunând că ne putem uita la Python și citit prin ea. Dacă aveți întrebări despre ceva, eu pot merge, de asemenea, peste asta. Deci, prima linie este, de la Flask, noi de import, vasul cu un capital "F" care este un fel de tot caracteristici cheie de care aveți nevoie. Ori de câte ori scrii un fișier și utilizarea Flask, ai de gând să doriți să le importați ca, doar pentru că este dotat cu toate lucrurile principale. Următorul lucru ce facem, este ne numesc această funcție Flask, doar pentru a crea un obiect aplicație, și tu ești întotdeauna o să vrei să faci asta. Și apoi, sărind până la jos rapid, această parte aici este, "if_name _ ==" _ main_ "", care este un fel de convenție Python. Deci, aceasta va executa numai dacă rulați acest fișier folosind direct Python. Apoi, noi numim app.run, care va începe efectiv aplicația merge. Deci, asta e structura principală care veți avea în orice aplicație Flask, este va avea acest app = Flask (_NAME_), și apoi app.run. Deci, cele două lucruri pe care am aici, sunt ceea ce noi numim rute. Deci, hai sa vorbim despre rutare un pic mai mult. Mă duc înapoi la diapozitiv. Deci cel mai fundamental concept în Flask este rutare. Și este ideea pe care le aloca funcții în Python la anumite adrese pe pagina de web. Deci, ori de câte ori doriți pentru a crea o nouă rută, utilizați această @ app.route Funcția decorator. Deci, dacă nu sunteți familiarizat cu decoratori funcție în Python, este acest concept care vă permite să luați o funcție și înconjoară cu altceva. Deci într-adevăr, ceea ce face acest decorator, este că este nevoie de funcția de sub ea, și se adaugă mai multe informații la ea, dar ceea ce de fapt Flask se face acest lucru nu este super esențială, dar ceea ce este important, este că, înainte de ruta, ați pune acest @ app.route, și apoi adresa a traseului, astfel încât slash este ceea ce am văzut când ne-am deschide pagina web. Deci asta e pagina. E doar ruta slash. Și apoi ai această funcție. Numele funcției poate fi orice vrei. Aceasta nu trebuie să neapărat au de a face cu traseul. Și apoi, indiferent de întoarcerea functiei, funcția trebuie să returneze un șir. Și că șir poate conțin HTML sau ceva, și că este de fapt ceea ce se va primi a revenit la browser-ului tău ca HTML, și se va face acest lucru. Deci, acesta este același cod care a fost din exemplul care tocmai am fugit, asa ca atunci cand vom vizita slash, o numește o funcție de Hello World, care doar Returnează un șir, Buna, ziua Flask, și care se imprimate pe ecran. Deci există un alt exemplu, care este, atunci când vizitați / Bună ziua, se imprimă pe Hello Word, care ar trebui să spun, de fapt, Hello World, dar hai sa pretindem că a fost intenționat. Deci, haideți să trage asta foarte repede. Deci, dacă te duci la localhost / salut, se va imprima acum altceva. Deci asta e doar un exemplu de cât de rapid puteți crea două căi diferite. Deci, până în prezent acest lucru nu este foarte util, nu există un întreg lot care le puteți face, ai putea face doar tot ceea ce cu având diferite pagini HTML, și atunci când vizitați un anumit Pagina se încarcă doar pagina. Deci, hai sa vedem ceva mai mult lucruri utile care le puteți face. Deci, un lucru pe care ai putea avea observat în exemplul pe care am tras up, este că am app.run (debug = True). Și așa mai departe, ceea ce acest argument depanare nu este că, atunci când rula serverul de web, atunci când sunteți în cererea dumneavoastră, dacă schimbați un fișier, acesta va reincarca automat serverul. Și astfel încât să nu au de fapt să repornire Python, care este foarte util. Pot demonstra că. Lasă-mă să trageți în sus codul meu cu greșeli în ea, și pretinde că a fost pus acolo greșeli în mod intenționat în scopuri instructive. Așa că haideți să adăugați acest nou. Deci, acum se spune Hello World. Voi salva. Și dacă ne-am trage înapoi terminal, veți spune că este repornirea, deoarece detectat o schimbare, și așa acum, când ne-am reîncărcați această pagină, se va imprima un lucru corect. Deci depanare este foarte util pentru asta. De asemenea, dacă aveți orice un fel de accident, astfel încât lasă-mă să fac acest accident cerere de a avea nu-l întoarcă un șir. Deci, hai să-l aibă Nici unul reveni pentru un motiv oarecare. Și apoi, când am vizita acest pagină, se va prăbuși doar, dar serverul nu doar accident, ea de fapt, vă oferă o înapoi foarte util urme de tot ceea ce a mers prost. Si ceea ce este foarte frumos, este că la orice pas în această înapoi urmă, ai putea deschide un interactiv coajă aici, și un fel de a imprima ce variabile pe care doriți să aruncăm o privire la. Și așa este într-adevăr depanare util pentru imaginind ceea ce se întâmplă cu dumneavoastră Server, mai degrabă decât doar a vedea ceva in PHP ca un intern de 500 eroare de server, care este super inutil. Un lucru să fie conștienți de, este că, dacă ai pus aplicația online asa ca e vizibil pentru public, ai Nu vrea să plece modul de depanare pe, deoarece oamenii pot de fapt folosi acest consolă pe care am arătat să execute cod arbitrar. Astfel încât să poată tipări la fel ca orice coduri secrete care le au acolo, se pot uita la exact cum site-ul dvs. este de lucru. Deci, este foarte util pentru testare, dar întotdeauna asigurați-vă că să-l ia înainte când publicați ceva on-line. Deci, atunci când utilizați ceva ca PHP, există această idee pe care le poate trece informații între paginile web prin punerea informațiilor de fapt în URL-ul, care este o cerere GET, dar in Flask, puteți de fapt face ceva un fel de genul asta, printr-un traseu care are o variabilă ca o parte din el. Deci, dacă te uiți la acest exemplu pe ecran aici, avem un traseu care este ("/ Bună ziua /"), și așa mai departe, dacă vizitați / Bună ziua / ceva, acel ceva este mergi la a lua efectiv ocupate în variabila nume. Și observați că funcția care vine cu această rută trebuie să ia în parametrul nume, astfel încât acesta va efectiv se trecut în funcția. Și apoi, odată ce ești în interiorul acestei funcții, puteți trata ca la fel ca o variabilă normală Python, și așa, atunci, acesta va imprima Bună ziua, și-l va completa numele folosind unele formatare șir. Deci, pentru a adăuga piesele variabile la un rutare, utilizați suportul unghi de marcare. Și opțional, puteți folosi ceea ce se numește un convertor. Și așa, dacă ai pus acest adnotare cu colon, aveți posibilitatea să specificați că este un int, sau un flotor, sau cale, și se va converti automat că. Puteți face, de asemenea conversia în funcția de Python, doar prin utilizarea unui exprimate, dar, uneori, în cazul în care doriți să vă asigurați că este un int, puteți pune asta regulă de conversie acolo. Deci, haideți să trageți în sus un exemplu a unor reguli variabile. Deci, aici, acest lucru are același de bază structură cu de la Flask import Balon, App = balon (_NAME_), și apoi se rulează la sfârșitul anului. Avem aceste două diferite trasee variabile aici. Și primul, este cea pe care am aratat în diapozitiv, care a fost că Este nevoie de doar un nume șir și se va tipări Bună ziua, numele. Apoi, a doua se folosește conversia. Deci, acest lucru se va converti automat la un int, iar apoi dublu int, și imprima asta. Si, nu facem nici un fel de conversie în cadrul acestuia deoarece Flask are grijă de asta. Așa că hai să această alergatul. Când aveți un balon funcționare cerere, Puteți controla-C din ea pentru a opri rularea serverului. Și apoi voi alerga variabilele. Așa că hai să mergem la localhost / salut / Ezra și sperăm, va salut la mine. Așa că a luat în numele meu, în variabila traseu, și a umplut aici. Așa că voi arăta, de asemenea, un rapid exemplu de dublarea. Deci, dacă te duci la / dubla / 3, se va imprima 6. Deci, această a avut grijă de conversia pentru noi. Astfel încât să puteți, de asemenea, face acest lucru cu float, și ceva special, dacă aveți nevoie să specificați ceva de genul o cale, care îi permite să accepte slash-uri, dar că nu ar trebui să fie, de obicei, o problemă. Până acum am, încă tocmai a fost revenind siruri de caractere, care nu este foarte interesant. Am putea întoarce de fapt șir HTML literal. Deci, în codul putem introduce ceva cum ar fi b-tag-ul pentru a face bold, dar cel mai mult timpul pe care îl Nu vreau de fapt pentru a fi scrierea de cod HTML în codul Python. Aceasta devine foarte murdar, și nu e un moment bun. Flask ne permite să se separe afară HTML în ceea ce se numește șablon, și așa mai departe, dacă sunteți de gândire în ceea ce privește modelul MVC că ești familiarizat cu, sperăm, de la lucru cu CS50 Finance un pic, vă puteți gândi la fișierele Python ca fiind mai mult Controller, în cazul în care ele interacționează cu orice model de date s-ar putea avea. Și apoi ei sunt de asteptare la Vizualizări și care trece informații în acest Vizualizare la completați informațiile în HTML care are nevoie. Și ceea ce noi numim aceste opinii sunt Șabloane din clasa. Deci, Flask folosește un alt Python modul care se va automat instala atunci când instalați Pip Balon numit Jinja, care vă permite să adăugați aceste adnotări la HTML pe care le vedeți pe ecran, care vă permite ai pus în lucruri cum ar fi condiționale, și buclele în HTML. Deci, se pare un pic ca modul în care s-ar putea folosi PHP într-un fișier HTML, dar aceasta este doar atunci când balonul serverul servește fișierul HTML, va rula acest motor templating și analiza prin această și completați lucruri. Deci, Flask are o funcție render_template pe care le puteți vedea în partea de jos de aici. Și așa, atunci când vizitați această pagină, ar face acest șablon hello.html, și apoi completați în această pagină HTML. Deci, hai să executați acest reală rapid, și să vedem ce se pare ca, și apoi voi merge printr-o pic mai în detaliu. Deci, șabloanele vor pentru a merge într-un folder Șabloane. Se va arăta în mod automat în Template-uri folder pentru că Format. Așa că haideți să deschide acest sus. Deci, voi alerga exemplul templating. Deci, dacă mă duc la / Bună ziua / Ezra, are acest oribil, tag marquee respingător că mi-am pus în. Foarte frumos, foarte dinamic. Sunt un mare fan. Dar ce se întâmplă dacă Mă duc la, / salut? Deci, doar spune Hello World. Nu am să-l dați un nume, și îl completat în mod automat. Deci, hai sa vedem cum a făcut-o ca și cum putem scăpa de care cadru de selecție poate. Deci, aici, aceasta este un fel de un exemplu interesant de, dacă sunteți familiarizați cu modul de comutare Declarații lucra într-o limbă. Spun acest lucru este un fel de, acest fel de o scădere prin, în cazul în care de fapt doi atașat rute diferite pentru aceeași funcție. Așa că am atașa / salut ruta și A / salut / nume traseul Buna ziua, și ne-am specifica using-- Python vă permite să specifica funcția implicit arguments-- deci, dacă nu există nici un nume, asa ca dacă mergem la doar / salut, se va filtra în mod automat la numele este egal cu None. Deci, vom aduce, în Șablon cu name = numele, asa ca va trece în parametrul nume egală cu acest parametru funcție nume, în șablonul. Asta încă nu explică cum este decide dacă să imprimați Hello World, sau imprima numele meu. Așa că haideți să ne uităm de fapt în șablonul în sine, si vezi in care vine de la. Deci, în acest șablon, am au de fapt unele logica condiționată, care unii oameni ar susțin, de fapt nu ar trebui să aibă o mulțime de condiționate logica în Template-ul în sine. Ar trebui să fie mai în Controller, dar pentru acest exemplu e ceva destul de mici. Deci, aici, vom verifica, în cazul în care numele, așa dacă numele nu este egal cu Nici unul, Dacă un nume de este, de fapt a trecut în, atunci vom salut, Numele cu antet și selecție, Toate acestea HTML normale, în caz contrar, vom imprima Hello, World doar în mod normal. Deci, câteva lucruri pentru a observa aici despre modul în care formatați templating, este faptul că, toate aceste Declarații condiționale, un fel de modul în care l-am atunci când PHP doriți să inserați unele PHP, utilizați mai puțin decât întrebare marca, e un fel de analog aici cu {%. Deci, aici, avem codul nostru condiționată. Și apoi, atunci când doriți de fapt la evalua literalmente ceva, și de imprimare l la ecran, utilizați duble acolade. Deci, aici sunt duble acolade, și apoi ne-am specificați numele, astfel în acest, se va evalua la numele variabilei, care a fost adoptată de pe face funcția de șablon, mai degrabă decât doar de imprimare out, dacă am scăpat de aceștia, s-ar imprima doar din cuvântul "nume". Deci, asta e ceva să fiți atenți pentru. Deci, un alt lucru pentru a observat este faptul că, atunci când ne doriți să utilizați Funcția render_template, avem de fapt, de a importa se în mod explicit de la balon. Și acesta este un exemplu de modularitatea Flask, care nu trebuie să importe lucruri pe care nu aveți nevoie. Puteți aduce doar in Funcțiile de fapt aveți nevoie de, care este uneori frumos, astfel încât să nu trebuie să aibă toate aceste funcții ședinței în jurul valorii pe care nu îl utilizați, dar, de asemenea, dacă vă uitați pe care le sa importam render_template, veți obține, probabil, un avertisment care va lasa sa stii despre asta. Deci, care este templating. Deci, ne-am arătat cum să face pagini web simple, și a adăuga un pic mai mult logica pentru a l, în ceea ce privește traseul variabilă. Acesta vă permite să faci lucruri diferite în funcție de ce URL-ul te duci la, și, de asemenea, apoi, da HTML un pic mai mult sens în Termeni de modul în care doriți să facă lucruri. Nu trebuie să pună toate HTML în Python ta, dar pentru destul de mult fiecare aplicație web, ai de gând să vrea un fel de model de date asociate cu acesta. Și astfel în mod tradițional, acest lucru ar fie ceva de genul o bază de date SQL. Și puteți interacționa doar direct cu SQL. Python are, cred că se numește. SQLite 3. Puteți importa doar SQLite 3 și executa interogări SQL direct, dar nu știu despre tine, dar eu chiar nu-mi place, doar, scriind interogări SQL. Ea tinde să obține cu adevărat lungă și complicată. Și astfel, ceva ce Imi place sa folosesc este ceea ce este cunoscut ca un ORM, care este un -obiect relational mapping. Și scopul unei cartografiere-obiect relational, este că există două diferite modalități vă puteți gândi despre bazele de date. Deci exemplul pe care Profesorul Malan, de obicei, folosește în clasa, este tabelul Excel, în cazul în care aveți aceste rânduri și aceste coloane, și că este foarte util pentru modul în care este reprezentată în SQL și modul în care interacționați cu el, dar un alt mod că este de fapt util să se gândească la ea, uneori, este în termeni de clase și obiecte. Deci, în loc de gândire de fiecare masă ca având acest rând că are anumite informații, puteți de fapt cred că de ea ca fiind fiecare masă este o clasa, și apoi la fiecare instanță a clasă are anumite proprietăți. Astfel, în acest exemplu, cazurile de clasa sunt rândurile din tabel, și apoi fiecare proprietate ar fie o coloană în tabel. Deci, ORM că-mi place de a utiliza se numește pitic. Este foarte mic, un fel de balon. Cred că ei merg bine împreună, dar există o mulțime de alte ORMs pe care le puteți folosi. Un unul mai popular este cunoscut sub numele de SQLAlchemy, și nu-mi amintesc de ce am început ales pitic peste SQLAlchemy, sau v-aș ce am spus cred că e cel mai bun, dar noi suntem doar de gând să utilizeze acest o pentru că știu cum să-l folosească. Deci, o întrebare este, de ce ar trebui să vă deranjez folosind un ORM, în loc de doar direct scris interogări SQL? Și cred că cel mai bun caz, este că nu face de fapt trebuie să scrie interogări SQL. Este mult mai ușor, după cum vă voi arăta, la fac lucruri cum ar fi de selecție, de inserție, ștergere, în special crearea de tabele. Este mult mai ușor să scrie o structură de clasă, decât este de a structura un Creați Declarație de masă, dar un lucru să fie conștienți de, este că ORM va încerca cele mai bune să dau seama ce cel mai mult interogare SQL eficient ar fi, dar, uneori, devine greșit. Și mai ales dacă sunteți de lucru cu o bază de date mare, se poate observa că o interogare care ar trebui să fie difuzate rapid, este, de fapt durează mai. Și dacă te uiți sub capotă la modul ORM este interpretarea care în SQL, s-ar putea face ceva într-adevăr ridicol, doar pentru că un fel de făcu semn intențiile greșit. Și, au fost momente in care Am avut să-l trece peste, și doar executa propriile mele interogări SQL, doar pentru că a fost analiză într-un mod ciudat. Deci, există o anumită deasupra, doar în modul în care că compileaza dvs. Declarații în jos în SQL. Deci, să ne uităm foarte repede la un simplu exemplu de un model de date pe care le-ar putea folosi. Deci, acest lucru este cod Python, și așa mai departe Primul lucru pe care doriți să faceți este de import pitic *. Deci, spre deosebire de Flask, în cazul în care aveți toate aceste module individuale, și doriți să le importați balon și scrie un șablon, iar altele că vom vedea mai târziu, de la pitic, puteți importa doar totul, pentru că este o bibliotecă destul de mici. Deci, primul lucru pe care doriți să faceți, este crea de fapt acest obiect bază de date. Deci, ai db = SqliteDatabase, și apoi numele bazei de date. Iar acest lucru va de fapt a crea un obiect de bază de date pe care le poate interacționa cu, cu pitic. Și apoi, avem real Modelul pe care ne-o dorim pentru a crea. Deci masa dorim să creăm. Deci, în cadrul pitic, fiecare clasă are propria masă în baza de date. Deci, toate clasele moșteni de la modelul de bază, și modelul de capital M este ceva ce este definit în pitic. Deci, toate modelul ar trebui să moșteni ca cea mai mare superclasă lor, acestea ar trebui să moștenească de la modelul, dar ceea ce e foarte misto, este că puteți avea de fapt, dvs. Modelele moșteni unul de celălalt. Și o mulțime de timp, dvs. modele de date nu neapărat face o ierarhie moștenire frumos, dar ori în cazul în care o fac, e foarte frumos, pentru că aveți modelul inerent unul de celălalt. Deci, am definit această clasă "elev", care moștenește un model, și are trei proprietăți. Ea are o identitate, care este o PrimaryKeyField, care este ceva care este asigurat de pitic, numele este un CharField, și un grad este un IntegerField. Deci acest lucru poate sau nu poate fi cum CS50 fapt stochează toate clasele elevilor. Nu este, dar acest lucru este cum mi-ar face. Și apoi le-a, în cadrul această clasă, și această este ceva ce se poate face cu Python, puteți avea clase imbricate. Și acest lucru este ceva care este cerut de pitic. Deci, această clasă Meta, aveți să se precizeze că baza de date este egală cu obiectul că am creat mai sus. Și acest spune fisier este acest tabel de fapt de gând să fie incluse în. Deci, aceasta este ceva care aveți să facă în toate modelul. Trebuie doar să specificați în această clasă Meta că baza de date este egal cu db. Deci, ce fac de obicei, dacă am o grămadă de modele diferite, este că am o bază model pe care eu de obicei numesc doar "model de bază" care are clasa Meta, și stabilește baza de date egal cu db. Și apoi toate modelele mele ulterioare vor moșteni de la această clasă de bază. Și apoi nu am să vă faceți griji despre setarea clasa Meta. Deci, atunci când acest lucru devine de fapt compilate în jos, în o instrucțiune SQL, se pare ca acest lucru urât în ​​jos aici, "Creați tabelul de student ID-ul întreg, " tot ceea ce. Și, cred că este mai scurt, această interogare SQL aici, dar dacă te uiți la această clasă aici puteți vedea exact ce se întâmplă. Puteți vedea ce fel de câmpuri există, ceea ce ei se numesc, și așa, cred că se uită la acest cod Python este mult mai ușor de citit decât încercarea de a scrie această interogare SQL. Deci, în scopul de a efectiv utilizează baza de date, trebuie să se conecteze la acesta, în Python. Deci, de obicei, scriu o funcție numită initialize_db care face două lucruri. Este nevoie în baza de date db obiect și se conectează la ea, care se deschide doar SECȚIUNEA la baza de date. Dacă sunteți doar execută, deși site-ul de pe computerul local, aceasta nu este o afacere super-mare să vă faceți griji despre conectarea și deconectarea, dar dacă se execută l pe un site web, doriți să vă asigurați că, ori de câte ori un utilizator se conectează la ea, atunci când închide site-ul, ei deconectați astfel încât să nu au o grămadă de persoane conectate la baza de date dintr-o dată. Și apoi, când conecta la baza de date, doriți să apelați db.create_tables, și lista modelelor de ceea ce vrei pentru a crea tabele. Deci, aici, vreau doar să crea o pentru acest elev. Și apoi, ceea ce este important, este acela de a specificați în condiții de siguranță = True cel mai mult timp. Deci, ce această declarație va face, este faptul că creeaza tabele pentru modelul elev, dar numai Dacă masa nu are fost create deja. Asta e ceea ce se precizează în condiții de siguranță. Deci nu va suprascrie tabel existent, se va crea doar un nou tabel dacă nu există o acolo. Deci, ai putea crea doar tabelele dată folosind SQL. Și apoi au ca bază de date de zi acolo, și apoi conectați la fiecare dată, dar este, de obicei frumos doar pentru a pus în acest apel create_tables, astfel încât, dacă ștergeți vreodată ta de baze de date atunci când executați dvs. de web app din nou, îl va recrea. Deci, asigurați-vă doar că în condiții de siguranță este specificată să fie adevărat, sau veți găsi datele doar obtinerea clobbered de fiecare dată. Și apoi, puteți apela doar initialize_db pentru a stabili o conexiune, și de a crea tabele, dacă este necesar. Deci, cel mai comun lucru pe care le va dori să facă, sau unul dintre cele mai comune lucruri, este de a insera de fapt lucrurile în baza de date. Și astfel, mai degrabă decât pentru a scrie un insera în declarație cu toate valorile specificate, puteți apela de fapt, Funcția pe clasa de student. Deci, atunci când vă creați o clasă care moștenește de la modelul, are această metodă a crea. Deci, ce faci de clasă name.create, și specificați parametrii pe care doriți să treci în. Deci, dacă vreau să adăugați unii elevi nostru exemplu de carte grad CS50, Voi pune în David, care are un grad foarte bun, el are un 95. Și eu, care nu face atât de bine în CS50, am 50. Și astfel, lucrul frumos despre ceea ce face această funcție a crea, este că se întoarce instanța, sau rând, că a creat în tabel, și așa mai apoi stocați că într-un variabilă, și locul de muncă cu el mai târziu. Puteți schimba în jurul valorii, care Voi arăta un exemplu de. Observați că nu am făcut trebuie să specificați ID-ul, pentru că din moment ce este PrimaryKeyField, se va în mod automat incrementa aceasta dacă nu-l specificați. Și, de fapt, probabil nu ar trebui să specifice, pentru că s-ar putea accidental rescrie ID altcuiva. Și doriți să faceți sigur că este unic. Majoritatea așa, De fapt, lucru comun vrei să faci, este, probabil, selectați din bazei de date După ce au o mulțime de informații acolo. Și astfel, dacă doriți să obțineți totul, astfel încât echivalentul a select stele din declarația studenți, ea ar fi doar student.select. Și care vă va oferi înapoi o serie cu toate studentului obiectelor în ea pe care le repeta peste vrei. Puteți obține lucruri din ea. Și de cele mai multe ori, Nu vreau doar să selectați, tu de fapt vrei să specificați ceva. Și astfel, puteți lanț Împreună, aceste apeluri de funcții, ca și cum v-ar lanț împreună declarațiile din SQL. Astfel încât să puteți face student.select (). În cazul în care în acest exemplu. Și apoi, puteți precizează condițiile, folosind doar Python normală Booleans pentru a verifica lucrurile. Deci, în acest caz, pe care doriți să limita ceea ce selectarea la, unde student.grade este egal cu 50, și student.name este egal cu Ezra, astfel că va primi doar eu din ea. Și observați, unul cu adevarat lucru subtil aici este că, în cazul în care doriți să specificați o și / sau o și / sau sau, în Python, ar trebui să utilizați în mod normal, Cred că cuvântul "și" de fapt, dar aici utilizați ampersand unic, care este în mod normal un operator de biți, dar în acest caz special, doar modul în care o face pitic, utilizați single ampersand pentru a specifica "și." Asta e ceva ce I a lua amestecat o mulțime, dar nu veni atât de mult în practică. Și apoi, odată ce aveți toate elevii din baza de date, Odată ce ați făcut că ești selectați și uzura sau orice altceva, aveți posibilitatea să utilizați o buclă foreach, la fel cum ar fi normal în Python, cu orice fel de iterator sau cu orice fel de matrice. Astfel încât să puteți face, pentru s în student.select (). whe re (Student.grade <75), și astfel încât aceasta va repeta peste fiecare elev în tabelul a cărui grad este mai mic de 75, care în acest caz, este încă doar eu. Și apoi ai putea face ceva în că bucla, ca trimite-mi un e-mail și spune-mi de fapt, rândul său, în seturi problema mea. Deci, un alt lucru pe care poți face, este foarte ușor să actualizeze rânduri în tabel. Deci, amintiți-vă înapoi aici, atunci când am introdus, Am luat valoarea pe care a fost întors de student.create, și l-am atribuit numele numit Ezra. Și așa acum, aveți posibilitatea să modificați valori în acea instanță, la fel ca tine ar fi un clasă normală în Python. Astfel încât să puteți seta ezra.grade = 95 și că va actualiza copia locală, dar dacă doriți de fapt la angajeze că schimbările la baza de date, aveți pentru a apela ezra.save, așa te-a chemat metoda .save pe instanța. Și așa acum, mi-am schimbat cu succes mea clasa proprie în baza de date. Deci, atunci să spunem că am prins schimbarea de grad mea în baza de date. Profesorul Malan este, probabil, va să vrei să mă ștergeți din clasa, și astfel încât să puteți apela .delete Metoda exemplu doar pe chestia aia. Deci, dacă ai vrut să mergi înapoi în această buclă aici, și de fapt, în loc să de trimiterea de emailuri toate a studenților a căror grad este mai puțin mult de 75, ai vrut să le ștergeți, în această buclă ai putea suna exemplu s.delete. Și ultimul lucru pe care doriți să faceți, ori de câte ori este a stabili o conexiune, și ați terminat cu munca ta, doriți să apelați db.close, în cazul în care este baza de date db obiecta că am avut-o înainte. Și doriți să vă asigurați că totul se închise din. Misto. Deci, acum, am o cerere exemplu. Am un fel de pre-a făcut totul doar așa că nu va fi nici codificare vii greșeli, dar putem trece prin l și vezi cum te-ar pune Flask și pitic împreună, și să facă o aplicație simplă. Eu o numesc CS50 declama, și este un fel de platformă simplă blog. Deci, în primul rând, voi rula și arată ceea ce pare, și apoi ne putem uita mai mult în codul. Bine, hai să executați acest. Rece, voi face acest lucru un pic mai mic. Nu e foarte frumos, doar pentru că Nu am face o mulțime de CSS, dar ceea ce face este, are această bază de date de blog, și merge prin toate ei, și le va afișa pe pagina în ordinea cele mai recente. Și astfel încât acestea sunt doar unele posturi că am salvat in baza de date. Deci, dacă dorim să creăm o nouă poștă, putem merge pentru a adăuga un Mesaj nou, și putem intra în titlul poștă, așa ceva de genul, seminar CS50. Wow, într-adevăr se bucură de seminar. Misto. Apoi, aveți de presă de după, și va vă redirecționa înapoi la pagina de start, și apoi veți vedea că S-a adăugat ultimul mesaj. Și mai avem încă toate cele de acolo. Deci, acum, hai să pas prin toate Codul și a vedea cum acest lucru este pus în aplicare. Deci, cred că primul lucru pe care să să ia o privire la, este, de fapt modele. O mulțime de timp, atunci când sunteți proiectarea ceva, vrei să se gândească mai întâi despre modul ai de gând să reprezinte datele tale, și apoi de design lucrurile din jurul faptul că, astfel încât totul are sens. Și care este de fapt modul în care am a făcut-o când am fost a face acest lucru, M-am așezat și gândit, ce vreau intr-un post. Deci, aici, avem aceeași structură că am fost menționat mai devreme, în cazul în care vom face db = Sqldatabase ('posts.db "). În realitate, probabil că nu vreau Codul de greu în bazele de date numele dumneavoastră. Asta ar trebui să fie, probabil, un parametru care este stocat undeva, poate într-un fișier de configurare, dar în un mic exemplu de acest fel, e bine să cod greu faptul că, în. Deci, acum, avem această clasă Post, care moștenește de la modelul de bază. Și are, nou, ID = PrimaryKeyField. De fapt, dacă nu se specifică, dacă am de fapt scăpat de acest lucru, atunci pitic vom avea grijă de crearea în mod automat acest domeniu ID, și se va în mod automat fac din el un primaryKey, care Cred că este foarte frumos, pentru că de obicei, asta e ceva ce vrei sa ai, dar îmi place să-l pună în mod specific, doar așa îmi amintesc că este acolo. Dar, dacă nu se specifică faptul că, că va fi acolo în mod automat. Deci, am o dată care este un DateTimeField, și toate aceste domenii diferite, dacă uita-te la documentația pitic, o să vă oferi o listă de diferite tipuri de câmpuri pe care le puteți utiliza. Pentru cea mai mare parte, este analog a ceea ce ar vedea în SQL. Deci, există o CharField, un VarCharFields, casetele de text, care sunt pentru mult timp texte, cum ar fi un post pe blog potențial, DateTimeFields, DoubleFields, FloatFields, toate lucrurile de genul asta. Și vă puteți trece în alte argumente la ea, pe care eu nu a specificat aici. Spune, de exemplu, nu a vrut să permite două posturi să aibă același titlu, ai putea specificați ca unic ceva = Adevărat, Si acesta este doar un parametru suplimentar pentru domeniul că, atunci când se compilează jos în SQL, se va specifica care trebuie să fie unic. Asemenea, puteți specifica ceva de genul nu nul și toate celelalte lucruri ce faci în mod normal în SQL. Deci, aceasta este o destul de simplu model care are data. Observați aici, în cadrul DateTimeField, Am specificat ce implicit este. Am specificat să fie datetime.datetime.now, din cauza modului în care acest lucru este bine evaluată, evaluează de fapt datetime.now când acesta devine introdus în baza de date. Cred că, ar trebui să verificați acest lucru, dar dacă ai făcut ceva de genul asta, atunci ar evalua, de fapt că, odată, și apoi ora si data ar fi întotdeauna aceeași. Deci, doar dacă faci ceva cu datetimes, verificați că este evaluarea, atunci când de fapt devine introdus, sau s-ar putea fi confundat. Titlul este doar un CharField, care nu mai multe argumente puteți trece în specificând exact cât de mult vă vrea sa fie, dar aici, nu a prea contează. Și Text va fi textul întregii post, și care va fi un TextField doar pentru că vrei pentru a permite ca acesta să fie un șir destul de lung. Apoi, avem acest Meta subclasă care tocmai specifică faptul că ne-o dorim baza de date în cazul în care acest lucru este, de fapt deschis în să fie obiectul db pe care o avem aici. Și ultimul lucru, avem aici, este doar această funcție că vom utiliza din aplicația noastră principală pentru a inițializa baza de date pentru conectarea la l, și apoi pentru a crea tabelul Poștal. Acum, să ne uităm la aplicația principală în sine. Deci aceasta este destul de un pic mai mult decât cele pe care le-am văzut înainte, dar sperăm că nu prea rău. Deci, lasă-mă să extindă acest lucru. Bine. Deci, observați și în partea de sus am importat o grămadă de alte lucruri de la Flask că nu am într-adevăr văzut înainte. Și, sperăm, putem merge prin fiecăruia dintre aceste unul câte unul și vorbesc un pic mai mult despre le, de exemplu sortate. Deci, avem balonul, și render_template, pe care le-am văzut înainte, acest obiect cerere, care va veni atunci când ne uităm la modul în care forma pe care am fost de fapt arată fabrică. Redirect, care vă permite să redirecționați înapoi de la Create New Post, înapoi la pagina principală originală, și apoi URL-ul, care este ceva care vă permite să dau seama unde anume pe site-ul o anumită pagină este. Deci, în următorii lucru pe care îl fac este să import toate informațiile de la modelele fișierele care am fost doar uita la. Și, da. Deci, ceva nou care vine când ai de a face cu, în special baze de date, este că puteți specifica o funcție care este chemat în fața fiecare cerere, și funcția care devine numit după fiecare cerere, folosind acest Cererea funcție decorator app.before. Și așa va primi executat ori de câte ori aceasta functie este. Acest lucru nu trebuie să fie chemați în fața cerere, dar de obicei asta e ceva sensibil să-i spunem. Puteți specifica orice funcție vrei să te chemat acolo, așa că am specificat acest initialize_db funcție care am avut din nou în modelele fișier, astfel încât înainte de fiecare cerere, vă doriți să vă conectați la baza de date. Există două diferite moduri în care puteți face acest lucru. Puteți faceapp., Am cred ca e after_request. Și diferența dintre after_request și teardown_request, este că se va întâmpla numai after_request în cazul în care cererea de fapt a fost valabil. Și astfel, numai în cazul în care cerere a fost de succes, dacă nimic nu a mers bine, dar teardown_request întâmplă în cazul unui succes cerere, sau în cazul unei erori. Deci, de obicei, pe care doriți de a utiliza teardown_request, dacă nu vrei să faci ceva, mai ales diferit în cazul unei erori. Dar doar pentru închiderea bazei de date, indiferent dacă reușește sau dacă nu, facem doriți să vă deconectați din baza de date. Deci se numește, db.close pe obiect db. Observați că teardown_request ia într-o excepție. Astfel, puteți verifica dacă există a fost de fapt o eroare când a fost închiderea, dar aici, sperăm, nu nu sunt o mulțime de erori, așa că doar un fel de a ignora acest lucru. Bine, iar restul de ea nu este prea rău. Deci, când vom merge la pagina de start, am făcut acest șablon home.html care se va deschide. Pasa este în post egal cu, și ceea ce acest nu este, amintiți-vă, avem acest post Modelul, asa ca am selecta toate posturile, și apoi un alt lucru pe care il poti face, puteți specifica clauza WHERE, aveți posibilitatea să specificați o comandă de, și așa vom lua toate posturile care obține selectat, și apoi le comanda de post.date.descending. Și care se va preciza, atunci când au venit efectiv, cel mai recent va fi foarte primul. Și apoi, vom trece că în șablonul home.html, Să fapt deschide că Format într-adevăr rapid, și să ia o privire la modul care este de lucru. Și acest lucru nu este mare HTML, dar sperăm, ne putem concentra pe Python. Deci, există o legătură către adăuga noi Post, și așa mai departe acest specifică ruta în vasul pe care le defini, care este chiar aici. Acesta este noul traseu poștă, și ne-am specifica faptul ca aici. Și așa că este un link care va merge apoi pentru că traseul în serverul Flask. Mai interesant lucru este acest lucru pentru bucla aici. Așa că am specifica faptul că acest parametru post care a fost trecut în Funcția render_template, pentru fiecare post în Post obiect care devine trecut în. Vrem să imprime titlul post, în H1, și apoi mai jos, dorim să imprime textul mesaj într-un paragraf. Si aici, putem de fapt apela o funcție Python, astfel încât să putem apela strftime, ST-RF-time, și puteți trece în șirul format pe care doriți să imprimați datele în. Deci, este destul de frumos pe care puteți numesc de fapt, această funcție Python din interior aici. Tu nu trebuie să faci formatarea pe partea controler, că într-adevăr, formatarea data este ceva care vrei să se ocupe în View. Și toate acestea la sută lucrurile nu este super important. Dacă te uiți în sus documentația pentru funcția strftime în Python, specifică toate acestea lucruri, dar asta e cum, atunci când am fost în căutarea la pagina de pornire aici, se formatează acest lucru cu un frumos data, si se specifică AM sau PM, dar în mod normal, dacă ne-am nu au avut acest aici, veți obține, probabil, unele de gunoi dată care nu arata foarte bine. Și apoi ne-am specifica post.text, și am putut au pus o pereche de linie sparge aici, doar pentru a pune niște spații între fiecare post. Deci, cred că cel mai important lucru în acest exemplu, este că puteți folosi acest lucru pentru bucla. Și acest lucru este analog lucruri pe care le puteți face în PHP. Puteți repeta prin, totul devine trecut în, și așa mai departe, în loc de a avea de a face copy / paste, copy / paste toate HTML, trebuie doar sa-l scrie o dată, și apoi puteti repeta peste toate posturile. Și acest lucru este ceva comun pe care doriți de a face, atunci când aveți o mulțime de date, este că, pentru tot ceea ce, în datele, vrei sa faci un lucru similar. Și apoi, doar amintiți-vă, că atunci când doriți să imprimați ceva în mod explicit în HTML, utilizați duble acolade aici, dar atunci când doriți să specificați unele informații cu privire la o stare, sau despre o pentru buclă, tine utilizați suportul la sută. Deci, merge înapoi la Python cod, astfel încât explică ceea ce se întâmplă în principal traseu, când vom merge acolo, doar afișează toate posturi, dar apoi problema este, cum putem obține de fapt, posturi în baza de date, care este un pic mai interesant. Deci, atunci când faceți clic pe Nou Mesaj link, pe care am văzut aici, te redirecționează la această formă. Si acesta este doar un simplu apel la Funcția render_template, care apoi trece în noul post în formă HTML. Deci, haideți să aruncăm o privire la asta. Deci aceasta este destul de simplu. Ea are o formă simplă HTML, care va arata un pic familiar, pe baza formularelor din CS50 finanțe. Și astfel, am specifica aici, acțiunea. Și aici, dacă sunteți de lucru cu PHP, în mod normal, ar fi ceva de genul, create.PHP, dar aici am specifica de fapt un traseu în cadrul serverului Flask. Și astfel, corespunde acest traseu pentru a crea traseul că avem aici, care vom intra în într-o secundă. Și astfel, facem precizarea că este o metoda POST, pentru că vrem să trimită aceste date formular, și, de obicei atunci când sunteți trimiterea datelor dintr-un formular, s-ar putea doriți să utilizați o cerere poștă, doar astfel încât să nu se termină cu acest mare URL, greoi. Dar ai putea folosi, de asemenea, o cerere GET, și-l trece cu rutare variabilă, dar pentru formulare, e frumos la o cerere post aici. Și așa, atunci, tu la fel ca ar face cu HTML și PHP, puteți specifica aceste intrări de text, și puteți să specificați numele lor, și asta e numele pe care vor fi trecut în obiectul cererii în Flask. Și apoi ne-am un Trimite buton pe care scrie mesaj. Și aici, Post este numele buton, pentru că este un post pe blog, dar aici, post-este metoda cerere. Deci acestea sunt același cuvânt dar de fapt nu au legatura. Da Revenind la codul Python, când am sunat la metoda a crea, observă aici că puteți specifica de fapt de pe ruta metodele cerere pe care doriți să acceptați, și așa aici, am specifica faptul că am doresc doar să accepte o metoda POST. Deci, dacă de fapt încerc să vizitați pagina direct, care utilizează o cerere GET, mă va spune "Metoda nu este permis." Și astfel, aveți pagini, un fel de aceasta creează pagină, pe care eu sunt doar într-adevăr, folosind ca mod de formularul pentru a obține depuse, puteți specifica că nu vrei ca oamenii să poată să meargă acolo direct prin cererea GET, sau dacă nu doriți, pentru un motiv oarecare, o cerere Post, ai putea preciza doar ajunge aici, dar în acest exemplu, ne-am doresc cerere Publicați să iasă. Deci, atunci când create_post este numit, atunci când vom vizita că prin cererea Post, ori de câte ori te duci la un anumit traseu, există acest obiect cerere, și a trebuit să importe solicitări la foarte de sus, dar nu e această cerere obiect care devine trecut în, și puteți accesa datele din formular, care vor fi completate în mod automat atunci când trimiteți o cerere de la un formular. Și apoi, ce cred este foarte cool, este că obiectul formular pentru a obține trecut in, este doar un dicționar Python care conține, dacă access-- așa aici, să mă trage HTML de lângă ea, doar astfel încât să puteți avea ca ca referință, da, așa Numele pe care le specifica aici pentru diferite domenii, astfel încât titlul și textul, am apoi utilizați doar cei de aici ca indici în datele din formular. Așa că e foarte convenabil. Deci noi numim post.create, care va crea și introduceți în mod automat acest nou obiect postare în baza de date. Și cred că această funcție a crea aici este un exemplu foarte misto de modul în care puternic Flask este și de lucru cu acest lucru, pentru că dacă făceai ceva in PHP, poate fi necesar să face o mulțime de validare, va trebui să atunci stabili o conexiune bază de date, va trebui să atunci executa interogarea SQL, dar aici doar avem acest frumos post.create, care putem apoi doar obține informații afară a obiectului cerere, și apoi trece într-o nouă posta pe care le creăm. Apoi, cel din urmă lucru pe care vrem să facem, este de a redirecționa utilizator înapoi la casa. Și așa vom folosi acest Flask redirecționare funcție. Și ceva ce nu a văzut înainte, a fost această funcție URL. Deci, URL-ul pentru funcția permite treci în fapt numele de o funcție în codul Python, mai degrabă decât calea particulară că este la. Așa că am putea avea la fel de ușor redirecționat un utilizator de a reduce, care l-ar trimite înapoi acasă, dar folosind URL-ul pentru funcția este frumos, pentru că dacă vă schimbați locație unde lucrurile sunt, Să spunem că am schimba acasă pentru a fi la / home schimb, acest lucru ar mai apoi să se întoarcă / home, pentru că de fapt, merge și se uită în sus numele funcției, și va da înapoi URL-ul pentru asta. Deci, un fel de pe presupunerea că ești mai multe sanse de a schimba lucrurile în cazul în care sunt, decât numele funcțiilor. Puteți utiliza acest într-adevăr URL frumos pentru funcție. Și un lucru să fie conștienți de care este un pic mai complicat, este că tu crezi că putea să apel redirecționa pe adresa URL pentru, dar de fapt toate rutele au pentru a reveni un fel de text și HTML, deci va trebui de fapt să a reveni la apel de redirecționare. În caz contrar, veți obține ceva invalid despre care nu se întoarce un șir de caractere, pentru că toate acestea trebuie să se întoarcă HTML chiar vrei să facă. Și așa, atunci când sunați la redirecționare, te redirecționează la pagina, dar se întoarce de fapt HTML aveți nevoie pentru a executa care redirecționează. Du-te înapoi la pagina de start. Deci, avem aceste două puncte de vedere diferite. Avem vedere acasă. Sau, cred că ar trebui să spun șabloane. Avem aceste două modele, șablonul de origine, care afișează toate posturile noastre, și atunci avem acest lucru anunț, și când faceți clic pe post, merge la un nou traseu în vasul, dar această rută nu neapărat au un șablon corespunzător. Nu trebuie să vedem nimic, dar poți încă au acest lucru se întâmplă în spatele scenei. Și apoi te redirecționat Înapoi la pagina de start. Și cu siguranță, este ușor de a lucra în unele CSS mai frumos în șablonul și să facă acest lucru arata mult mai frumos, dar toate logicii principal este acolo, în Python. Orice întrebări cu privire la acest exemplu? Știu că există o mulțime de lucruri diferite se întâmplă acolo, o mulțime de lucruri pe care nu a vazut înainte, dar, ca orice. Da. AUDIENTA 1: Nu trebuie să faci nimic special pentru a freca datele pe care este Venind din forma? Am observat doar ai spus "crea" EZRA Zigmond: Da, așa că e de fapt, asta e un punct foarte bun. Deci întrebarea a fost, nu-i nevoie pentru a verifica și asigurați-vă că datele sunt valabile, și face nici un fel de spălare pentru a vă asigura că acesta este valid, pentru că după cum puteți vedea aici, Nu fac asta. Deci, haideți să vedem ce se întâmplă dacă am posta ceva gol. Deci, acesta va face de fapt doar o după gol și completați ora si data. Deci, în realitate, ar fi, probabil vrei sa faci ceva de genul, poate preciza dacă titlul este egal cu șir gol, atunci nu face asta. Sau, numai că fac dacă titlul este nu este egal cu șir gol. Deci, de fapt, nu în mod automat avea grijă de asta spălarea pentru tine, asa ca încă mai trebuie să faci asta. Da, bine întrebarea. AUDIENTA 2: Are scrub pentru injecție sequel? Stii? EZRA Zigmond: Din fericire, pitic face asta. Cred că ar fi cu siguranță o destul de bibliotecă rău în cazul în care nu a făcut asta. Nu știu exact. Mi-ar trebui să se uite la interogarea care a generat. Cred că, dacă am scris într-o blog la fel de uitat ca un atac injecție SQL, ceva de genul asta, în cazul în care acest lucru este ca un câmp parolă sau ceva, s-ar putea face așa ceva. Cred că va fi în continuare obține literalmente postat, dar cred că pitic face un fel de spălare a datelor înainte de a se execută de fapt. AUDIENTA 1: Aceasta câmp de text este concepute pentru a lua text simplu, nu? EZRA Zigmond: Da, este. Da. Deci, eu cred că toate, astfel încât acesta este comportament corect, care va face acest lucru, dar cred că pitic sperăm face un fel de protecție de-a rîndul lor. Și dacă ai vrut să verificați că există modalități de când genera o interogare. astfel încât să nu trebuie să executa direct. Ar trebui să ia o uita-te la documentație, dar puteți vizualiza, de fapt, SQL care este generatoare de, și să ia o privire la faptul că, și de a face vă că este scapă lucruri. Un alt motiv pentru care s-ar putea doresc să se uite la SQL care este pitic scoate, este în cazul în care Lucrurile par a fi într-adevăr lent merge, puteți să aruncați o privire și să vedem ce este de fapt face, pentru că uneori ușor să adăugați accidental în, modul în care-l scrie, puteți avea accidental selectați întreaga bază de date în primul rând, și apoi face o operație fel pe faptul că, atunci când într-adevăr menit pentru a selecta un subset. Și astfel, în cazul în care lucrurile nu sunt destul merg bine, e bine să aruncăm o privire la cererea Asta este de fapt obtinerea generat. Da. AUDIENTA 2: Când ai început în primul rând, ai pus în portul ca 5000. EZRA Zigmond: Da. AUDIENTA 2: Este implicit cu pitic, sau este că ceva se poate schimba? EZRA Zigmond: Da, astfel încât Portul este implicit cu Flask. Dacă-l ruleze fără specificând nimic, se va face în mod automat că. Cred, aș avea să verificați acest lucru, dar puteți specifica că în app.run, Cred că poți să faci ceva de genul, port = 8080. Să dai o încerca foarte repede. Da, astfel încât să puteți specifica doar port = 8080, și va rula acolo, care cred că, dacă ai vrut să-l rulați pe IDE, nu am încercat acest lucru, dar cred că, dacă primeste-l pe portul 8080, ai fi probabil în măsură pentru a accesa serverul, la fel ca ai fost pentru site-ul. Da, dar e ușor pentru a schimba că, dacă au nici un fel de port forwarding lucruri pe care trebuie să faci. Orice alte întrebări? Da? AUDIENTA 1: Deci, am văzut în ta modele care, după cum ați menționat, aveți pentru a specifica baza de date pentru fiecare obiect. Nu se întâmplă să știi, nu care fac într-adevăr ușor dacă au o mulțime de baze de date SQLite pe care le doriți să utilizați pentru un singur aplicație web, pe care le poate specifica doar o adunatura de cele diferite în modelul dumneavoastră? EZRA Zigmond: Da, lasă-mă să deschide asta foarte repede. Deci, vrei să spui că, dacă doriți să aveți o grămadă de diferite ceva, poate ca și elevii, pentru a putea motiv, ceva de genul asta? Da, așa cred că încă, fiecare model ar trebui să aibă doar încă o bază de date i sa atribuit, dar dacă ai vrut să aibă diferite modele care au diferite baze de date alocate obiecte să-l, ai putea face cu siguranta asta. Deci, dacă am creat un nou, ceva de genul, iar acum acest lucru este un elev care arata ciudat ca un post pe blog, Aș putea preciza că baza de date este egal cu db_2 aici. Deci, cred că asta e fel principal, puteți face acest lucru. Misto. Orice alte întrebări? Deci, doar pentru a termina un pic bit, aici sunt unele resurse, iar aceste diapozitive vor fi postate online astfel încât să puteți obține de fapt, la aceste link-uri. Cele mai bune resurse sunt într-adevăr documentația pentru Flask și pitic ei înșiși. Ei scris foarte bine, cred. Deci, site-ul Flask este aici, și ei au un tutorial QuickStart care va merge prin similară lucruri la ceea ce am mers prin, dar dacă doriți orice fel de comentariu din lucrurile pe care m-am dus, sau te-ai gândit că i-am explicat ceva într-un mod confuz, vor avea exemple similare acolo. Pitic are documentație, și ei au un tutorial QuickStart care merge de-a lungul principalilor parametri care le-ar dori să utilizați. Deci, lucrurile pe care le-am vorbit despre cu unic, și precizează implicite, diferitele tipuri de domenii care aveți posibilitatea să utilizați, acestea ar fi tot acolo. De asemenea, dacă aveți întrebări despre pitic, și le posta pe StackOverflow, tipul care a făcut de fapt pitic merge mai departe și răspunde celor uneori. Dacă aveți o întrebare, sperăm el va fi capabil să răspundă, pentru că el a scris totul. Cred că e totul Am vrut să le acopere. Vă mulțumim pentru iese.