[Muzika]
EZRA Zigmond: Hi, të gjithë.
Faleminderit për të ardhur jashtë sot.
Ky seminar është "Python Web Apps me balonë. "
>> Pra, unë jam duke shkuar për të folur pak në lidhje me pse
ju mund të dëshironi të përdorni balonë për të bërë Apps web me Python, në krahasim
për disa kornizave të tjera atje, si Django, që është më i njohur.
Subtitle është "dhe peewee ", e cila është diçka
ne do të flasim rreth asaj se si për të bashkëvepruar me bazat e të dhënave SQL.
Kjo e bën atë të vërtetë e bukur.
>> Pra, këtu është vetëm një i dobët e shpejtë e asaj që unë dua të shkoj gjatë.
Pra, së pari, vetëm një rrëshqitje që do të jetë QuickStart,
që është se si të merrni gjithçka ngritur në kompjuterin tuaj.
Unë jam duke shkuar për të demonstruar kjo në kompjuterin tim lokale Mac,
vetëm për shkak se kjo është ajo ku unë kam bërë këtë para, unë jam më i kënaqur me të,
por kjo është padyshim e mundur në CD50 IDE.
>> Pra, pas kësaj, unë dua të futur atë balonë është,
dhe të ju bindin pse ju duhet e përdorin atë në vendin e parë.
Pastaj, unë do të jap një të shpejtë Shembulli i asaj që ju
mund të bëjë në balonë, një shembull të shpejtë të asaj që ju mund të bëni në Peewee,
dhe pastaj unë do të ju tregojnë një më shumë shembull aplikim i plotë
që kam vënë së bashku se ne mund të ecin nëpër bashku.
>> Dhe pastaj në fund, në rrëshqitje e fundit, unë kam
disa burime që ju duken në internet për më shumë informacion.
Kjo nuk është një e plotë tutorial se si të përdorin balonë.
Dhe unë do të shpresoj për të lënë disa kohë për pyetje.
Çdokush shikuar në nivel lokal, vetëm si, bërtas në mes
nëse keni ndonjë pyetje.
>> Pra, sende të shpejtë instalimin, në qoftë se ju doni të ndjekin së bashku,
ose në qoftë se ju doni të merrni këtë deri në kompjuterin tuaj,
Unë do të jetë duke përdorur Python 2.7.10.
Termus bën punën me Python 3, por unë si
duke përdorur Python 2, sepse nuk ka disa paketa Python se
nuk punojnë me 3 ende.
Në qoftë se ju keni instaluar veza, e cila është një menaxher paketë Python,
Unë mendoj se në qoftë se Python juaj është më e madhe se ose e barabartë me 2.7.9,
ju keni instaluar tashmë, është e super të lehtë për të instaluar këto paketa.
>> Ju mund të bëni veza instaluar Balonë, veza instaluar Peewee,
zakonisht ju duhet të kandidojë sudo vetëm në mënyrë që lejeve të punës jashtë.
Dhe, nëse ju jeni duke përdorur një super version i vjetër i Python,
Unë rekomandoj përditësimin Python tuaj, ose duke përdorur EasyInstall të instaluar veza.
Pra, pyetja tjetër është, ajo që është balonë?
Dhe unë mendoj se, për herë të parë një pyetje të arsyeshme unë veten
për një kohë të gjatë është, ajo është një app web?
Sepse kjo është një fjalë që unë mendoj se është hedhur rreth shumë
që unë nuk të vërtetë e di.
Dhe unë mendoj se më i miri shembull të asaj që një app web është,
me të vërtetë është CS50 Financave, ku kjo nuk është me të vërtetë vetëm një faqe interneti,
por kjo është diçka që ju mund të lloj të ndërveprojnë me.
Nuk janë llogaritë e përdoruesve dhe të gjitha llojet e gjërave të ndryshme.
Pra, ku pikërisht ju tërheqë Linja mes asaj që është një website,
dhe çfarë është një app web, është lloj i arbitrare, por unë mendoj idenë,
kjo është diçka më shumë se një faqe interneti dhe kjo është një kërkesë e dobishme.
>> Pra, balonë është një kornizë për duke e bërë Apps web duke përdorur Python.
Dhe shpresojmë se, në fund të kësaj, unë do t'ju bind
që ju mund të vërtetë të shkruani diçka si CS50 Financave përdorur Python, të cilat unë
si shumë më mirë se PHP, personalisht.
>> Pra, balonë është, ata e quajnë një microframework, me të cilin,
ata do të thotë se është shumë thjeshtë, por e zgjeruar.
Pra, ajo ka vetëm ajo që ju duhet, por në qoftë se ju doni më shumë karakteristika,
është e lehtë për të sjellë ata në.
Por vetëm për shkak se kjo është një microframework, nuk ka
do të thotë se kjo është vetëm për projekte të vogla.
Unë kam një lidhje këtu që thotë se se Obama përdorur balonë në vitin 2012
për fushatën e tij Faqja e internetit, i cili me shpresë,
është diçka e një miratim.
Por gjëja që unë vërtetë si për balonë
është se, ajo nuk ka të vërtetë të bëjë çdo lloj vendimeve për ju.
Vetëm për shkak se ne jemi duke folur për Apps web,
Unë duhet të krahasojnë atë me Ruby në Binarët dhe Django, dy prej të cilave
janë kornizat e madhe, por ata të dy bëjnë supozime
për mënyrën se si ju doni të ndërveprojnë me bazat e të dhënave,
si ju doni të paraqesë tuaj views, dhe ata janë patjetër
aspekte të mira për këtë.
>> Për shembull, Ruby në binarët ka këtë sistem aktiv rekord,
i cili është një të vërtetë e bukur mënyrë për të bashkëvepruar me të dhëna,
por në qoftë se ju doni të përdorni Ruby në Binarët, ju jeni lloj i lidhur në atë.
Por me balonë, si unë do ju tregojnë me Peewee,
ju mund të përdorni çfarëdo lloj të dhënave që ju doni,
dhe vetëm ju mund të tërheqë atë në si një zgjatje në balonë.
>> Pra, kjo është arsyeja pse unë me të vërtetë si balonë, është se ajo
nuk e bën supozime për ju bazuar në gjëra që ju nuk duhet të vërtetë.
>> Pra, pse duhet të përdorni balonë?
Avantazhet janë, ajo vetëm ka me të vërtetë karakteristikat kryesore
ndërtuar në atë që ju duhet.
Pra, ju nuk duhet të shqetësohen për të kuptuarit e një bandë e tërë e gjërave
që ju nuk keni nevojë të vërtetë.
Ju nuk duhet të keni për t'u shqetësuar për turning off karakteristika
që ju nuk keni nevojë të vërtetë.
>> Dhe, siç e përmenda, kjo është super lehtë për të shtuar në zgjerimet e gjërave
që ju keni nevojë.
Disa prej tyre, balonë ka mbështetjen e tyre për të.
Pra, ka diçka që quhet balonë admin, e cila pasqyron se admin
Paneli që Django ofron, e cila ju jep një mënyrë të bukur vizuale
për të administruar faqen tuaj te internetit.
Por, përsëri, në qoftë se ju jeni bërë diçka e thjeshtë,
ju ndoshta nuk keni nevojë për një admin madh panel, kështu që unë mendoj se është super e bukur.
Dhe të metat janë, që ju keni më pak fuqi jashtë kutisë.
Pra, kur ju së pari të hapur balonë, dhe në programin tuaj Python,
ju vetëm lloji nga balonë importit *, ose çfarëdo,
ju nuk saktësisht të merrni të gjitha karakteristikat që ju mund të dëshironi.
Dhe kështu që ju keni për të më shumë në mënyrë eksplicite lista karakteristikat që ju dëshironi.
Pra, kjo është një disavantazh, por unë mendoj se për ndërtimin e web të vogël
Apps si unë jam duke shkuar për të treguar ju, që nuk është me të vërtetë një problem.
Dhe çfarë është gjëja e fundit duhet të them, e cila është një typo,
është se ka pak të standardizuar konventat për mënyrën se si të përdorin balonë,
vetëm për shkak se nuk ka aq shumë njerëz që e përdorin atë në mënyrë profesionale
krahasuar Django.
Pra, nëse ju shikoni diçka si, "si mund ta bëj x" në Django,
ndoshta ju do të gjeni atë.
>> Ka dizajn të mirë modele ju mund të përdorni,
por me balonë, kjo është lloj i shkojnë rrugën tuaj,
vetëm për shkak se kjo është një bibliotekë mjaft i vogël.
Kështu që ata janë të disavantazhe, por unë mendoj
se kjo është ende një bibliotekë mirë për të përdorur.
>> Pra, le të vetëm kërcej të drejtë në balonë.
Ky është definitivisht nuk do të jetë një tutorial i plotë,
por kjo është për të ju jap një ide se si të strukturës gjëra,
dhe kështu që ju të ndiheni rehat duke shkuar off dhe duke kërkuar në dokumentacionin
dhe gjetja e më shumë.
>> Pra, më lejoni të hapur një të vërtetë shembull i thjeshtë në fillim,
dhe ju se çfarë tregojnë si duket, dhe pastaj ne do të
thyejnë atë poshtë një pak më shumë.
>> Pra, ky këtu, më lejoni të marrë atë drejtimin.
Pra, unë tani kanë kërkesën time running.
Unë jam duke shkuar për të hapur Safari, dhe kjo është kandidon për mikpritësin tim lokale.
Kështu që unë jam vetëm duke shkuar për të bërë këtë më të mëdha.
Por localhost: 5000
>> Dhe kështu, tani, e gjithë kjo e bën është, kur ju vizitoni faqen e internetit,
ajo kopje nga "Përshëndetje balonë" e cila nuk është e dobishme super,
por unë mendoj se është ftohtë që në këtë dosje të vogël këtu,
ne kemi një web server running që është shtypje diçka.
Pra, le të shohim në fakt në kod për një të dytë,
dhe të ndërpreni atë poshtë pak.
Është madhësia e mirë për të gjithë këtu?
>> Pra, shpresojmë se, ju jeni disi të rehatshëm duke përdorur Python.
Unë jam duke supozuar se ne mund të shohim në Python dhe të lexoni nëpërmjet saj.
Nëse keni ndonjë pyetje në lidhje çdo gjë, unë mund të shkoni edhe mbi atë.
>> Kështu në radhën e parë, nga balonë, ne import, balonë me një kapital "F"
e cila është lloj i të gjitha tipare kryesore që ju duhet.
Kurdo që ju jeni me shkrim një skedar dhe përdorimin e balonë,
ju jeni do të duan të importojë atë, vetëm për shkak se i ka të gjitha gjërat kryesore.
Gjë tjetër që ne bëjmë, është që ne e quajnë këtë balonë funksion, vetëm
për të krijuar një objekt app, dhe ju jeni gjithmonë do të dëshironi të bëni atë.
>> Dhe pastaj, duke kërcyer poshtë të fund shpejt, kjo pjesë këtu është,
'if_name _ == "_ main_" "i cili është lloj i një konvente Python.
Pra, kjo do të zbatoj vetëm nëse ju drejtuar këtë fotografi direkt duke përdorur Python.
Pastaj, ne e quajmë app.run, e cila do të në fakt të fillojë app shkuar.
>> Pra, kjo është struktura kryesore që ju do të keni në çdo aplikim balonë,
po ju do të keni këtë App = balonë (_name_), dhe pastaj app.run.
>> Pra, dy gjëra që unë kam në këtu, janë ato që ne e quajmë rrugët.
Pra, le të flasim për kurs pak më shumë.
Unë do të shkoj përsëri në rrëshqitje.
>> Pra, më themelore koncept në balonë është kurs.
Dhe kjo është ideja që ju të caktojë funksione në Python
në adresat e caktuara në faqen tuaj web.
Pra, sa herë që ju dëshironi për të krijuar një rrugë të re,
ju përdorni këtë @ app.route bojaxhi funksion.
Pra, nëse jeni të panjohur me decorators funksion në Python,
Është ky koncept që ju lejon të marrin një funksion
dhe e rrethojnë atë me diçka tjetër.
>> Pra me të vërtetë, çfarë e bën këtë bojaxhi, është se ajo merr funksionin më poshtë saj,
dhe kjo shton më shumë informacion për atë, por ajo që në fakt balonë
ka bërë që të ndodhë nuk është e super vendimtare, por ajo që është e rëndësishme,
është se para se të rrugës, ju vënë këtë @ app.route, dhe pastaj
adresa e rrugës, kështu plagë është ajo që ne
pa kur ne sapo hapur deri web faqe.
Pra, kjo është homepage.
Është vetëm rruga plagë.
Dhe pastaj ju e keni këtë funksion.
Emri i funksionit mund të jetë çdo gjë që ju dëshironi.
Ajo nuk duhet të detyrimisht kanë të bëjnë me rrugën.
Dhe pastaj, çfarëdo kthimi i funksionit së,
funksioni duhet të kthehet një varg.
Dhe kjo mund të string përmban HTML ose ndonjë gjë,
dhe kjo në fakt është ajo që do të merrni u kthye në shfletuesin tuaj të internetit si HTML,
dhe kjo do të bëjë që.
>> Pra, kjo është e njëjta kodi kjo ishte nga shembulli
që unë vetëm u zhvillua, kështu që kur vizitojmë Slash, ajo e quan një funksion Përshëndetje Botërore, e cila
vetëm kthen një varg, Përshëndetje balonë, dhe që merr shtypura në ekran.
>> Pra, ka një tjetër shembull, që është, kur ju vizitoni / hello,
ajo printon nga Përshëndetje Word, i cili duhet të them në fakt, Hello World,
por le të pretendojë se ishte i qëllimshëm.
Pra, le të tërheq lart që vërtetë të shpejtë.
>> Pra, nëse ju shkoni në localhost / hello, ajo tani do të shtypura diçka tjetër.
Pra, kjo është vetëm një shembull të shpejtë se si ju mund të krijoni dy rrugë të ndryshme.
>> Pra, deri më tani kjo nuk është e super të dobishme, nuk është një tërësi shumë ju mund të bëni,
ju mund të bëni vetëm gjithçka që me të paturit e faqe të ndryshme HTML,
dhe kur ju vizitoni një të veçantë faqe ajo vetëm ngarkesa faqe.
Pra, le të shohim disa më shumë gjëra të dobishme që ju mund të bëni.
Pra, një gjë që ju mund të keni vërehet në shembullin që unë nxorrën
lart, është se unë kisha app.run (debug = True).
Dhe kështu, çfarë kjo Argumenti debug bën, është
se kur ju drejtuar web serverin tuaj, kur ju jeni në aplikimin tuaj,
në qoftë se ju të ndryshojë një fotografi, ajo do të automatikisht ringarkoni server.
>> Dhe kështu që ju në fakt nuk duhet të restart Python, e cila është e super të dobishme.
Unë mund të tregojnë se.
Më lejoni të tërheq lart kodin tim me typo në të,
dhe të pretendojë se typo ishte vënë atje qëllimisht për qëllime udhëzuese.
Pra, le të shtoni këtë Kthehu në.
Kështu që tani ai thotë Hello World.
Unë do ta shpëtojë.
Dhe në qoftë se ne tërheq mbrapsht deri terminali, ju do të
thonë se kjo është rifillimi, sepse ajo zbuluar një ndryshim,
dhe kështu që tani kur ne rifreskoni këtë faqe, ajo do të shtypura nga gjënë e duhur.
>> Pra debug është super e dobishme për atë.
Gjithashtu, në qoftë se ju keni ndonjë lloj i një aksident, kështu që
më lejoni të bëjë këtë përplasje aplikimit duke pasur jo ajo kthehet një varg.
Pra, le të vetëm kanë atë Asnjë kthehen për disa arsye.
Dhe atëherë kur kam vizituar këtë faqe, ajo do vetëm të rrëzimit,
por serveri nuk ka vetëm përplasje, atë në fakt ju jep një back super të dobishme
gjurmë e çdo gjë që shkoi keq.
Dhe çfarë është me të vërtetë e bukur, është se në çdo hap në këtë gjurmë prapa,
ju mund të hapë një interaktive shell këtu, dhe lloj të shtypura nga çfarë
variabla ju dëshironi të hidhni një sy në.
>> Dhe kështu debugging është me të vërtetë të dobishme për zbulimin
çfarë po ndodh me tuaj server, në vend se vetëm duke parë
diçka në PHP si një 500 të brendshme gabim server, e cila është e super të padobishme.
Një gjë që të jetë i vetëdijshëm, është se në qoftë se ju vendosni në internet app tuaj
kështu që është e dukshme për publikun, ju nuk duan të largohen mënyrën debug në,
sepse njerëzit mund të vërtetë përdorin atë tastierë që unë
tregoi që për të ekzekutuar kodin arbitrare.
>> Në mënyrë që ata mund të shtypura jashtë si ndonjë kodet sekrete që ju keni në atje,
ata mund të shikojmë pikërisht si faqen tuaj te internetit është duke punuar.
Pra, kjo është me të vërtetë e dobishme për testim, por gjithmonë
të sigurt për të marrë atë para ju të botojë ndonjë gjë online.
>> Pra, kur ju jeni duke përdorur diçka si PHP, nuk është kjo ide
që ju mund të kalojë informacioni mes faqeve të internetit
duke vënë informacion në fakt në URL, e cila është një kërkesë GET,
por në balonë, ju mund të vërtetë bëni diçka lloj të tillë,
duke pasur një rrugë që ka a variable si pjesë e saj.
>> Pra, nëse ju shikoni në këtë Shembulli në ekran këtu,
ne kemi një rrugë që është ('/ Përshëndetje /'), dhe kështu, në qoftë se ju vizitoni
/ Përshëndetje / diçka, se diçka do të vërtetë të marrë mbushur
në emrin e variablit.
Dhe vini re se funksioni që vjen me këtë rrugë
duhet të marrë në parametër emrin, në mënyrë që ajo do të në fakt
të kaluar në funksion.
>> Dhe pastaj, një herë ju jeni brenda këtij funksioni,
ju mund të trajtoni se si një variabël normale Python,
dhe kështu pastaj, ajo do të shtypura nga Përshëndetje, dhe ajo
do të plotësoni në emrin e përdorimit disa formatimin string.
>> Pra, për të shtuar pjesë të ndryshueshme në një kurs, ju përdorni kllapa kënd shënuar.
Dhe opsionale, ju mund të përdorni atë që quhet një konvertim.
Dhe kështu, në qoftë se ju vendosni këtë shënim me dy pika,
ju mund të specifikoni se kjo është një int, ose një noton, apo rrugë,
dhe ajo do të konvertohet automatikisht atë.
Ju gjithashtu mund të bëjë konvertimin brenda funksionit Python,
vetëm duke përdorur një cast, por ndonjëherë nëse ju doni të siguruar që kjo është një int,
ju mund të vendosni se Rregulli i konvertimit në atje.
>> Pra, le të tërhequr deri një shembull e disa rregullave të ndryshueshme.
Kështu që këtu, kjo është e njëjta themelore Struktura me nga importi balonë
Faqore, app = balonë (_name_), dhe pastaj kjo është drejtimin në fund.
Ne kemi këto dy të ndryshme Rrugët ndryshueshme këtu.
Dhe i pari, është ai që kam treguar
në rrëshqitje, e cila ishte se ajo merr vetëm në një emër string
dhe ajo do të shtypura nga Hello, Emri.
>> Dhe pastaj, e dyta e përdor konvertimin.
Pra, kjo automatikisht do të kthyer atë në një int, dhe pastaj të dyfishtë int,
dhe të shtypura atë jashtë.
Dhe, ne nuk bëjmë asnjë lloj e konvertimit brenda saj
sepse balonë kujdeset për këtë.
Pra, le të marrë këtë drejtimin.
Kur ju keni një balonë aplikimit running,
Ju mund të kontrollojë-C nga ajo për të ndaluar server running.
Dhe atëherë unë do të kandidojë variablave.
>> Pra, le të shkojnë në localhost / përshëndetje / Ezdras dhe Shpresojmë, kjo do të thonë hello për mua.
>> Pra, ajo mori në emrin tim, në variablin rrugë, dhe e mbushi atë në këtu.
Kështu që unë do të tregoj një mënyrë të shpejtë Shembulli i dyfishimit.
Pra, nëse ju shkoni në / të dyfishtë / 3, ajo do të shtypura nga 6.
Pra, kjo u kujdes konvertimit për ne.
>> Pra, ju gjithashtu mund të bëjë atë me noton, dhe diçka e veçantë,
në qoftë se ju duhet të specifikoni diçka si një rrugë, që ju lejon të pranojë slashe,
por që nuk duhet të zakonisht të jetë një çështje.
Deri tani kemi, ende kemi sapo është kthyer
vargjet, e cila nuk është shumë interesante.
>> Ne fakt mund të kthehet literal string HTML.
Pra, në kodin ne mund të futur diçka si B-tag për ta bërë atë të guximshme,
por shumica e kohës që ju në fakt nuk duan
të jenë të shkruar kodin HTML në kodin tuaj Python.
Ai merr me të vërtetë i çrregullt, dhe kjo nuk është një kohë e mirë.
>> Termus na lejon për të ndarë jashtë HTML në atë që quhet template,
dhe kështu që nëse ju jeni duke menduar në kuptimin e modelit MVC
që ju jeni të njohur me të, me shpresë, nga puna
me CS50 Financa pak, ju mund të mendoni fotografi Python
si më të Kontrolluesi, ku ata janë të ndërveprojnë me çfarëdo
Modeli dhënat që ju mund të keni.
>> Dhe atëherë ata janë duke bërë thirrje për të shikimeve dhe duke kaluar informacionin në atë View
për të plotësuar informacionin e në HTML që ajo ka nevojë.
Dhe ajo që ne e quajmë ato Shikime janë Templates në klasë.
>> Pra, balonë përdor një tjetër Python modul se ajo do të automatikisht
instaluar kur ju instaloni Pip Termus quajtur Jinja, e cila
ju lejon të shtoni këto Annotations në HTML
që ju shihni në ekran, që ju lejon ju vënë në gjëra të tilla si conditionals,
dhe sythe në HTML.
>> Pra, kjo duket pak si si ju mund të përdorin PHP brenda një skedar HTML,
por kjo është vetëm kur balonë server shërben skedar HTML,
ajo do të drejtuar këtë motor templating dhe kuptoj këtë dhe plotësoni gjërat në.
Pra, balonë ka një funksion render_template që ju mund të shihni në fund këtu.
Dhe kështu, kur ju vizitoni këtë faqe, atë do ta bëjnë këtë Template hello.html,
dhe pastaj plotësoni në këtë faqe HTML.
Pra, le të vetëm të drejtuar këtë të vërtetë të shpejtë, dhe të shohim se çfarë ajo duket si,
dhe pastaj unë do të shkoj nëpër një pak më në detaje.
Pra, Templates tuaja janë duke shkuar për të shkuar në një dosje templates.
Kjo automatikisht do të duket brenda Templates dosje për këtë Stampa.
Pra, le të hapur këtë ide.
Pra, unë do të kandidojë shembullin templating.
>> Pra, nëse unë shkoj në / përshëndetje / Ezdras, ajo ka këtë tmerrshme,
tag padurueshëm çadër që kam vënë në.
Very nice, shumë dinamike.
Unë jam një tifoz i madh.
Por çfarë ndodh nëse Unë thjesht shkoni në, / përshëndetje?
Pra, ai vetëm i thotë: Hello World.
Unë nuk e kalojnë një emër, dhe e mbushi atë në mënyrë automatike.
Pra, le të shohim se si ai e bëri atë, dhe si ne mund të shpëtoj prej atij çadër ndoshta.
>> Kështu që këtu, kjo është lloj i një shembull interesant i,
në qoftë se ju jeni të njohur me atë se si kaloni Deklaratat punojnë në një gjuhë.
Thonë se kjo është lloj i si, ky lloj i një rënie përmes,
ku në të vërtetë ju bashkangjitur dy rrugë të ndryshme për të njëjtin funksion.
Pra, ne bashkëngjitni / Noizy rrugë dhe / Përshëndetje / rrugë emër të Përshëndetje,
dhe ne të specifikojë using-- Python ju lejon specifikoni funksion parazgjedhje argumente të
kështu që nëse nuk ka asnjë emër, kështu në qoftë se ne do të shkojmë për të vetëm / hello,
kjo automatikisht do të filtruar për emrin është e barabartë me Asnjë.
>> Kështu pra, ne të merr Template me emrin = emri,
kështu ajo do të kalojë në emrin parametër të barabartë me këtë parametër funksion emri,
në template.
Që ende nuk shpjegon se si është të vendosur nëse do të shtypura Hello World,
ose të shtypura emrin tim.
Pra, le të në fakt duken në template vetë,
dhe të shohim se ku po vijnë nga.
>> Pra, në kuadër të këtij Template, ne në fakt kanë disa logjikën e kushtëzuar,
që disa njerëz do të argumentojnë, ju në të vërtetë
nuk duhet të ketë një shumë e kushtëzuar Logjika brenda template tuaj vetë.
Ajo duhet të jetë më brenda Kontrollues, por për këtë shembull
kjo është diçka shumë e vogël.
Kështu që këtu, ne kontrolloni, nëse emri, kështu në qoftë se emri nuk është e barabartë me Asnjë,
në qoftë se një emër është në fakt kaloi në, atëherë ne do të
thonë Përshëndetje, emri me të header dhe çadër,
e gjithë kjo HTML normale, përndryshe, ne do të shtypura nga Përshëndetje, World vetëm normalisht.
Pra, disa gjëra në njoftim këtu rreth asaj se si ju format templating,
është se, në të gjitha këto Deklaratat e kushtëzuara,
lloj si si ne PHP atë kur ju doni të futur disa PHP,
ju përdorni më pak se fjalë shenjë, kjo është lloj i ngjashëm këtu
me {%.
>> Kështu që këtu, kemi kodin tonë të kushtëzuar.
Dhe pastaj, kur ju të vërtetë duan të fjalë për fjalë të vlerësuar diçka, dhe të shtypura
ajo jashtë në ekran, ju përdorni formatimin e teksteve dyfishtë.
Kështu që këtu janë formatimin e teksteve të dyfishtë, dhe pastaj ne të specifikojë emrin,
kështu që brenda, ajo do të vlerësojë me emrin e ndryshueshme, e cila
u miratua në nga bëjnë funksion template,
në vend se vetëm printim jashtë, në qoftë se ne u shpëtoj prej tyre,
kjo vetëm do të shtypura nga fjalën "emrin."
Pra, kjo është diçka për të parë për.
>> Pra, një tjetër gjë për të njoftim është se, kur ne
doni të përdorni funksion render_template,
ne fakt kanë për të importuar ajo në mënyrë eksplicite nga balonë.
Dhe ky është një shembull i Modularitet i balonë,
që ju nuk keni për të importuar gjëra që ju nuk keni nevojë.
Ju vetëm mund të sjellë në Funksionet e ju në të vërtetë
kanë nevojë, e cila ndonjëherë është bukur, kështu që ju nuk e bëni
duhet të ketë të gjitha këto funksione ulur rreth se ju nuk jeni duke përdorur,
por edhe, në qoftë se ju harroni se ju nevojë për të importuar render_template,
ju ndoshta do të merrni një paralajmërim që do të le ju e dini në lidhje me atë.
Pra, kjo është templating.
>> Pra, ne kemi treguar se si të të bëjë faqet e thjeshtë web,
dhe shtoni pak më shumë logjikë të ajo, në drejtim të kurs ndryshueshme.
Kjo ju lejon të bëni gjëra të ndryshme në bazë të çfarë URL ju shkoni në, dhe edhe atëherë, japin
HTML pak më shumë kuptim në aspektin se si ju doni të bëjnë gjëra.
Ju nuk keni për të vënë të gjithë HTML tuaj në Python tuaj,
por për shumë e shumë çdo aplikim të internetit,
ju jeni do të duan disa lloj i modelit të të dhënave lidhur me të.
>> Dhe kështu tradicionalisht, kjo do të të jetë diçka si një bazë të dhënash SQL.
Dhe vetëm ju mund të ndërveprojnë drejtpërdrejt me SQL.
Python ka, unë mendoj se ajo që quhet.
SQLite 3.
Ju vetëm mund të importojë SQLite 3 dhe ekzekutuar SQL queries direkt,
por unë nuk e di për ju, por unë me të vërtetë nuk më pëlqen, vetëm,
shkrim nga SQL queries.
Ajo tenton të marrë të vërtetë gjatë dhe i komplikuar.
>> Dhe kështu, diçka që Më pëlqen të përdorin është se çfarë është
njohur si një ORM, i cili është objekt-relacionale hartës.
Dhe pika e një objekt-relacionale mapping,
është se ka dy të ndryshme mënyra që ju mund të mendoni për bazat e të dhënave.
>> Kështu shembullin që Profesor Malan zakonisht
përdor në klasë, është tabela Excel, ku ju keni këto rreshtave dhe këto kolona,
dhe kjo është me të vërtetë e dobishme për se si ajo është e përfaqësuar në SQL
dhe se si ndërveprojnë me të, por një mënyrë tjetër që është e vërtetë
dobishme për të menduar për këtë ndonjëherë, është në drejtim të klasave dhe objekteve.
>> Pra, në vend të të menduarit e çdo tavolinë si ka
ky rresht që ka të caktuar informacion, ju mund të vërtetë
të mendojnë për atë si të çdo tabelë është një klasë,
dhe pastaj çdo shembull i klasë ka veti të caktuara.
Pra, në këtë shembull, rastet e klasa janë rreshtave në tabelë,
dhe pastaj çdo pronë do të jetë një kolonë në tabelën.
>> Kështu, ORM që unë si për të përdorur quhet peewee.
Është me të vërtetë e vogël, lloj si balonë.
Unë mendoj se ata të shkojnë mirë së bashku, por ka shumë të ORMs tjera
që ju mund të përdorni.
Një e më popullor është i njohur si SQLAlchemy,
dhe unë nuk mund të kujtohet pse unë fillimisht zgjodhi Peewee mbi SQLAlchemy,
ose unë do të ju them se pse unë mendoj se është më e mira,
por ne jemi vetëm do të përdorin këtë një sepse unë e di se si të përdorin atë.
>> Pra, një pyetje është, pse duhet të ju shqetësoj duke përdorur një ORM,
në vend të vetëm direkt shkrim SQL queries?
Dhe unë mendoj se rastin më të mirë, është se ju në fakt nuk
duhet të shkruajnë SQL queries.
Është shumë më e lehtë, ndërsa unë do të ju tregojnë për të bëjë gjëra të tilla si përzgjedhja, futje,
fshirje, veçanërisht krijimin e tabelave.
Është shumë më e lehtë për të shkruani një strukturë të klasës,
se ajo është për të strukturohet një krijoni Deklarata tabelë, por një gjë
të jetë i vetëdijshëm, është se ORM do të përpiqet të mirë të saj
të kuptoj se çfarë më efikas SQL query do të jetë,
por ndonjëherë ajo merr atë të gabuar.
>> Dhe sidomos në qoftë se ju jeni duke punuar me një bazë të dhënash të madhe,
ju mund të vëreni se një pyetje që duhet të konkurrojnë të shpejtë,
është në të vërtetë duke marrë më të gjatë.
Dhe në qoftë se ju shikoni nën kapuç se si ORM është interpretuar se në SQL,
ajo mund të jetë duke bërë diçka me të vërtetë qesharake,
vetëm për shkak të lloj shenjë qëllimet tuaja gabuar.
Dhe, ka pasur raste ku Unë kam pasur për të shkelur atë, dhe vetëm
ekzekutuar pyetje timen SQL, vetëm sepse ajo ishte parsing në një mënyrë të çuditshme.
Pra, ka disa lart, vetëm në mënyrë të
se ajo harton tuaj Deklaratat e poshtë në SQL.
>> Pra, le të shohim super të shpejtë në Një shembull i thjeshtë i një modeli të dhënave
që ju mund të përdorni.
Pra, kjo është kodi Python, dhe kështu gjëja e parë që ju doni të bëni është nga
peewee * importit.
Pra, ndryshe nga balonë, ku ju keni të gjitha këto module individuale,
dhe ju doni të importit balonë, dhe shkruaj një template, dhe disa të tjerë
se ne do të shohim më vonë, nga Peewee, ju vetëm mund të importojë çdo gjë,
sepse kjo është një bibliotekë mjaft të vogël.
>> Pra, gjëja e parë që ju doni të bëni, është në fakt krijuar këtë objekt bazës së të dhënave.
Pra, ju keni db = SqliteDatabase, dhe pastaj emrin e bazës së të dhënave.
Dhe kjo do të vërtetë të të krijojë një objekt bazës së të dhënave
që ju mund të ndërveprojnë me të, me Peewee.
>> Dhe atëherë, ne kemi aktuale Modeli që ne duam të krijojmë.
Pra, tabela ne duam të krijojmë.
Pra, në kuadër të Peewee, çdo klasë ka Tabela e vet në bazën e të dhënave tuaja.
Pra, të gjitha klasat trashëgojnë nga modeli bazë,
dhe modeli kryeqyteti M është diçka që është përcaktuar në peewee.
>> Pra, të gjitha modelet tuaj duhet trashëgojnë si superklas tyre më të lartë,
ata duhet të trashëgojnë nga model, por ajo që është me të vërtetë e ftohtë,
është se ju në fakt mund të ketë tuaj Modelet trashëgojnë nga njëri-tjetri.
Dhe një shumë e kohës, tuaj Modelet e të dhënave nuk është e detyruar
të bëjë një hierarki e bukur trashëgimi, por raste ku ata e bëjnë, është e vërtetë e bukur,
sepse ju keni modelin pandarë nga njëri-tjetri.
>> Pra, ne përcaktuam këtë klasë 'Studenti', e cila trashëgon një model,
dhe ajo ka tre veti.
Ajo ka një ID, i cili është a PrimaryKeyField, e cila
është diçka që është dhënë nga Peewee, emri është një CharField,
dhe një notë është një IntegerField.
Pra, kjo mund ose nuk mund të jetë si CS50 në fakt ruan të gjithë
notat e nxënësve.
Kjo nuk është, por kjo është se si unë do të bëjë atë.
>> Dhe atëherë ajo ka brenda kjo klasë, dhe kjo
është diçka që ju mund të bëni me Python, ju mund të ketë klasa mbivendosur.
Dhe kjo është diçka që është e nevojshme nga peewee.
Pra, kjo Meta klasë, ju keni për të specifikuar se baza e të dhënave është
barabartë me objektin se kemi krijuar më sipër.
Dhe kjo thotë se ajo skedë është kjo tabelë në të vërtetë do të jenë të përmbajtura në.
Pra, kjo është diçka që ju keni për të bërë në kuadër të të gjitha modeleve tuaja.
Ju thjesht duhet të specifikojë në këtë klasë Meta
bazës së të dhënave që është e barabartë me db.
Pra, ajo që unë zakonisht e bëjnë, në qoftë se unë kam një bandë e modeleve të ndryshme,
është se unë kam një bazë të model, që unë zakonisht
vetëm thirrje "model bazë" që ka klasë Meta,
dhe ajo vendos bazën e të dhënave të barabartë me db.
Dhe pastaj të gjitha modelet e mia të mëvonshme do të trashëgojnë nga atë klasë bazë.
Dhe atëherë unë nuk duhet të shqetësohen për vendosjen klasën Meta.
>> Pra, kur ky fakt merr hartuar poshtë në një deklaratë SQL,
kjo duket si këtë gjë të keqe poshtë këtu, "CREATE TABLE ID studenti numër i plotë,
" cfaredo.
>> Dhe, unë mendoj se kjo është më e shkurtër, kjo SQL query drejtë këtu,
por në qoftë se ju shikoni në këtë klasë këtu ju mund të shikoni saktësisht se çfarë po ndodh.
Ju mund të shihni se çfarë llojet e fushave ka, çfarë ata janë të janë të thirrur,
dhe kështu, unë mendoj se duke kërkuar në këtë kod Python
është shumë më i lexueshëm se duke u përpjekur për të shkruar këtë query SQL.
>> Pra, në mënyrë që në fakt përdorin bazën e të dhënave,
ne duhet të lidheni me atë brenda Python.
Pra, unë zakonisht shkruaj një funksion të quajtur initialize_db se ka dy gjëra.
Ai merr në bazën e të dhënave db objekt dhe kjo
lidhet me të, e cila hapet vetëm deri seksionin në bazën e të dhënave.
Nëse jeni vetëm duke pse Faqja e internetit në kompjuterin tuaj lokal,
kjo nuk është një punë e super të madhe për t'u shqetësuar në lidhje me lidh dhe shkyçja,
por në qoftë se ju do të vrapojnë ajo në një faqe interneti, ju
doni të bëni të sigurtë që, sa herë që një përdorues lidhet me të, kur ata të ngushtë jashtë
Faqja e internetit, ata shkëputje kështu që ju nuk kanë një bandë e njerëzve të lidhur
në bazën e të dhënave tuaj të gjitha përnjëherë.
>> Dhe pastaj, kur ju të lidheni me bazën e të dhënave,
ju doni të telefononi db.create_tables, dhe lista e modeleve për atë që ju dëshironi
për krijimin e tabelave.
Kështu që këtu, unë vetëm dua të të krijuar atë për këtë nxënës.
Dhe pastaj, çfarë është e rëndësishme, është që të specifikoni sigurt = e vërtetë më kohë.
Pra, çfarë kjo deklaratë do të bëjmë, është se ajo
krijon tabelat për Modeli student, por vetëm
nëse kjo tabelë nuk ka krijuar tashmë.
Kjo është ajo që specifikon sigurta.
Pra, kjo nuk do të prishësh tavolinë tuaj ekzistues,
ajo vetëm do të krijojë një të ri Tabela në qoftë se nuk është një atje.
Pra, ju mund vetëm të krijojë tabelat herë duke përdorur SQL.
Dhe pastaj të ketë se ulur bazës së të dhënave atje, dhe pastaj lidheni me çdo kohë,
por kjo është zakonisht e bukur vetëm për të vënë në këtë thirrje create_tables,
kështu që, në qoftë se ju ndonjëherë fshini tuaj kur ju drejtuar bazës së të dhënave web tuaj
app përsëri, ajo do të rikrijuar atë.
>> Pra, vetëm sigurohuni që të sigurta është përcaktuar të jetë e vërtetë,
ose ju do të gjeni të dhënat tuaja vetëm duke u clobbered çdo kohë.
Dhe pastaj, ju vetëm mund të telefononi initialize_db për të krijuar
një lidhje, dhe për të krijuar tavolina nëse është e nevojshme.
>> Pra, gjëja më e zakonshme që ju do të dëshironi të bëni,
ose një nga gjërat më të zakonshme, është që në fakt të futur gjëra të
në bazën e të dhënave tuaja.
Dhe kështu, në vend që për të shkruar një insert NË
deklaratë me të gjithë vlerat e përcaktuara,
ju në fakt mund të telefononi funksion në klasën e studentëve.
Pra, kur ju krijoni një klasë që trashëgon nga modeli,
ajo ka kjo të krijojë metodë.
>> Pra, ju bëni klasit name.create, dhe ju specifikoni parametrat
që ju doni të kalojë në.
Pra, në qoftë se unë dua të shtoj disa studentë në shembullin tonë libri klasën CS50,
Unë do të vënë në Davidin, i cili ka një nota shumë të mira, ai ka një 95.
Dhe veten time, kush nuk e bën aq mirë në CS50, unë kam një 50.
Dhe kështu, gjë e bukur për çfarë ky funksion krijojë bën,
është se kthimit shembull, ose rresht, që ajo krijoi në tryezë,
dhe kështu atëherë ju ruani atë në një ndryshueshme, dhe të punojnë me të më vonë.
Ju mund të ndryshojë rreth, e cila Unë do të tregoj një shembull të.
>> Vini re se unë nuk e bëri duhet të specifikojë ID,
sepse pasi ajo është PrimaryKeyField, ajo do të automatikisht
ardhura atë nëse ju nuk e specifikoni atë.
Dhe, në fakt, ju ndoshta nuk duhet të specifikojë atë,
sepse ju mund të aksidentalisht plaçkë ID e dikujt tjetër.
Dhe ju doni të bëni i sigurt se kjo është unik.
>> Pra, në fakt, më gjë e zakonshme ju doni të bëni,
ndoshta zgjidhni nga bazës së të dhënave sapo ju
kanë shumë informacione në atje.
Dhe kështu, në qoftë se ju doni të merrni gjithçka, kështu ekuivalenti i zgjedhur yllit
nga deklarata studentëve, atë vetëm do të jetë student.select.
Dhe që do të ju jap përsëri një grup me të gjithë nxënësit objekteve në të
që ju të iterate mbi ju dëshironi.
Ju mund të merrni gjërat nga ajo.
Dhe shumicën e kohës, ju nuk duan vetëm për të bërë të zgjedhur,
ju në të vërtetë doni të specifikojë diçka.
Dhe kështu, ju mund zinxhir së bashku këto thirrje funksion,
si si ju do zinxhir Mblidhni deklaratat në SQL.
Kështu që ju mund të bëni student.select (). Ku në këtë shembull.
Dhe pastaj, ju mund të përcaktojnë kushtet,
vetëm duke përdorur Python normale Booleans për të kontrolluar gjërat.
>> Pra, në këtë rast, ju doni të kufizojnë atë që ju jeni zgjedhur për të,
ku student.grade eshte e barabarte me 50, dhe student.name është e barabartë me Ezdras,
kështu që vetëm do të merrni më nga ajo.
Dhe vini re, një të vërtetë gjë delikate këtu është
se, në qoftë se ju doni të specifikoni një dhe / ose një ose dhe / ose,
në Python, ju normalisht do të përdorni, Unë mendoj se fjala "dhe" në fakt,
por këtu ju përdorni simbol të vetme, i cili është normalisht një operator bitwise,
por në këtë rast të veçantë, vetëm mënyra peewee bën atë,
ju përdorni vetëm simbol të specifikojë "dhe."
Kjo është diçka që I merrni përzier shumë,
por ajo nuk ka ardhur deri se shumë në praktikë.
>> Dhe pastaj, një herë ju keni të gjithë studentët nga bazën e të dhënave,
Pasi të keni bërë ju jeni zgjedhur dhe veshin tuaj apo çfarëdo,
ju mund të përdorni një lak foreach, ashtu si normale në Python,
me çdo lloj të iterator ose me çdo lloj të vektorit.
Kështu që ju mund të bëni, për s në student.select (). whe
ri (Student.grade <75), dhe kështu që kjo do iterate mbi çdo student në tabelë
klasën e të cilëve është më pak se 75, e cila në këtë rast, është ende vetëm mua.
Dhe pastaj ju mund të bëni diçka brenda që loop, si më dërgoni një email
dhe më të vërtetë të them kthehet në vë mia Problem.
>> Pra, një tjetër gjë që ju mund të bëni, është e vërtetë e lehtë
për të rinovuar rreshtave brenda tryezë.
Pra, mbani mend kthehen këtu, tuaj kur kam futur,
Kam marrë vlerën që ishte kthyer nga student.create,
dhe unë caktuan atë në emër të quajtur Ezra.
Dhe kështu që tani, ju mund të ndryshojë vlera brenda atë rast,
ashtu si ju do një klasë normale në Python.
>> Kështu që ju mund të vendosni ezra.grade = 95 dhe që do update kopje lokale,
por në qoftë se ju në të vërtetë doni të angazhohen se ndryshimi në bazën e të dhënave,
ju keni për të thirrur ezra.save, kështu që ju quhet metoda .save
në shkallë.
>> Dhe kështu që tani, unë kam ndryshuar me sukses klasën ime në bazën e të dhënave.
Pra, atëherë le të themi se kam marrë të kapur ndryshuar klasën time brenda bazën e të dhënave.
Profesor Malan është ndoshta do të duan të më fshini nga klasa,
dhe kështu që ju mund të telefononi .delete Metoda shembull vetëm në atë gjë.
>> Pra, në qoftë se ju të kërkuar për të shkuar përsëri në këtë lak këtu,
dhe në fakt, në vend i dërguar postë elektronike gjithë
e nxënësve të klasës së cilës është më e vogël se 75, ju të kërkuar për të fshini ato,
në këtë lak ju mund të e quajnë shembull s.delete.
Dhe gjëja e fundit që ju doni të bëni, është sa herë që ju të krijuar një lidhje,
dhe ju jeni bërë me punën tuaj, ju doni të telefononi db.close,
ku db është se baza e të dhënave kundërshtojë që kemi pasur më parë.
Dhe ju doni të bëni të sigurtë që çdo gjë merr mbyllën nga.
>> Ftohtë.
Deri tani, unë kam një kërkesë shembull.
Unë e kam lloj i para-bërë gjithçka vetëm kështu që nuk do të ketë ndonjë coding jetojnë
gabime, por ne mund të ecin nëpër ajo dhe të shohim se si ju do të vënë balonë
dhe Peewee së bashku, dhe të bëjë një app thjeshtë.
Unë e quaj atë CS50 përçartje, dhe kjo është lloj i një platforme të thjeshtë blog.
>> Pra, së pari, unë do të drejtuar atë dhe të tregojë se çfarë ajo duket si,
dhe pastaj ne mund të shikoni më shumë në kodin.
Mirë, kështu që le të vetëm të drejtuar këtë.
Cool, unë do të bëj këtë pak më të vogël.
Kjo nuk është shumë e bukur, vetëm për shkak Unë nuk e ka bërë një shumë të CSS,
por atë që bën është, ajo ka Kjo bazë të dhënash e blog posts,
dhe ajo shkon nëpër të gjitha ata, dhe ajo do të shfaqin ato
në faqen e me qëllim të më të fundit.
Dhe kështu këto janë vetëm disa nga postimet që kisha ruajtur në bazën e të dhënave.
>> Pra, nëse ne duam të krijuar një të ri pas, ne mund të shkojnë në Shto një post të ri,
dhe ne mund të hyjë në titullin e pas, kështu që diçka si, seminar CS50.
Wow, me të vërtetë duke shijuar seminar.
>> Ftohtë.
Pastaj ju shtypni post, dhe ajo do të ju përcjellim përsëri në faqen kryesore,
dhe pastaj ju do të shihni se mesazhin e fundit është shtuar.
Dhe ne ende kemi të gjitha ato atje.
Deri tani, le të hap nëpër të gjitha të Kodi dhe të shohim se si kjo është zbatuar.
>> Kështu që, unë mendoj se gjëja e parë që le të hidhini një sy në, është në fakt modele.
Një shumë e kohës, kur ju jeni dizajnimin diçka,
ju doni të mendoni për herë të parë se si ju jeni duke shkuar për të përfaqësuar të dhënat tuaja,
dhe pastaj projektimit gjëra rreth se, kështu që çdo gjë ka kuptim.
Dhe kjo është në fakt si unë e bëri atë kur unë isha duke e bërë këtë,
U ula dhe mendova, çfarë unë dua në një post.
>> Kështu që, këtu, kemi të njëjtën strukturë që unë u përmendur më herët,
ku ne bëjmë db = Sqldatabase ('posts.db').
Në të vërtetë, ju ndoshta nuk dëshironi të kodit të vështirë në bazat e të dhënave të emrit tënd.
Që ndoshta duhet të jetë një parametër që është ruajtur diku, ndoshta
në një config file, por në një shembull i vogël si kjo,
kjo është në rregull për të kodit të vështirë që në.
>> Deri tani, ne kemi këtë klasë Post, e cila trashëgon nga modeli bazë.
Dhe kjo ka, përsëri, ID = PrimaryKeyField.
Në fakt, në qoftë se ju nuk e specifikon, në qoftë se unë në fakt hoqa qafe të kësaj,
atëherë Peewee ne do të kujdeset për automatikisht duke krijuar atë arë ID,
dhe ajo do të automatikisht të bëjë atë një PrimaryKey, e cila
Unë mendoj se është me të vërtetë e bukur, sepse zakonisht, kjo është diçka që ju dëshironi të keni,
por unë doja të vënë atë në mënyrë të veçantë, vetëm kështu unë kujtoj se kjo është në atje.
Por në qoftë se ju nuk e specifikon se, se do të jetë atje automatikisht.
>> Kështu pra, unë kam një datë që është një DateTimeField, dhe të gjithë
Këto fusha të ndryshme, në qoftë se ju shikoni në dokumentacionin Peewee,
kjo do t'ju japë një listë e ndryshme llojet e fushave që ju mund të përdorni.
Për pjesën më të madhe, kjo është analoge me atë që ju do të shihni në SQL.
Pra, ka një CharField, një VarCharFields, TextFields,
të cilat janë për shumë kohë tekste, si një blog post
potencialisht, DateTimeFields, DoubleFields, FloatFields,
të gjitha gjërat si kjo.
>> Dhe ju mund të kalojë në argumente të tjera për atë, që unë nuk ka saktësuar këtu.
Thuaj, për shembull, ju nuk doni të të lejojë dy Mesazhe të kenë të njëjtin titull,
ju mund të specifikoni diçka si unike = Vërtetë,
dhe kjo është vetëm një parametër shtesë për ara që kur ai përpilon atë
në SQL, ajo do të specifikojë se ajo duhet të jetë unike.
Ju gjithashtu mund të specifikojë diçka si jo null dhe gjitha gjërat e tjera
normalisht ju bëni në SQL.
Pra, kjo është një shumë e thjeshtë model që ka datën.
Vini re këtu, brenda DateTimeField, Unë specifikuar se çfarë parazgjedhur është.
I specifikuar atë që të jetë datetime.datetime.now,
për shkak të mënyrës se kjo merr vlerësuar,
ai në fakt vlerëson datetime.now kur
ajo merr futur në bazën e të dhënave.
>> Unë mendoj se, unë do të kemi të dyfishtë kontrolloni këtë,
por në qoftë se keni kryer diçka si kjo, atëherë kjo në fakt do të vlerësojë se një herë,
dhe pastaj DateTime do të jetë gjithmonë e njëjtë.
Pra, vetëm në qoftë se ju jeni duke bërë diçka me datetimes, kontrolloni të dyfishtë
se është e vlerësuar kur në fakt merr futur, ose tjetër
ju mund të ngatërrohet.
>> Titulli është vetëm një CharField, e cila ka
më shumë argumente ju mund të kalojë në specifikuar saktësisht se sa kohë ju
duan që ajo të jetë, por këtu, ajo nuk ka të vërtetë rëndësi.
Dhe tekst do të jetë teksti i të gjithë post,
dhe kjo do të jetë një TextField vetëm për shkak se ju doni
të lejojë që ajo të jetë një varg goxha të gjatë.
>> Pastaj ne kemi këtë Meta subclass që vetëm
specifikon se ne duam bazën e të dhënave ku kjo është hapur në fakt deri në
të jetë objekt db që ne kemi këtu.
Dhe gjëja e fundit që ne kemi këtu, është vetëm ky funksion
se ne jemi duke shkuar për përdorim nga bota kryesore
të nisja bazën e të dhënave për të lidhur në ajo, dhe pastaj për të krijuar tabelën Post.
>> Tani, le të shohim në vetë aplikacionin kryesore.
Pra, kjo është mjaft e një pak më të gjatë se ato
që ne kemi parë më parë, por shpresojmë se jo shumë e keqe.
Pra, më lejoni të zgjasë këtë.
Mirë.
>> Pra, vini re dhe të lartë unë importuar një bandë e tërë e gjëra të tjera
nga balonë se ne nuk kemi parë me të vërtetë më parë.
Dhe shpresojmë se, ne mund të kalojnë nëpër secili prej tyre një nga një
dhe të flasim pak më shumë në lidhje me ata, të renditura nga shembull.
Pra, ne kemi balonë, dhe render_template,
të cilat ne kemi parë më parë, ky objekt kërkesë,
i cili do të dalë kur ne shohim se si forma që unë ishte treguar në fakt
punon.
Redirect, e cila ju lejon të përcjellim prapa nga Create New Post të
Kthehu në faqen origjinale, dhe pastaj URL, e cila është diçka që ju lejon të
kuptoj se ku mbi Faqja e internetit një faqe të veçantë është.
>> Kështu pra, tjetër gjë që unë bëj, është të importojë
të gjitha informatat nga modelet e fotografi që ne ishim vetëm duke kërkuar në.
Dhe, vërtet.
>> Pra, diçka tjetër të re që vjen deri kur ju jeni që kanë të bëjnë me të,
sidomos bazat e të dhënave, është se ju mund të specifikoni
një funksion që merr quajtur më parë çdo kërkesë, dhe funksion që merr
i quajtur pas çdo kërkese, duke përdorur këtë Kërkesa FUNKSIONI bojaxhi app.before.
>> Dhe kështu kjo do të ekzekutohet kudo ky funksion është.
Kjo nuk duhet të jetë i quajtur më parë të kërkesës,
por zakonisht kjo është diçka ndjeshme për të thirrur atë.
Ju mund të specifikoni çfarëdo funksioni ju doni të merrni aty thërriti,
kështu që unë specifikuar këtë initialize_db funksion që kemi pasur përsëri në modelet
fotografi, kështu që para çdo kërkesë, ju dëshironi të lidheni me bazën e të dhënave.
>> Nuk janë dy të ndryshme mënyra që ju mund ta bëni këtë.
Ju mund të bëniapp., I besoj se është after_request.
Dhe dallimi në mes after_request dhe teardown_request,
është se after_request do të ndodhë vetëm nëse kërkesa në fakt ishte e vlefshme.
Dhe kështu, vetëm nëse Kërkesa ishte i suksesshëm,
në qoftë se asgjë nuk shkoi keq, por teardown_request
ndodh në rastin e një të suksesshëm kërkesë, ose në rastin e një gabimi.
>> Pra, zakonisht, ju doni për të përdorur teardown_request,
nëse nuk doni të bëni diçka, sidomos të ndryshme
në rastin e një gabimi.
Por vetëm për mbylljen e bazës së të dhënave, nëse ka sukses, ose nëse ajo dështon,
ne nuk ju duan të shkëputje nga bazën e të dhënave.
Pra, ajo që quhet, db.close mbi objektin db.
>> Vini re se teardown_request merr në një përjashtim.
Kështu që ju mund të kontrolloni nëse ka ishte në të vërtetë një gabim kur ajo ishte mbyllur,
por këtu, me shpresë, atje nuk janë një shumë e tërë e gabimeve,
kështu që ne jemi vetëm lloj i injoruar atë.
>> Në rregull, dhe pjesa tjetër e ajo nuk është shumë e keqe.
Pra, kur të shkojmë në faqen kryesore, bëmë këtë Template home.html
që do të hapë.
Kalojë është në postin e e barabartë me, dhe çfarë kjo
nuk është, mos harroni ne kemi këtë post model, kështu që ne kemi zgjedhur të gjitha postimet e bëra,
dhe pastaj një tjetër gjë që ju mund të bëni, ju mund të specifikoni klauzolë ku,
ju mund të specifikoni një porositur nga, dhe kështu që ne kemi marrë
të gjitha postet që merrni zgjedhur, dhe pastaj
ne urdhërojë ata nga post.date.descending.
Dhe që do të specifikojë, kur ata në të vërtetë dalin,
një më të fundit do të jetë një shumë e parë.
>> Dhe atëherë, ne të kalojë atë në template home.html,
kështu që le të vërtetë të hapur që Template të vërtetë të shpejtë,
dhe për të marrë një sy se si kjo është duke punuar.
Dhe kjo nuk është HTML i madh, por me shpresë, ne mund të përqëndrohen në Python.
>> Pra, ka një lidhje të shtoni të reja Post, dhe kështu kjo specifikon rrugë
brenda balonë që ne përcaktojnë, e cila është e drejtë këtu.
Kjo është rruga e re postare, dhe ne të specifikojë se deri këtu.
Dhe kështu që është një lidhje që do të shkojë në atë rrugë brenda server balonë.
>> Gjëja më interesante është kjo për lak këtu.
Pra, ne të specifikojë se kjo parametër post që
u miratua në të funksion render_template,
për çdo post në post-së objekt që merr kaluar në.
Ne duam të shtypura nga titulli pas, në H1,
dhe pastaj më poshtë, ne duam të shtypura nga teksti i mesazhit brenda një paragrafi.
>> Dhe këtu, ne mund të vërtetë thërrasë një funksion Python,
kështu që ne mund të telefononi strftime, ST-RF-kohë, dhe ju mund të kalojë në vargun format
që ju doni të shtypura të dhënat në.
Pra, kjo është shumë e bukur që ju mund të në fakt e quajmë këtë funksion Python
nga brenda këtu.
Ju nuk keni për të bërë formatimin në pala kontrollues, sepse me të vërtetë,
formatimin data është diçka që ju doni që të merren brenda View.
>> Dhe të gjitha këto për qind gjërat nuk është super i rëndësishëm.
Nëse ju shikoni dokumentacionin për funksionin strftime në Python,
kjo specifikon të gjitha këto gjëra, por kjo është
sa, kur ne ishim duke kërkuar në faqen kryesore këtu,
ajo Formatet kjo me një e bukur datën, dhe kjo përcakton AM ose PM,
por normalisht, nëse ne nuk kanë këtë këtu,
ju ndoshta do të merrni disa mbeturina datë që nuk duken shumë të mirë.
Dhe pastaj ne specifikojë post.text, dhe unë mund të
kanë vënë një çift të line breaks here, vetëm
për të vënë disa hapësira në mes të çdo post.
>> Kështu që, unë mendoj se më e rëndësishme gjë në këtë shembull,
është se ju mund të përdorni këtë për lak.
Dhe kjo është analoge me gjëra që ju mund të bëni në PHP.
Ju mund të iterate nëpër, çdo gjë merr kaluar në,
dhe kështu, në vend që të bëjnë kopje / paste, kopje / paste të gjitha HTML e,
ju vetëm duhet të shkruani atë një herë, dhe më pas ju mund të iterate mbi të gjitha postet.
>> Dhe kjo është diçka zakonshme që ju doni
për të bërë, kur ju keni një shumë të të dhënave, është se për çdo gjë në të dhënat tuaja,
ju doni të bëni një gjë të ngjashme.
Dhe pastaj, vetëm mos harroni, se kur ju doni të shkruar diçka në mënyrë eksplicite
në HTML, ju përdorni formatimin e teksteve dyfishtë këtu,
por pastaj kur ju doni të specifikoni disa informacione në lidhje me një kusht,
ose rreth një për lak, ju përdorin për qind kllapa.
>> Pra, duke shkuar prapa në Python Kodi, kështu që shpjegon
çfarë po ndodh në kryesore rrugë, kur të shkojmë atje,
kjo vetëm tregon të gjitha Mesazhe të, por pastaj pyetja
po, si nuk kemi të vërtetë të merrni Mesazhe në bazën e të dhënave, e cila
është pak më shumë interesante.
>> Pra, kur ju klikoni mbi New Lidhje Post, që e pamë këtu,
ajo ju përcjellëse të këtij formulari.
Dhe kjo është vetëm një telefonatë e thjeshtë të funksion render_template, e cila më pas
kalon në postin e ri në formë të HTML.
Pra, le të marrin një vështrim në atë.
Pra, kjo është shumë e thjeshtë.
Ajo ka një formë të thjeshtë HTML, i cili do të duket pak e njohur,
bazuar në formularët në CS50 Financave.
Dhe kështu, që ne të specifikojë këtu, veprimin.
Dhe këtu, në qoftë se ju jeni duke punuar me PHP, normalisht, atë
do të jetë diçka si, create.PHP, por këtu
ne fakt specifikoni një rrugë brenda server balonë.
Dhe kështu, korrespondon kjo rrugë për të krijuar rrugë
që ne kemi këtu, të cilat ne do të shkojnë në në një të dytë.
>> Dhe kështu, ne të specifikojë se kjo është një metodë pas,
sepse ne duam të dërgoni Këto të dhëna formë, dhe zakonisht
kur ju jeni dërguar të dhëna nga një formë, ju mund të dëshironi të përdorni një kërkesë pas,
vetëm kështu që ju nuk do të përfundojnë me këtë të madhe, ngathët URL.
Por ju gjithashtu mund të përdorni një kërkesë GET, dhe të kalojë atë në me kurs ndryshueshme,
por për forma, është e mirë të një kërkese postës këtu.
Dhe kështu pastaj, ashtu si ju do të bëjë me HTML dhe PHP,
ju mund të specifikoni këto inpute tekst, dhe ju mund të specifikoni emrin e tyre,
dhe kjo është emri që do të marrë kaluar në objektin e kërkesës brenda balonë.
>> Dhe pastaj ne kemi një Submit buton që thotë Post.
Dhe këtu, Posta është emri i button, sepse kjo është një blog post,
por këtu, pas është metoda kërkesa.
Kështu që ata janë e njëjta fjalë por në fakt pa lidhje.
Vërtet
>> Going back to kodit Python, kur kemi quajtur krijojnë metoda,
vini re këtu se ju mund të në fakt të përcaktojë brenda rrugës
metodat kërkesë se ju doni për të pranuar,
dhe kështu që këtu, unë të specifikojë se unë vetëm duan për të pranuar një metodë Post.
Pra, në qoftë se unë në fakt të përpiqet për të vizitoni faqen direkt, i cili është përdorur një kërkesë marrin,
ai do të më thoni "Metoda nuk lejohet."
>> Dhe kështu, ju keni faqet, lloj si Kjo faqe krijojë, të cilën unë jam vetëm
me të vërtetë duke përdorur si një mënyrë për forma për të marrë të paraqitur,
ju mund të specifikoni se ju nuk e bëni dua që njerëzit të jenë në gjendje për të shkuar atje
direkt nëpërmjet një kërkese të merrni, ose në qoftë se ju nuk doni,
për disa arsye, një kërkesë Post, ju mund vetëm të specifikojë GET këtu,
por në këtë shembull, ne vetëm dëshironi kërkesa Post për të dalë.
>> Pra, kur create_post quhet, kur kemi vizituar se nëpërmjet kërkesës Post,
sa herë që ju të shkoni në një të veçantë rrugë, ka kjo kërkesë objekt,
dhe ne kishim për të importuar Kërkesat në krye,
por ka kjo kërkesë objekt që merr kaluar në,
dhe ju mund të hyni në të dhënat formë, e cila automatikisht do të merrni mbushur
kur ju të dërgoni një kërkesë nga një formë.
>> Dhe pastaj, çfarë unë mendoj është me të vërtetë e ftohtë, është e
se forma objekti për të marrë kaluar në, është vetëm një fjalor Python që
përmban, në qoftë se ju access-- kështu që këtu, le të mua tërheq lart HTML pranë tij, vetëm
kështu që ju mund të keni atë si një referencë, Po, kështu që
emrat që ne të specifikojë këtu për fusha të ndryshme, kështu që
titulli dhe teksti, ne atëherë vetëm përdorni ato gjatë këtu
si indekse në të dhënat formë.
Pra, kjo është super i përshtatshëm.
>> Pra, atëherë ne e quajmë post.create, e cila do të krijojë dhe automatikisht futur
Ky objekt i ri pas në bazën e të dhënave.
Dhe unë mendoj se kjo krijoj funksionin këtu është një shembull i vërtetë cool se si
balonë i fuqishëm është dhe duke punuar me këtë, sepse në qoftë se ju jeni duke bërë diçka
në PHP, ju mund të keni për të të bëjë një shumë të validimit,
ju do të keni për të, atëherë të krijuar një lidhje bazës së të dhënave,
ju do të keni për të, atëherë ekzekutuar query SQL,
por këtu ne vetëm duhet kjo e bukur post.create, të cilat ne mund atëherë vetëm
të marrë informacion nga e kërkesës objektit,
dhe pastaj të kalojë atë në një të ri postoni se ne jemi duke krijuar.
>> Dhe pastaj, shumë e fundit gjë që ne duam të bëjmë,
është që të përcjellim Mbrapsht në shtëpi.
Dhe kështu që ne përdorim këtë Balonë përcjellëse funksion.
Dhe diçka që ne nuk e kishte parë para, ishte ky funksion URL.
Pra, URL për funksionin lejon ju të kalojë në fakt emri
i një funksioni në kodin tuaj Python, në vend se rrugë të veçantë
se kjo është në.
>> Kështu që unë mund të ketë po aq e lehtë ridrejtuar një përdorues për të zvogëluar,
e cila do të dërgoni atë përsëri në shtëpi, por duke përdorur URL për funksion është e bukur,
sepse në qoftë se ju të ndryshojë vendi ku gjërat janë,
kështu që le të themi se kam ndryshuar shtëpi të jetë në / shtëpi në vend të kësaj,
kjo ende më pas do të kthehen / shtëpi, sepse në fakt shkon dhe duket deri
emri i funksionit, dhe ajo do të të japin të mbështesë URL për këtë.
>> Pra, lloj i mbi supozimi se ju jeni
më shumë të ngjarë të ndryshojë ku gjërat janë, se emrat e funksioneve.
Ju mund të përdorni këtë të vërtetë bukur URL për funksionin.
Dhe një gjë që të jetë i vetëdijshëm për që është pak e ndërlikuar,
është se ju mendoni se ju mund vetëm thërrasë përcjellim në URL për,
por në të vërtetë të gjitha rrugët kanë për t'u kthyer një lloj të tekstit dhe HTML,
kështu që ju në të vërtetë keni për të kthimin e thirrjes përcjellëse.
Përndryshe, ju do të merrni diçka pavlefshme për të mos kthyer një varg,
sepse të gjitha këto duhet të kthehen HTML ju të vërtetë duan të bëjnë.
>> Dhe kështu, kur ju telefononi përcjellëse, ajo ju përcjellëse në faqe,
por në fakt ajo kthen HTML ju keni nevojë për të ekzekutuar atë përcjellëse.
Kthehu mbrapa në faqen kryesore.
Pra, ne kemi këto dy pikëpamje të ndryshme.
Ne kemi pikëpamje shtëpi.
Ose, unë mendoj unë duhet të them templates.
Ne kemi këto dy templates, template shtëpi që
tregon të gjitha postimet tona, dhe atëherë kemi këtë gjë ad,
dhe kur ju klikoni këtë post, ajo shkon në një rrugë të re në kuadër të balonë,
por kjo rrugë nuk do të kanë një template përkatëse.
Ju nuk keni për të parë asgjë, por ju prapë mund të
kanë këtë punë do në prapaskenë.
Dhe pastaj ju merrni ridrejtuar Kthehu në faqen kryesore.
Dhe pa dyshim, është e lehtë për të punuar në disa CSS nicer në template
dhe e bëjnë këtë të duket një shumë nicer, por të gjithë e logjikës kryesore
është atje në Python.
>> Ndonjë pyetje në lidhje me këtë shembull?
Unë e di se ka shumë të gjëra të ndryshme ndodh atje,
shumë gjëra që ne nuk e kishte parë para, por si çdo gjë.
Po.
>> AUDIENCA 1: A ju duhet të bëni ndonjë gjë të veçantë për pastrim të dhënave që është
vijnë nga forma?
Kam vënë re se ju vetëm tha "të krijojë"
EZRA Zigmond: Yeah, kështu që kjo është në fakt, kjo është një pikë të vërtetë të mirë.
Pra, pyetja është, a duhet të kontrolloni dhe sigurohuni
që të dhënat është e vlefshme, dhe bëjnë ndonjë lloj të ashpër
për t'u siguruar se ajo është e vlefshme, sepse si ju mund të shihni këtu,
Unë nuk jam duke bërë atë.
Pra, le të shohim se çfarë ndodh në qoftë se unë të postoni diçka bosh.
Pra, kjo do të në fakt vetëm të bëjë një pas bosh dhe plotësoni në dataKoha.
>> Pra, në realitet, ju ndoshta do të dëshironi të bëni diçka si,
ndoshta specifikoni nëse titulli është e barabartë me string i zbrazët, atëherë nuk e bëjmë këtë.
Apo, vetëm të bëjë atë nëse titulli është jo të barabartë me vargun e zbrazët.
Pra, kjo nuk ka të vërtetë automatikisht të kujdeset për atë ashpër
për ju, kështu që ju ende nevojë për të bërë këtë.
Po, pyetje e mirë.
>> AUDIENCA 2: A ka pastrim për injeksion vazhdim?
A e dini se?
>> EZRA Zigmond: Shpresojmë, peewee e bën këtë.
Unë mendoj se do të jetë një goxha Biblioteka keq në qoftë se ajo nuk e ka bërë atë.
Unë nuk e di saktësisht.
Unë do të duhet të shikojmë në query se ajo gjeneruar.
Unë mendoj se, në qoftë se unë shtypur në një blog post se lloj i dukej
si një sulm SQL injeksion, diçka e tillë, nëse kjo
është si një fushë fjalëkalim apo diçka, ju mund të bëni diçka si kjo.
>> Unë mendoj se do të vazhdojë merrni postuar fjalë për fjalë,
por unë mendoj se peewee bën një lloj i ashpër e të dhënave
para se ai në fakt ekzekuton atë.
>> AUDIENCA 1: Kjo fushë tekst është projektuar për të marrë plain text, e drejtë?
>> EZRA Zigmond: Po, ajo është.
Po.
Kështu që unë mendoj se të gjithë e, kështu që kjo është sjellje korrekte, që do të bëjë këtë,
Por unë mendoj se Peewee shpresojmë se ka bërë
një lloj e mbrojtjes në fundin e tyre.
Dhe në qoftë se ju të kërkuar për kontrolloni të dyfishtë që ka
mënyra kur ju të gjenerojë një pyetje.
kështu që ju nuk keni për të ekzekutuar atë direkt.
Unë do të duhet për të marrë një shikoni në dokumentacion,
por ju në fakt mund të shikoni SQL se ajo është gjeneruar,
dhe për të marrë një vështrim në atë dhe të bëjnë i sigurt se ajo është e ikin gjërat.
>> Një tjetër arsye pse ju mund dëshironi të shikoni në SQL
që peewee është kompjuteri, është nëse gjërat duket të jetë duke shkuar me të vërtetë ngadalë,
ju mund të marrë një sy dhe shikoni se çfarë është vërtetë për ta bërë, sepse kjo është ndonjëherë
të lehtë për të shtuar aksidentalisht në, në mënyrë që ju shkruani atë,
ju aksidentalisht mund të keni atë zgjidhni të gjithë bazën e të dhënave të parë,
dhe pastaj të bëjë disa operacion renditjes në se, kur ju me të vërtetë
do të thotë për të zgjedhur një mesin.
>> Dhe kështu, nëse gjërat nuk janë mjaft duke shkuar drejtë,
kjo është e mirë për të marrë një sy në kërkesën që është në të vërtetë duke gjeneruar.
Po.
>> AUDIENCA 2: Kur keni filluar, ju vënë në portin si 5000.
>> EZRA Zigmond: Po.
AUDIENCA 2: A është parazgjedhur me Peewee, apo është diçka që ju mund të ndryshojë?
EZRA Zigmond: Po, kështu që Porti është paracaktuar me balonë.
Nëse keni drejtuar atë pa specifikuar asgjë,
ajo automatikisht do të bëjë atë.
Unë besoj se, unë do të kemi të dyfishtë kontrolloni këtë,
por ju mund të specifikoni se në app.run, Unë mendoj se ju mund të bëni diçka si,
port = 8080.
Le të japim atë një provoni vërtetë të shpejtë.
Yeah, kështu që ju vetëm mund të specifikoni port = 8080, dhe ajo do të kandidojë atë atje,
që unë mendoj se, në qoftë se ju të kërkuar për të drejtuar atë në IDE, unë nuk e kanë provuar këtë,
por unë mendoj se në qoftë se ju vrapoi atë në portin 8080,
ju ndoshta do të jetë në gjendje për të hyrë në server,
ashtu si ju keni qenë për faqen e internetit.
>> Po, por është e lehtë për të ndryshuar atë në qoftë se ju
kanë ndonjë lloj si port-forwarding gjëra që ju duhet të bëni.
>> Ndonjë pyetje të tjera?
Po?
AUDIENCA 1: Pra, unë pashë në tuaj Modelet që, si ju përmendur,
ju duhet të specifikojë bazës së të dhënave për çdo objekt.
A ju ndodh që të dini, nuk që e bëjnë atë të vërtetë e lehtë në qoftë se ju
kanë shumë të bazave të të dhënave SQLite që ju dëshironi të përdorni për një app të vetme web,
që ju mund vetëm të specifikoni një bandë e ato të ndryshme në modelin tuaj?
>> EZRA Zigmond: Po, le të më hapur se deri vërtetë të shpejtë.
Pra, ju jeni duke thënë, në qoftë se ju dëshironi të keni një bandë e diçka të ndryshme, ndoshta
si dhe studentët, për disa arsye, diçka si kjo?
Yeah, kështu që unë mendoj se ju ende, çdo model
do të duhet të ketë vetëm ende një bazë të dhënash të caktuar në të,
por në qoftë se ju të kërkuar për ketë modele të ndryshme që
kanë caktuar objekte të ndryshme bazës së të dhënave për atë, ju mund të patjetër të bëjë atë.
Pra, në qoftë se unë krijuar një të re, diçka si kjo,
dhe tani kjo është një student që duket kaq të çuditshme si një blog post,
Unë mund të specifikojë se bazës së të dhënave është e barabartë me db_2 këtu.
Kështu që, unë mendoj se është rruga kryesore që ju mund të bëni atë.
>> Ftohtë.
Ndonjë pyetje të tjera?
>> Pra, vetëm për të përfunduar deri pak bit, këtu janë disa burime,
dhe këto slides do të postohen në internet kështu që ju mund të vërtetë të merrni në këto lidhje.
Burimet më të mira janë me të vërtetë dokumentacioni për balonë
dhe Peewee veten.
Ata janë të shkruar me të vërtetë mirë, unë mendoj.
Pra, në faqen e internetit balonë është këtu, dhe ata kanë një QuickStart tutorial se
do të ecin nëpër ngjashme gjëra në atë që unë eci nëpër,
por në qoftë se ju doni ndonjë lloj të rishikimit nga gjërat që unë shkova mbi,
apo keni menduar se kam shpjeguar diçka në një mënyrë konfuze,
ata do të kenë shembuj të ngjashme atje.
>> Peewee ka dokumentacion, dhe ata kanë një QuickStart tutorial
që shkon mbi parametrat kryesorë që ju do të dëshironi të përdorni.
Pra, gjërat kam biseduar në lidhje me e unike, e specifikuar defaults,
llojet e ndryshme të fushave që ju mund të përdorni, ata të gjithë do të jenë aty.
>> Gjithashtu, në qoftë se ju keni pyetje në lidhje me Peewee,
dhe ju postoni ato në StackOverflow, djalosh i cili bëri Peewee fakt
vazhdon dhe përgjigjet ata ndonjëherë.
Nëse keni një pyetje, me shpresë ai do të jetë në gjendje për t'iu përgjigjur ajo,
sepse ai shkroi të gjithë gjë.
Unë mendoj se kjo është gjithçka Unë të kërkuar për të mbuluar.
Faleminderit për të ardhur nga.