[Speel van musiek] ESRA ZIGMOND: Hi, almal. Dankie vir die kom vandag. Hierdie seminaar is "Python Web Apps met Fies. " So, ek gaan om te praat 'n bietjie oor waarom jy dalk wil Fies gebruik om web apps met Python, in teenstelling aan 'n ander raamwerke daar buite, soos Django, wat is die mees bekende. Die subtitel is "en snuiter, "en dit is iets ons gaan praat oor hoe om met SQL databasis. Dit maak dit baie mooi. So, hier is net 'n vinnige verduideliking van wat ek wil om te gaan oor. So, in die eerste, net een skyfie wat gaan vinnig start wees, dit is hoe om alles te kry opgestel op jou rekenaar. Ek gaan word te demonstreer dit op my plaaslike Mac masjien, net omdat dit is waar ek het dit gedoen voor, ek is baie gemaklik met dit, maar dit is beslis moontlik op die CD50 IDE. So, na dit, ek wil stel wat Fies is, en oortuig waarom jy moet gebruik dit in die eerste plek. Dan, sal ek 'n vinnige gee voorbeeld van wat jy kan doen in fles, 'n vinnige voorbeeld van wat jy kan doen in snuiter, en dan sal ek jou 'n meer wys volledige voorbeeld aansoek dat ek saam dat ons kan deur saam te loop. En dan uiteindelik, in die laaste skyfie, ek het sommige hulpbronne wat jy kyk by online vir meer inligting. Dit is nie 'n volledige handleiding oor hoe om te gebruik Fies. En Ek sal hoop om te verlaat 'n geruime tyd vir vrae. Enigiemand kyk plaaslik, net soos, skree in die middel As jy enige vrae het. So vinnige installasie dinge, as jy wil om saam te volg, of as jy wil om dit te kry op jou eie masjien, Ek gaan word met behulp van Python 2.7.10. Fies werk nie met Python 3, maar ek wil met Python 2, want daar is sommige Python pakkette wat nog nie werk met 3. As jy pit geïnstalleer, wat is 'n Python pakket bestuurder, Ek dink as jou Python is groter as of gelyk aan 2.7.9, jy het dit reeds geïnstalleer, dit is super maklik om hierdie pakkette te installeer. Jy kan dit doen pit installeer Fies, neut installeer snuiter, gewoonlik wat jy hoef te sudo net loop sodat die regte werk. En as jy 'n super ou weergawe van Python, Ek beveel die opdatering van jou Python, of die gebruik van EasyInstall om pit installeer. So, die volgende vraag is, wat is Fies? En ek dink, die eerste 'n redelike vraag het ek gewonder vir 'n lang tyd is, wat is 'n web app? Want dit is 'n woord wat ek dink is gegooi om 'n baie dat ek nie regtig weet. En ek dink dat die beste voorbeeld van wat 'n web app is, werklik is CS50 Finansies, waar dit is nie regtig net 'n webwerf, maar dit is iets wat jy kon soort van interaksie met. Daar is gebruiker rekeninge en alle vorme van verskillende dinge. So, presies waar jy teken die lyn tussen wat is 'n webwerf, en wat is 'n web app, is soort van arbitrêre, maar ek dink die idee, dit is iets meer as 'n webwerf en dit is 'n nuttige toepassing. So, Fies is 'n raamwerk vir maak web apps met Python. En hopelik teen die einde van hierdie, sal ek jou te oortuig dat jy eintlik iets kon skryf soos CS50 Finansies met Python, wat ek soos 'n baie beter as PHP, persoonlik. So, Fies is, hulle noem 'n microframework, waardeur, dit beteken dit is baie eenvoudig, maar extensible. So, dit het net wat jy nodig het, maar as jy wil meer funksies, dit is maklik om hulle in te bring. Maar net omdat dit 'n microframework, nie beteken dat dit is net vir klein projekte. Ek het 'n skakel hier wat sê dat Obama gebruik Fles in 2012 vir sy veldtog webwerf, wat hopelik, is iets van 'n endossement. Maar die ding wat ek regtig graag oor Fies is dat, beteken dit nie regtig enige soort besluite vir jou. Net omdat ons praat oor web apps, Ek het om dit te vergelyk met Ruby on Relings en Django, beide van wat is groot raamwerke, maar hulle albei te maak aannames oor hoe jy wil interaksie met databasisse, hoe jy wil om jou te bied uitsig, en hulle is beslis goeie aspekte wat. Byvoorbeeld, Ruby on Rails het hierdie aktiewe rekord stelsel, wat is 'n baie mooi manier om interaksie met data, maar as jy wil Ruby gebruik op Relings, jy soort van vasgebind in daardie. Maar met Fies, soos ek sal wys jou met snuiter, jy kan ook al soort gebruik van die databasis wat jy wil, en jy kan net trek wat in as 'n uitbreiding in Fies. So dit is waarom ek regtig soos Fies, dit is dat dit nie aannames te maak vir jou gebaseer op dinge wat jy nie regtig nodig het. So, hoekom moet jy Fies gebruik? Die voordele is, is dit net werklik die kern eienskappe gebou in dit wat jy nodig het. So, het jy nie hoef te bekommer oor verstaan ​​van 'n hele klomp van die dinge dat jy nie regtig nodig het. Jy hoef nie te bekommerd te wees oor die draai af funksies dat jy nie regtig nodig het. En, soos ek genoem het, is dit super maklik om by te voeg in uitbreidings van die dinge dat jy nodig het. Sommige van hulle, Fies het hul eie ondersteuning vir dit. So daar is iets genoem Fies admin, wat daardie admin spieëls paneel wat Django bied, wat gee jou 'n mooi visuele manier om jou webwerf te administreer. Maar weereens, as jy maak iets eenvoudig, het jy waarskynlik nie 'n groot admin nodig paneel, so ek dink dit is super nice. En die nadele is dat jy het minder krag uit die boks. So, wanneer jy die eerste oop Fies, en in jou Python program, jy net tik van Fies invoer *, of wat ook al, jy nie presies al kry die eienskappe wat jy dalk wil. En so moet jy meer uitdruklik n lys van die eienskappe wat jy wil. So dit is 'n nadeel nie, maar ek dink dat vir die bou van klein web programme soos ek gaan vertoon jy, dit is nie regtig 'n probleem. En wat is die laaste ding is veronderstel is om te sê, wat is 'n tikfout, is dat daar minder gestandaardiseerde konvensies vir hoe om Fies gebruik, net omdat daar is nie so baie mense dat dit professioneel gebruik in vergelyking met Django. So, as jy iets lyk, "hoe kan ek doen x" in Django, jy sal waarskynlik vind. Daar is 'n goeie ontwerp patrone wat jy kan gebruik, maar met Fies, dit is soort gaan jou eie manier, net omdat dit 'n mooi klein biblioteek. So dit is die nadele, maar ek dink dat dit nog steeds 'n goeie biblioteek te gebruik. So laat ons net Spring regs in Fies. Dit is beslis nie van plan om 'n volledige handleiding wees, maar dit is om jou 'n idee van hoe om dinge te orden, en so jy gemaklik voel gaan af en kyk na die dokumentasie en meer uit te vind. So, laat my maak 'n werklik eenvoudige voorbeeld op die eerste, en wys jou wat dit lyk, en dan sal ons breek dit af 'n bietjie meer. So dit hier, laat my dit kry loop. So, ek het nou my aansoek hardloop. Ek gaan om oop te maak Safari, en dit loop op my plaaslike gasheer. So ek is net gaan om dit groter te maak. Maar localhost: 5000 En so, nou is dit alles doen is, wanneer jy die webtuiste besoek, dit druk uit "Hallo Fies," wat nie super nuttig, maar ek dink dit is cool dat in hierdie klein lêer hier, ons het 'n web bediener hardloop wat die druk van iets. So, laat ons eintlik lyk by die kode vir 'n tweede, en breek dit af 'n bietjie. Is die grootte goed vir almal hier? So, hopelik, jy is ietwat gemaklik met Python. Ek neem aan dat ons kan kyk na die Python en lees deur dit. As jy enige vrae oor enigiets, kan ek ook gaan oor dit. So het die eerste reël is, van Fies, ons invoer, Fies met 'n kapitaal "F" wat is 'n soort van al die belangrikste eienskappe wat jy nodig het. Wanneer jy skryf 'n lêer en die gebruik van Fies, jy gaan wil invoer dat net omdat wat al die vernaamste dinge. Die volgende ding wat ons doen, is ons noem hierdie funksie te Fies, net om 'n app voorwerp te skep, en jy is altyd gaan om te wil om dit te doen. En dan, spring af na die onderkant vinnig, hierdie deel hier is, 'if_name _ == "_ main_" wat soort van 'n Python konvensie. So dit sal slegs voer as jy hardloop hierdie lêer direk met behulp van Python. Dan noem ons app.run, wat sal eintlik begin die app gaan. So, dit is die belangrikste struktuur wat jy sal hê in enige Fies aansoek, is jy sal dit app = Fies (_name_), en dan app.run. So, die twee dinge wat ek het hier, is wat ons roetes te bel. So, laat ons praat oor routing 'n bietjie meer. Ek kom terug na die skyfie gaan. So het die mees fundamentele konsep in fles routing. En dit is die idee dat jy toewys funksies in Python om spesifieke adresse op jou web bladsy. So, wanneer jy wil om 'n nuwe roete te skep, jy dit @ app.route gebruik funksie versierder. So, as jy nie vertroud is nie funksie ontwerpers in Python, dit is hierdie konsep wat Kom jy 'n funksie te neem en omring dit met iets anders. So regtig, wat dit versierder doen, is dat dit die funksie onder dit, en dit voeg meer inligting om dit, maar wat eintlik Fies maak dit gebeur nie super van kardinale belang, maar wat belangrik is, is dat voor die roete, jy sit dit @ app.route, en dan die adres van die roete, so die streep is wat ons gesien toe ons oopmaak net op die webblad. So wat is die tuisblad. Dis net die streep roete. En dan moet jy hierdie funksie. Die naam van die funksie kan wees net wat jy wil. Dit hoef nie noodwendig tot het te doen met die roete. En dan, wat ook al die funksie se terugkeer, die funksie moet 'n string terug te keer. En dat string kan bevat HTML of enigiets nie, en dit is eintlik wat sal kry terug na jou webblaaier as HTML, en dit sal lewer nie. So dit is die dieselfde kode dit was uit die voorbeeld dat ek net gehardloop, so wanneer ons besoek streep dit 'n Hello World funksie noem wat net terug 'n string, Hello Fies, en wat kry gedruk op die skerm. So daar is nog 'n voorbeeld, wat is, wanneer jy na / hello, dit druk uit Hallo Woord, wat moet eintlik sê, Hello World, maar laat ons voorgee dit was opsetlike. So laat trek wat tot ware vinnig. So as jy gaan na localhost / hello, dit sal nou iets anders te druk. So dit is net 'n vinnige voorbeeld van hoe kan jy twee verskillende roetes te skep. So, so ver dit is nie super nuttig, daar is nie 'n hele klomp wat jy kan doen, jy kan net doen alles wat met met verskillende HTML bladsye, en wanneer jy na 'n spesifieke page is dit net laai die bladsy. So laat ons sien n paar meer nuttige dinge wat jy kan doen. So, een ding wat jy mag hê opgemerk in die voorbeeld wat ek getrek up, is dat ek het app.run (debug = True). En so, wat hierdie debug argument nie, is dat wanneer jy jou web bediener te laat hardloop, wanneer jy in jou aansoek, As jy 'n lêer verander is, sal dit die bediener outomaties herlaai. En so het jy nie eintlik om herlaai Python, wat is super nuttig. Ek kan sien dat. Laat my toe om my kode met die tikfout in dit, en voorgee dat tikfout is daar te vestig doelbewus vir insiggewend doeleindes. So laat voeg dit terug. So nou is dit sê Hello World. Ek sal dit red. En as ons terug te trek tot die terminale, sal jy sê dat dit weer te begin, omdat dit 'n verandering bespeur, en so nou wanneer ons herlaai die bladsy, dit sal die druk van die regte ding. So debug is super nuttig vir daardie. Ook, as jy enige het soort van 'n ongeluk, so laat my toe om hierdie aansoek crash deur met dit nie 'n string terug te keer. So, laat ons net dit terugkeer Geen ander rede. En dan wanneer ek dit besoek bladsy, sal dit net crash, maar die bediener nie net crash, dit eintlik gee jou 'n super nuttig terug spoor van alles wat verkeerd geloop het. En wat is regtig mooi, is dat op enige stap in hierdie terug spoor, jy kan oopmaak 'n interaktiewe dop hier, en soort van druk wat veranderlikes wat jy wil om 'n blik op te neem. En so debugging is regtig nuttig vir die uitzoeken wat gaan aan met jou bediener, eerder as om net te sien iets in PHP soos 'n 500 interne bediener fout, wat is super nutteloos. Een ding om bewus te wees van, is dat as jy jou app aanlyn so dit is sigbaar vir die publiek, het jy nooit wil debug modus op te verlaat, want die mense kan eintlik gebruik wat konsole dat ek gewys het aan arbitrêre kode uit te voer. Sodat hulle kan uit te druk soos enige geheime kodes wat jy het daar, hulle kan kyk na presies hoe om jou webwerf werk. So dit is regtig nuttig vir die toets, maar altyd maak seker om dit uit te neem voordat jy enigiets aanlyn publiseer. So wanneer jy die gebruik van iets soos PHP, daar is hierdie idee wat jy kan slaag inligting tussen webblaaie deur om die inligting eintlik in die URL, wat is 'n GET-versoek, maar in fles, kan jy eintlik iets soort van soos dit te doen, deur met 'n roete wat 'n veranderlike as deel van dit. So as jy kyk na hierdie byvoorbeeld op die skerm hier ons het 'n roete wat ('/ hallo /'), en so, as jy besoek / hallo / iets, dat daar iets gaan eintlik kry gevul in die naam veranderlike. En sien dat die funksie wat kom met daardie roete het om te neem in die parameter noem, sodat dit sal eintlik kry geslaag in die funksie. En dan, wanneer jy binnekant van daardie funksie, jy kan hanteer wat soos 'n normale Python veranderlike, en so dan sal dit druk Hallo, en dit sal in die naam te vul met behulp van sommige string opmaak. So veranderlike dele toe te voeg tot 'n routing, jy die hoek bracket merk te gebruik. En opsioneel, jy kan gebruik wat genoem word 'n converter. En so, as jy dit het body met die kolon, jy kan spesifiseer dat dit 'n int, of 'n vlot, of die pad, en dit sal outomaties omskep nie. Jy kan ook die omskakeling binne die Python-funksie, net deur die gebruik van 'n cast, maar soms as jy wil om te verseker dat dit 'n int, wat jy kan sit omskakeling reël daar in. So laat trek 'n voorbeeld van 'n paar veranderlike reëls. So hier, dit het dieselfde basiese struktuur met die van Fies invoer Fies, die jeug = fles (_name_), en dan is dit loop aan die einde. Ons het hierdie twee verskillende veranderlike roetes hier. En die eerste een, is die een wat ek het in die skyfie, wat was dat dit neem net in 'n string name en dit sal druk Hallo, Naam. En dan, die tweede gebruik jy die omskakeling. So dit sal outomaties omskep dit om 'n int, en dan dubbel die int, en druk dat uit. En ons het nie enige soort te doen van bekering daarin omdat Fies sorg dat. So laat ons kry hierdie hardloop. Wanneer jy 'n sak aansoek hardloop, Jy kan beheer-C uit dit na die bediener loop stop. En dan sal Ek die veranderlikes te hardloop. So laat ons gaan om localhost / hallo / Esra en Hopelik sal hierdie sê hallo vir my. So het dit in my naam, in die veranderlike roete, en dit maak dit hier. So ek sal ook wys 'n vinnige voorbeeld van die verdubbeling. So as jy gaan na / double / 3, dit sal 6 druk. So het hierdie sorg die omskakeling vir ons. Sodat jy kan dit ook met ' float, en iets spesiaal, As jy nodig het om iets soos spesifiseer 'n pad, wat kan dit te aanvaar houe, maar dit behoort nie gewoonlik 'n kwessie wees. So ver ons, nog net terug snare, wat nie baie interessant. Ons kon eintlik terug letterlike HTML string. So in die kode wat ons kan iets voeg soos die b-tag om dit dapper te maak, maar die meeste van die tyd wat jy nie eintlik wil te wees skryf HTML-kode in jou Python kode. Dit regtig slordig, en dit is nie 'n goeie tyd. Fies ons toelaat om uit te skei die HTML in wat die Template genoem, en so as jy dink in terme van die MVC model wat jy ken, hopelik, van die werk met CS50 Finansies 'n bietjie, jy kan dink van die Python lêers as meer van die Kontroleur waar hulle interaksie met alles wat data model wat jy mag hê. En dan is hulle uit te roep om Views en inligting deurgee aan dié View in die inligting in te vul in HTML wat dit nodig het. En wat ons diegene Views noem is Templates in die klas. So Fies gebruik 'n ander Python module dat dit sal outomaties installeer wanneer jy PIP installeer Fies genoem Jinja, wat Kom jy hierdie voeg annotasies om die HTML wat jy sien op die skerm, wat kan jy sit in dinge soos conditionals, en lusse in die HTML. So dit lyk 'n bietjie soos hoe jy kan gebruik PHP binne 'n HTML-lêer, maar dit is net wanneer die fles bediener dien tot die HTML-lêer, dit sal die template engine hardloop en ontleed deur middel van hierdie en vul dinge in. So het 'n Fies render_template funksie dat jy hier aan die onderkant kan sien. En so wanneer jy hierdie bladsy besoek, is dit sou dit hello.html Sjabloon lewer, en dan in hierdie HTML bladsy te vul. So laat ons net loop dit werklik vinnig, en kyk hoe dit lyk, en dan sal ek gaan deur 'n bietjie in meer detail. So, jou Templates gaan om te gaan in 'n Templates gids. Dit sal outomaties in die kyk Gids templates vir daardie Sjabloon. So laat oop hierdie up. So, ek sal die template byvoorbeeld hardloop. So as ek gaan na / hallo / Esra, dit het hierdie verskriklike, onaangenaam markiestent tag wat ek in. Baie mooi, baie dinamies. Ek is 'n groot fan. Maar wat gebeur as Ek gaan net na, / hallo? So is dit net sê Hello World. Ek het nie slaag hom 'n naam en dit maak dit outomaties. So laat ons sien hoe dit gedoen het, en hoe ons kan dalk raak van daardie markiestent kry. So hier is dit soort van 'n interessante voorbeeld van, As jy vertroud is met hoe skakelaar is state werk in 'n taal. Sê dit is soort van soos, dat die soort van 'n val deur, waar jy eintlik verbonde twee verskillende roetes na dieselfde funksie. Sodat ons die / hallo roete heg en die / hallo / naam roete Hallo, en ons spesifiseer using-- Python kan jy spesifiseer verstek funksie arguments-- so as daar is geen naam, so As ons gaan net / hello, dit sal outomaties filter naam is gelyk aan een. So dan, lewer ons die Sjabloon met name = Naam so dit sal slaag in die parameter naam gelyk aan die funksie naam parameter, in die sjabloon. Wat nog nie verduidelik hoe besluit of Hello World druk, of druk my naam. So laat eintlik lyk in die Sjabloon self, en sien wat kom. So, in hierdie Sjabloon ons eintlik 'n paar voorwaardelike logika, waarvan sommige mense sou argumenteer, wat jy eintlik moet nie 'n baie van voorwaardelike logika in jou Sjabloon self. Dit moet meer binne die wees Kontroleerder, maar vir hierdie voorbeeld dit is iets wat redelik klein. So hier, ons gaan, as die naam, so As die naam is nie gelyk aan Geen, As 'n naam is eintlik geslaag, dan sal ons Sê hallo, Noem die kop en die markiestent, al hierdie normale HTML, anders, sal ons druk Hallo, wêreld, net soos gewoonlik. So 'n paar dinge om te sien hier oor hoe jy die template formaat, is dat al hierdie voorwaardelike stellings, soort van soos hoe ons PHP toe jy wil 'n PHP voeg, jy die minder-as gebruik vraag merk, dit is soort van analoog hier met die {%. So hier, ons het ons voorwaardelike kode. En dan, wanneer jy eintlik wil letterlik iets te evalueer, en druk dit uit na die skerm, kan jy gebruik die dubbel draadjies. So hier is die dubbele draadjies, en dan die naam spesifiseer ons so in daardie, sal dit evalueer die veranderlike naam, wat geslaag in die lewer sjabloon funksie, eerder as om net te druk uit as ons ontslae geraak het van hierdie, Dit sou net die druk van die woord "naam." So, dit is iets om te kyk uit vir. So 'n ander ding om kennisgewing is dat, wanneer ons wil die gebruik render_template funksie, ons eintlik moet invoer dit uitdruklik van Fies. En dit is 'n voorbeeld van die modulariteit van Fies, dat jy nie moet invoer dinge wat jy nodig het nie. Jy kan bring net in die funksies wat jy eintlik nodig het nie, wat soms mooi, sodat jy dit nie doen nie het om al hierdie funksies sit om dat jy nie die gebruik van, maar ook, as jy dat jy vergeet moet render_template invoer, jy sal waarskynlik 'n waarskuwing te kry wat sal jou laat weet oor daardie. So, dit is template. So, ons het gewys hoe om maak eenvoudige web bladsye, en voeg 'n bietjie meer logika dit in terme van die veranderlike routing. Dit kan jy doen verskillende dinge wat gebaseer is op wat URL wat jy dan na, en ook gee die HTML 'n bietjie meer sin in terme van hoe jy wil om dinge te lewer. Jy hoef nie al sit HTML in jou Python, maar pretty much elke web aansoek, jy gaan 'n soort wil van data model wat verband hou met dit. En so tradisioneel, sou dit iets soos 'n SQL databasis. En jy kan net interaksie direk met SQL. Python het, ek dink dit is genoem. SQLite 3. Jy kan net die invoer van SQLite 3 en voer SQL navrae direk, maar ek weet nie van julle nie, maar ek het regtig nie wil, net, uitskryf SQL navrae. Dit is geneig om werklik lank en ingewikkeld. En so, iets wat Ek hou daarvan om te gebruik, is wat is bekend as 'n ORM, wat 'n voorwerp-relational mapping. En die punt van 'n voorwerp-relational mapping, is dat daar twee verskillende maniere waarop jy kan dink oor databasisse. So het die voorbeeld wat Professor Malan gewoonlik gebruik in die klas, is die Excel-tabel, waar jy het hierdie rye en hierdie kolomme, en dit is regtig nuttig vir hoe dit verteenwoordig in SQL en hoe jy met dit nie, maar 'n ander manier dat dit eintlik nuttig om soms daaroor dink, is in terme van klasse en objekte. So in plaas van denke van elke tabel as ' hierdie ry het dat sekere inligting, kan jy eintlik dink aan dit as elke tafel is 'n klas, en dan elke geval van die klas het sekere eienskappe. So, in hierdie voorbeeld, die gevalle van die klas is die rye in die tabel, en dan elke eiendom sou 'n kolom in die tabel. So, die ORM dat ek graag gebruik word snuiter genoem. Dit is regtig klein, soort van soos Fies. Ek dink dat hulle gaan goed saam, maar daar is 'n baie ander Orms wat jy kan gebruik. 'N Meer gewilde een is bekend as SQLAlchemy, en ek kan nie onthou hoekom ek oorspronklik gekies snuiter oor SQLAlchemy, of ek sal jou hoekom ek sê dink dit is die beste een, maar ons is net gaan om dit te gebruik een, want ek weet hoe om dit te gebruik. So, een vraag is, hoekom moet jy die moeite met 'n ORM, in plaas van net direk skryf SQL navrae? En ek dink die beste geval, is dat jy eintlik nie moet SQL navrae te skryf. Dit is baie makliker, want ek sal jou wys, om dinge te doen soos seleksie, plasing, skrap, veral die skep van tabelle. Dit is baie makliker om skryf 'n klas struktuur, as wat dit is om die struktuur 'n Skep Table stelling nie, maar een ding om bewus te wees van, is dat die ORM sal probeer om sy beste om uit te vind wat die mees doeltreffende SQL navraag sou wees, maar soms is dit kry dit verkeerd. En veral as jy ' werk met 'n groot databasis, kan jy sien dat 'n navraag wat moet vinnig hardloop, is eintlik meer neem. En as jy kyk onder die enjinkap hoe die ORM is die interpretasie wat in SQL, dit dalk iets te doen regtig belaglik, net omdat dit soort van beduie jou bedoelings verkeerd. En daar tye waar gewees Ek moes dit ignoreer, en net voer my eie SQL navrae, net want dit is die ontleding van 'n vreemde manier. So, daar is 'n oorhoofse, net in die pad dat dit stel jou state af in SQL. So, laat ons kyk super vinnig op 'n eenvoudige voorbeeld van 'n data model wat jy kan gebruik. So, dit is Python kode, en so die eerste ding wat jy wil doen, is uit snuiter invoer *. So, in teenstelling met Fies, waar jy al hierdie individuele modules, en jy wil Fies invoer, en skryf 'n Sjabloon, en 'n paar ander dat ons sal later sien, van snuiter, jy kan net alles in te voer, want dit is 'n mooi klein biblioteek. So, die eerste ding wat jy wil doen, is eintlik die skep van hierdie databasis voorwerp. So, jy het db = SqliteDatabase, en dan die naam van jou databasis. En dit sal eintlik skep 'n databasis voorwerp wat jy kan interaksie met, met snuiter. En dan het ons die werklike model wat ons wil skep. So die tafel wil ons te skep. So, binne snuiter, elke klas het sy eie tafel in jou databasis. So, al die klasse erwe van die basis model, en die hoofstad M model is iets wat omskryf in snuiter. So, al jou modelle moet beërwe as hul hoogste superklas, hulle moet erf uit die model, maar wat is regtig cool, is dat jy eintlik kan jou modelle erwe van mekaar. En 'n baie van die tyd, jou data modelle nie noodwendig maak 'n mooi erfenis hiërargie, maar keer waar hulle te doen, dit is regtig mooi, omdat jy die model inherent van mekaar. So, ons hierdie klas gedefinieer 'n student, 'n model wat erf, en dit het drie eienskappe. Dit het 'n ID, wat 'n PrimaryKeyField, wat is iets wat verskaf deur snuiter, naam is 'n CharField, en 'n graad is 'n IntegerField. So dit kan of mag wees nie hoe CS50 eintlik slaan al grade van die studente se. Dit is nie, maar dit is hoe ek dit sou doen. En dan is dit binne hierdie klas, en dit is iets wat jy kan doen met Python, kan jy geneste klasse het. En dit is iets wat nodig is deur die snuiter. So, hierdie klas Meta, jy het om te bepaal dat die databasis is gelyk aan die voorwerp wat ons hierbo geskep. En dit sê wat lêer is hierdie tabel eintlik gaan word vervat in. So dit is iets wat jy om te doen binne almal van jou modelle. Jy moet net spesifiseer Binne hierdie Meta klas dat databasis is gelyk aan db. So, wat ek gewoonlik doen, as ek 'n klomp van verskillende modelle, is dat ek een basis model, wat ek gewoonlik net noem "basis-model" wat die Meta klas, en dit stel die databasis gelyk aan db. En dan is almal van my daaropvolgende modelle sal erf wat basis klas. En dan het ek nie hoef te bekommer oor die opstel van die Meta klas. Dus, wanneer dit werklik kry saamgestel af in 'n SQL-stelling, dit lyk soos hierdie nare ding af hier, "Skep tabel student ID heelgetal, "Wat ook al. En ek dink dit is korter, hierdie SQL navraag reg hier, maar as jy kyk na hierdie klas hier jy kan sien presies wat aangaan. Jy kan wat vorme van velde te sien daar is, wat hulle genoem word, en so, dink ek dat kyk na hierdie Python kode is 'n baie meer leesbare as probeer om hierdie SQL navraag te skryf. Dus, ten einde te eintlik gebruik die databasis, ons het om aan te sluit om dit binne Python. So, ek skryf gewoonlik 'n funksie genoem initialize_db dat twee dinge doen. Dit neem in die databasis voorwerp db en dit verbind om dit, wat net maak up artikel na die databasis. As jy net loop al webwerf op jou plaaslike rekenaar, dit is nie 'n super groot deal te bekommer oor 'n verbinding en ontkoppel, maar as jy ' dit op 'n webwerf, jy wil seker maak dat wanneer 'n gebruiker verbind om dit, wanneer hulle uit te sluit die webwerf, hulle ontkoppel sodat jy nie 'n klomp van die mense verbonde nie aan jou databasis in 'n keer. En dan, wanneer jy toegang tot die databasis, jy wil om te bel db.create_tables, en noem die modelle vir wat jy wil om tabelle te skep. So hier, ek wil net skep dit vir hierdie student. En dan, wat belangrik is, is om spesifiseer veilige = True mees tyd. So, wat hierdie stelling sal doen, is dat dit skep tafels vir die student model, maar slegs as dit tafel het nie reeds geskep. Dit is wat die veilige spesifiseer. So dit sal nie oorskryf jou bestaande tafel, dit sal net 'n nuwe tabel indien daar nie een is daar. So, kan jy net ' die tafels keer met behulp van SQL. En dan dat databasis sitting daar, en dan koppel aan elke keer, maar dit is gewoonlik net mooi sit in hierdie create_tables oproep, sodat, as jy ooit verwyder jou databasis wanneer jy jou web hardloop app weer, sal dit te herskep. So, maak net seker dat 'n veilige gespesifiseer True te wees, of sal jy jou data net vind om oók deurloop elke keer. En dan kan jy net bel initialize_db om vas te stel 'n verband, en die skep tafels, indien nodig. So, die mees algemene ding dat jy sal wil hê om te doen, of een van die mees algemene dinge, is om werklik te voeg dinge in jou databasis. En so, eerder as om 'n insetsel skryf IN stelling met al die waardes aangedui, jy kan eintlik noem funksie op die student klas. So, wanneer jy 'n klas te skep dat erf van model, dit het hierdie metode te skep. So, jy klas name.create te doen, en jy het die parameters spesifiseer wat jy wil om te slaag in. So, as ek wil 'n paar studente by te voeg ons CS50 graad boek byvoorbeeld Ek sal in Dawid het, wat 'n baie goeie graad, het hy 'n 95. En ek, wat is dit nie te doen so goed in CS50, ek het 'n 50. En so, die lekker ding van wat dit skep funksie doen, is dat dit gee die geval, of die ry, dat dit geskep binne die tafel, en so dan in 'n winkel wat jy veranderlike, en later werk met dit. Jy kan rond te verander, wat Ek sal 'n voorbeeld van wys. Let daarop dat ek nie het die ID spesifiseer, want sedert dit die PrimaryKeyField, sal dit outomaties inkrementeer dit as jy nie spesifiseer nie. En, in werklikheid, het jy waarskynlik moet nie spesifiseer nie, omdat jy dalk per ongeluk afranselen iemand anders se ID. En wat jy wil maak seker dat dit is uniek. So, eintlik, die mees algemene ding wat jy wil doen, is waarskynlik Kies uit van die databasis sodra jy het 'n baie inligting daar. En so, as jy wil alles te kry, so die ekwivalent van die kies ster van studente verklaring, is dit sou net student.select. En dat jy sal terug te gee 'n verskeidenheid met al die student voorwerpe in dit dat jy Itereer oor wat jy wil. Jy kan dinge kry uit dit. En die meeste van die tyd, het jy nie net wil kies om te doen, jy eintlik iets wil spesifiseer. En so, kan jy ketting Saam maak hierdie funksie oproepe, soos hoe jy sou ketting saam die stellings in SQL. Sodat jy kan student.select doen (). Waar in hierdie voorbeeld. En dan, jy kan spesifiseer die voorwaardes, net die gebruik van die normale Python Boolse om dinge te kyk. So, in hierdie geval, jy wil beperk wat jy kies om, waar student.grade is gelyk aan 50, en student.name is gelyk aan Esra, sodat sal net kry my uit dit uit. En sien, die een baie subtiele ding hier is dat, as jy wil spesifiseer 'n en / en of 'n of / of, in Python, sou jy gewoonlik gebruik, Ek dink die woord "en" eintlik, maar hier die enkele ampersand gebruik, wat is gewoonlik 'n bis operateur, maar in hierdie spesiale geval, net die manier waarop snuiter dit doen, jy die enkele gebruik ampersand spesifiseer "en". Dit is iets wat Ek kry deurmekaar 'n baie, maar dit beteken nie opkom dat baie in die praktyk. En dan, wanneer jy al die studente uit die databasis, Sodra jy dit gedoen wat jy kies is en jou dra of wat ook al, jy kan 'n foreach lus te gebruik, net soos normaal in Python, met enige soort van Iterator of met enige soort van verskeidenheid. Sodat jy kan doen, want s in student.select (). whe re (Student.grade <75), en dit sal dus Itereer oor elke student in die tabel wie graad is minder as 75, wat in hierdie geval, is nog net vir my. En dan kan jy iets doen binne wat lus, soos stuur vir my 'n e- en sê vir my om werklik draai in my Probleem Sets. So, 'n ander ding wat jy kan te doen, is dit is regtig maklik rye in die tabel 'werk. So, onthou hier terug, jou wanneer ek ingevoeg, Ek het die waarde wat teruggekeer met student.create, en ek opgedra dit genoem Esra. En so is, kan jy die verander waardes binne daardie geval, net soos jy sou 'n normale klas in Python. So jy kan stel ezra.grade = 95 en wat sal die plaaslike kopie te werk, maar as jy eintlik wil pleeg dat verandering databasis, jy het om te ezra.save noem, sodat jy die metode genoem .save op die instansie. En so nou het ek suksesvol verander my eie graad binne die databasis. So, laat ons sê dat ek gevang verander my graad binne die databasis. Professor Malan is waarskynlik gaan om te wil my uit die klas verwyder, en so kan jy die .delete noem byvoorbeeld metode net op daardie ding. Dus, as jy wil gaan terug in die loop hier, en eintlik, in plaas van e-pos te stuur al van die studente wie se graad is minder as 75, wat jy wou om dit te skrap, in hierdie lus wat jy kan noem s.delete byvoorbeeld. En die laaste ding wat jy wil doen, is wanneer jy 'n verband te vestig, en jy klaar is met jou werk, jy wil om te bel db.close, waar db is dat databasis beswaar dat ons voorheen gehad het. En jy wil seker maak dat alles raak gesluit uit. Koel. So nou, ek het 'n voorbeeld aansoek. Ek het soort van vooraf alles gemaak net sodat daar nie enige lewende kodering sal wees foute, maar ons kan loop deur dit en sien hoe jy Fies sou sit en snuiter saam en maak 'n eenvoudige app. Ek noem dit CS50 rant, en dit is soort van 'n eenvoudige blog platform. So, in die eerste, ek sal dit hardloop en wys hoe dit lyk, en dan kan ons meer kyk na die kode. Goed, so laat ons net hierdie hardloop. Cool, ek sal hierdie maak 'n bietjie kleiner. Dit is nie baie mooi, net omdat Ek het nie 'n baie CSS maak, maar wat dit doen, is, het dit hierdie databasis van blog boodskappe, en dit gaan deur al hulle, en dit sal hulle vertoon op die bladsy in volgorde van die mees onlangse. En so dit is net 'n paar poste dat ek in die databasis gered het. So as ons wil 'n nuwe te skep pos, kan ons gaan na Voeg 'n Nuwe Post, en ons kan die titel van die voer post, so iets soos, CS50 seminaar. Sjoe, regtig geniet die seminaar. Koel. Dan druk jy post, en dit sal lei jou terug na die tuisblad en dan sal jy sien dat die nuutste post bygevoeg is. En ons het nog al die kinders daar. So nou, laat ons stap vir stap deur al die kode en sien hoe dit geïmplementeer word. So, ek dink die eerste ding wat ons laat 'n blik op, is eintlik die modelle. Daar is baie van die tyd, toe jy ontwerp iets jy wil eerstens oor hoe om te dink jy gaan om jou data te verteenwoordig, en dan ontwerp dinge rondom dat sodat alles sin maak. En dit is eintlik hoe ek het dit toe ek besig was om hierdie, Ek het gaan sit en gedink het, wat wil ek in 'n post. So, hier, ons het dieselfde struktuur dat ek vroeër noem, waar ons db = Sqldatabase ('posts.db). In werklikheid, waarskynlik jy nie wil hê hard-kode in databasisse jou naam. Dit moet waarskynlik 'n parameter wees dit is iewers gestoor, miskien in 'n config lêer, maar in 'n klein voorbeeld soos hierdie, Dit is goed om hard kode wat in. So nou, ons het hierdie Post klas, wat erf van die basis model. En dit het, weer, die ID = PrimaryKeyField. Eintlik, as jy nie spesifiseer, as ek eintlik ontslae geraak het van hierdie, dan snuiter ons sorg vir outomaties skep dat ID-veld, en dit sal outomaties maak dit 'n PrimaryKey, wat Ek dink is regtig mooi, want gewoonlik, dit is iets wat jy wil hê, maar ek wil dit in spesifiek gestel, net sodat ek onthou dat dit is daar. Maar as jy nie spesifiseer dat, wat sal daar outomaties. So dan, ek het 'n datum wat is 'n DateTimeField, en al hierdie verskillende velde, as jy kyk na die snuiter dokumentasie, dit gee jou 'n lys van die verskillende tipes velde wat jy kan gebruik. Vir die grootste deel, is dit analoog na wat jy in SQL sou sien. So is daar 'n CharField, 'n VarCharFields, TextFields, wat vir baie lank tekste, soos 'n blog post potensieel, DateTimeFields, DoubleFields, FloatFields, alle dinge soos dat. En jy kan slaag in ander argumente om dit wat ek nie hier spesifiseer. Sê byvoorbeeld jy nie wil toelaat twee poste aan dieselfde titel het, jy kan spesifiseer iets soos unieke = True, en dit is net 'n ekstra parameter om die stuk grond wat wanneer dit stel dit af in die SQL, sal dit spesifiseer dat dit moet wees uniek. Jy kan ook iets soos spesifiseer nie van nul en al die ander dinge jy gewoonlik doen in SQL. So, dit is 'n redelik eenvoudige model wat die datum het. Let hier, binne die DateTimeField, Ek gespesifiseerde wat die standaard is. Ek gespesifiseerde dit moet wees datetime.datetime.now, as gevolg van die manier waarop Dit kry geëvalueer, dit eintlik evalueer die datetime.now wanneer dit word opgeneem in die databasis. Ek dink dat, sou ek dubbel check dit, maar as jy iets soos dit gedoen het, dan dit sou eintlik evalueer wat eens, en dan sal die Datum tyd sou altyd dieselfde wees. So, net as jy iets doen met datetimes, dubbel check dat dit die evaluering toe eintlik kry ingevoeg, of anders jy dalk verwar word. Die titel is net 'n CharField, wat daar meer argumente wat jy kan slaag presies te spesifiseer hoe lank jy dit wil hê nie, maar hier, dit het nie regtig saak nie. En teks gaan wees Die teks van die hele post, en wat gaan om 'n wees Tekstveld net omdat jy wil toelaat dat dit 'n redelik lang string wees. Dan het ons hierdie Meta subklas wat net bepaal dat ons wil die databasis waar dit werklik tot in geopen die db voorwerp wat ons het hier te wees. En die laaste ding wat ons het hier, is net hierdie funksie dat ons gaan om gebruik van ons belangrikste app om die databasis te koppel aan inisialiseer dit, en dan na die Post tabel te skep. Nou, laat ons kyk na die belangrikste app self. So hierdie een is nogal 'n bietjie langer as die kinders dat ons gesien het nie, maar hopelik nie te sleg nie. So, laat my uit te brei dit uit. Okay. So, kennisgewing en die top Ek ingevoer 'n hele klomp van die ander dinge van Fies dat ons nie regtig gesien nie. En hopelik kan ons deurgaan elkeen van hierdie een vir een en praat 'n bietjie meer oor hulle gesorteer deur voorbeeld. So, ons het die fles, en die render_template, wat ons gesien het nie, hierdie versoek voorwerp, wat sal kom wanneer ons kyk na hoe die vorm wat ek eintlik is wat werk. Herlei, wat kan jy lei terug van die Nuwe Post terug na die oorspronklike tuisblad, en dan URL, iets wat waarmee jy uit te vind waar die webwerf 'n spesifieke bladsy is. So dan, die volgende ding wat ek doen, is ek invoer al die inligting van die Models lêers wat het ons net kyk na. En, ja. So, iets anders wat kom nuwe wanneer jy met, veral databasisse, is dat jy kan spesifiseer 'n funksie wat genoem voordat kry elke versoek, en funksie wat kry genoem na elke versoek die gebruik van hierdie funksie versierder app.before versoek. En so sal dit kry uitgevoer waar dit funksie is. Dit hoef nie te wees genoem voordat versoek maar gewoonlik dit is iets sinvol om dit te noem. Jy kan ook al funksie spesifiseer jy wil om daar te kom genoem, so ek gespesifiseerde hierdie initialize_db funksie wat ons gehad het terug in die Models lêer, so voor elke versoek wat jy wil hê na konnekteer na die databasis. Daar is twee verskillende maniere waarop jy dit kan doen. Jy kanapp te doen., I glo dit is after_request. En die verskil tussen after_request en teardown_request, is dat after_request slegs sal gebeur indien die versoek was eintlik geldig is. En so nie, slegs indien die versoek was suksesvol, as daar niks verkeerd geloop het, maar teardown_request gebeur in die geval van 'n suksesvolle versoek of in die geval van 'n fout. So, gewoonlik, jy wil om teardown_request gebruik, tensy jy wil doen iets, veral verskillende in die geval van 'n fout. Maar net vir die sluiting van die databasis, of dit slaag of indien dit misluk, ons doen wat jy wil om te ontkoppel uit die databasis. So dit genoem word, db.close op die db voorwerp. Let daarop dat die teardown_request neem in 'n uitsondering nie. Sodat jy kan kyk of daar was eintlik 'n fout wanneer dit toemaak, maar hier, hopelik, is daar is nie 'n hele klomp van foute, so ons is net soort van ignoreer dit. Goed, en die res van dit is nie te sleg nie. So, wanneer ons gaan na die tuisblad, Ons gelewer hierdie home.html Sjabloon wat sal oopmaak. Die pas is in post gelyk aan, en wat dit doen is, onthou ons het hierdie post model, so ons kies al die poste, en dan nog 'n ding wat jy kan doen, kan jy die WHERE klousule spesifiseer, kan jy 'n spesifiseer bestel deur, en so het ons neem al die poste wat kry gekies, en dan Ons bestel hulle deur die post.date.descending. En dit sal spesifiseer wanneer hulle eintlik kom uit, die mees onlangse een sal heel eerste een wees. En dan, slaag ons dat in die home.html sjabloon, so laat ons eintlik oop dat Sjabloon regtig vinnig, en neem 'n blik op hoe dit werk. En dit is nie 'n groot HTML, maar Hopelik kan ons fokus op die Python. So is daar 'n skakel na die New Voeg Post, en so hierdie spesifiseer die roete binne die Fies dat ons definieer, wat is reg hier. Dit is die nuwe post roete en ons spesifiseer dat hier. En so dit is 'n skakel wat dan gaan om daardie roete binne die Fies bediener. Die meer interessante ding is dit vir lus hier. So spesifiseer ons dat dit post parameter wat geslaag in die render_template funksie, vir elke pos in die post se voorwerp wat kry geslaag. Ons wil uit te druk die post titel, in H1, en dan hieronder, ons wil uit te druk die post teks binne 'n paragraaf. En hier, kan ons eintlik noem 'n Python funksie, sodat ons kan strftime noem, ST-RF-time, en jy kan slaag in die formaat string wat jy wil om die data in te druk. So dit is redelik goed dat jy kan hierdie Python funksie eintlik noem van binne hier. Jy hoef nie na die uitleg te doen op die kontroles kant, want regtig, opmaak die datum is iets wat jy wil om te gaan binne die View. En al hierdie persent dinge is nie super belangrik. As jy kyk op die dokumentasie vir die strftime funksie in Python, dit bepaal al hierdie dinge, maar dit is hoe, wanneer ons soek op hier die tuisblad, dit formate hierdie met 'n mooi datum en dit spesifiseer AM of PM, maar normaalweg, as ons het dit nie hier nie, jy sal waarskynlik 'n paar vullis te kry datum wat nie baie goed gelyk het nie. En dan spesifiseer ons post.text, en ek kon 'n paar van gestel lyn breek hier, net sommige spasies tussen elke post sit. So, ek dink die belangrikste ding in hierdie voorbeeld, is dat jy dit kan gebruik vir lus. En dit is analoog aan dinge wat jy kan doen in PHP. Jy kan deur middel van Itereer, alles kry geslaag, en so, in plaas van om te doen kopie / plak, kopie / plak al die HTML, jy moet net om dit te skryf keer, en dan jy kan Itereer oor al die poste. En dit is iets algemeen dat jy wil om te doen, wanneer jy 'n klomp data, is dat vir alles wat in jou data, jy wil 'n soortgelyke ding te doen. En dan, net onthou dat wanneer jy wil uitdruklik uit te druk iets in die HTML, jy gebruik die dubbele draadjies hier maar dan wanneer jy wil om te spesifiseer enige inligting oor 'n toestand, of oor 'n lus vir die, jy gebruik die persent bracket. So, gaan terug na die Python kode, sodat verduidelik wat gebeur in die hoof roete, toe ons daar gaan dit gee net al die poste, maar dan is die vraag is, hoe kan ons eintlik kry poste in die databasis, wat is 'n bietjie meer interessant. So, wanneer jy op die New Post skakel, wat ons hier sien, dit aansture jy aan hierdie vorm. En dit is net 'n eenvoudige oproep na die render_template funksie, wat dan gaan in die nuwe pos in HTML vorm. So laat ons neem 'n blik op dit. So hierdie een is redelik eenvoudig. Dit het 'n eenvoudige HTML-vorm, wat sal kyk 'n bietjie bekend, gebaseer op die vorms in CS50 Finansies. En so het ons hier spesifiseer, die aksie. En hier, as jy werk met PHP, gewoonlik, is dit sou iets wees soos, create.PHP, maar hier ons eintlik spesifiseer 'n roete binne die Fies bediener. En so, hierdie roete ooreenstem die skep roete dat ons hier, wat ons sal in 'n tweede in te gaan. En so, spesifiseer ons dat dit is 'n post metode, want ons wil stuur hierdie vorm data, en gewoonlik wanneer jy data wil stuur 'n vorm, wil jy dalk 'n post versoek te gebruik, net sodat jy nie eindig met hierdie groot, lomp URL. Maar jy kan ook 'n GET-versoek te gebruik, en slaag dit saam met veranderlike routing, maar vir die vorm, dit is lekker 'n pos versoek hier. En so dan, net soos jy sou doen met HTML en PHP, jy kan hierdie teks insette spesifiseer, en jy kan die naam van hulle spesifiseer, en dit is die naam wat kry sal verby in die versoek voorwerp binne Fies. En dan het ons 'n Stuur knoppie wat Post gesê. En hier, Post is die naam van die knoppie, want dit is 'n blog post, maar hier, post is die versoek metode. So dit is dieselfde woord maar eintlik onverwante. Ja Terug te gaan na die Python-kode, wanneer ons het die skep metode, sien hier dat jy kan eintlik spesifiseer binne die roete die versoek metodes wat jy wil om te aanvaar, en so hier, ek spesifiseer dat ek wil net 'n Post metode te aanvaar. So, as ek eintlik probeer om die bladsy te besoek direk, wat met behulp van 'n AOO-versoek dit sal vir my sê "Metode nie toegelaat nie." En so, jy het bladsye, soort van soos hierdie te skep bladsy, wat ek net regtig die gebruik as 'n manier vir die vorm te kry ingedien jy kan spesifiseer dat jy dit nie doen nie wil hê mense moet wees om daar te gaan in staat direk via 'n AOO-versoek of as jy nie wil hê, vir een of ander rede, 'n Post versoek jy kan net spesifiseer KRY hier maar in hierdie voorbeeld, het ons net wil hê dat die Post versoek om uit te gaan. Dus, wanneer create_post genoem word, wanneer Ons besoek wat via die Post versoek wanneer jy gaan na 'n spesifieke roete, daar is hierdie versoek voorwerp, en ons het om die invoer versoeke op die heel boonste, maar daar is hierdie versoek voorwerp wat kry geslaag, en jy kan die vorm data toegang, wat sal outomaties kry gevul wanneer jy 'n versoek van 'n vorm te stuur. En dan, wat ek dink is regtig cool, is dat die vorm voorwerp te kry geslaag in, is net 'n Python woordeboek wat bevat, as jy so hier access--, laat my trek die HTML langs dit, net sodat jy kan wat as 'n verwysing, ja, so die name wat ons hier spesifiseer vir die verskillende velde, so die titel en die teks, is ons gebruik dan net diegene hier as indekse in die vorm van data. So dit is super gerieflik. So dan post.create noem ons, wat sal skep en outomaties voeg hierdie nuwe post voorwerp in die databasis. En ek dink dit skep funksie hier is 'n baie cool voorbeeld van hoe kragtige fles en werk met hierdie, want as jy iets besig was in PHP, moet jy dalk ' doen 'n baie van die validering, jy sal moet dan 'n databasis konneksie te vestig, jy sal moet dan die SQL navraag uit te voer, maar hier het ons net hierdie mooi post.create, wat ons kan dan net kry die inligting uit van die versoek voorwerp, en dit slaag dan in 'n nuwe Post dat ons skep. En dan, die heel laaste ding wat ons wil doen, is om die lei gebruiker terug na die huis. En so het ons dit gebruik Fles lei funksie. En iets wat ons nie gesien het nie voor, was hierdie URL funksie. So die URL vir funksie kan jy slaag in werklikheid die naam van 'n funksie in jou Python kode, eerder as die spesifieke roete dat dit op. So ek kan net so maklik het herlei 'n gebruiker te streep, wat dit sou stuur terug by die huis nie, maar die gebruik van die URL vir funksie is mooi, want as jy die verander plek waar dinge, so laat ons sê dat ek die huis te wees by / huis plaas, dit sou nog steeds dan terug / huis, want eintlik gaan en kyk op die naam van die funksie, en dit sal gee jou die URL terug vir wat. So, soort van op die aanname dat jy meer geneig om waar dinge verander is as die name van die funksies. Jy kan dit regtig gebruik mooi URL vir funksie. En een ding om bewus te wees van dit is 'n bietjie lastig, is dat jy dink jy kan net noem herlei op die URL vir, maar eintlik al die roetes 'n soort van teks en HTML terugkeer, sodat jy eintlik moet die aanstuur oproep terugkeer. Andersins, sal jy iets kry ongeldig oor nie terugkeer 'n string, want al hierdie het om terug te keer die HTML jy eintlik wil lewer. En so, wanneer jy die aanstuur noem, dit aansture jy na die bladsy, maar dit eintlik gee die HTML wat jy nodig het om dit te aanstuur voer. Gaan terug na die tuisblad. So ons het hierdie twee verskillende menings. Ons het die huis sien. Of, ek dink ek moet sê templates. Ons het hierdie twee templates, die huis sjabloon wat vertoon al ons poste en dan het ons hierdie advertensie ding, en wanneer jy die post klik, gaan dit om 'n nuwe roete binne die Fies, maar dat die roete nie noodwendig het 'n ooreenstemmende sjabloon. Jy hoef nie om te sien enigiets, maar jy kan steeds het hierdie werk gaan agter die skerms. En dan moet jy kry getrek terug na die tuisblad. En beslis, dit is maklik om te werk in sommige mooier CSS in die sjabloon en maak hierdie lyk baie mooier, maar almal van die belangrikste logika is daar in die Python. Enige vrae oor daardie voorbeeld? Ek weet daar is 'n baie verskillende dinge gaan daar, 'n baie van die dinge wat ons nie gesien het nie voor, maar soos enige iets. Ja. Publiek 1: Het jy iets te doen spesiaal vir die data wat skrop kom uit die vorm? Ek het opgemerk jy net gesê "te skep," ESRA ZIGMOND: Ja, so dit is Eintlik is dit 'n baie goeie punt. So die vraag is, het jy nodig om te kyk en seker te maak dat die data geldig is, en doen enige soort van skrop om seker te maak dat dit geldig is, want as jy hier kan sien, Ek is nie om dit te doen. So laat ons sien wat gebeur As ek 'n boodskap iets leeg. Dus, sal dit eintlik net 'n leeg post en in die Datum tyd te vul. So in werklikheid, sou jy waarskynlik iets wil doen, soos, Miskien spesifiseer as titel is gelyk aan die leë string, dan dit nie doen nie. Of net doen as die titel is nie gelyk aan die leë string. So is dit nie eintlik outomaties sorg dat skrop vir jou, sodat jy nog steeds nodig om dit te doen. Ja, goeie vraag. Publiek 2: Is dit skrop vir opvolger inspuiting? Weet jy? ESRA ZIGMOND: Hopelik snuiter doen dit. Ek dink dit sal beslis 'n mooi slegte biblioteek as dit nie doen nie. Ek weet nie presies. Ek wil hê om te kyk na die navraag dat dit gegenereer. Ek dink dat as ek in 'n getikte blog post dat die soort van kyk soos 'n SQL-inspuiting aanval, iets soos hierdie, indien dit is soos 'n wagwoord veld of iets, jy dalk iets soos dit te doen. Ek dink dit sal nog steeds kry letterlik gepos, maar ek dink dat snuiter doen nie 'n soort van skrop van die data voordat dit eintlik voer nie. Publiek 1: Dit is teks veld ontwerp om gewone teks te neem, reg? ESRA ZIGMOND: Ja, dit is. Ja. So ek dink dat al die, so dit is korrekte gedrag, wat sal dit doen, maar ek dink dat snuiter hopelik nie te doen 'n soort van beskerming op hulle einde. En as jy wil doodseker dat daar is maniere wanneer jy 'n navraag te genereer. sodat jy nie hoef te direk uit te voer nie. Ek wil 'n te neem kyk na dokumentasie, maar jy kan eintlik sien die SQL dat dit genereer, en neem 'n blik op wat, en maak seker dat dit die ontsnapping dinge. Nog 'n rede waarom jy dalk wil om te kyk na die SQL dat snuiter is uitdruk, is as dinge lyk regtig stadig gaan, jy kan 'n blik te neem en te sien wat dit is eintlik, want dit is soms maklik om per ongeluk voeg in die manier waarop jy skryf dit, jy kan dit per ongeluk het kies die hele databasis eerste, en dan doen 'n soort operasie op dat, wanneer jy regtig bedoel om 'n subset kies. En so, as dinge nie nogal reg gaan, dit is goed om 'n blik op die versoek te neem dit is eintlik om gegenereer. Ja. Publiek 2: Wanneer jy die eerste keer begin, jy sit in die poort as 5000. ESRA ZIGMOND: Ja. Publiek 2: Is die standaard met snuiter, of is dit iets wat jy kan verander? ESRA ZIGMOND: Ja, so die hawe is standaard met Fies. As jy dit uit te voer sonder niks spesifiseer, dit sal outomaties doen. Ek glo, ek wil hê dubbel check dit, maar jy kan spesifiseer dat in die app.run, Ek dink jy kan iets soos te doen, hawe = 8080. Kom ons gee dat 'n probeer ware vinnig. Ja, so jy kan net spesifiseer hawe = 8080, en dit sal daar hardloop, wat ek dink, as jy wou om dit te doen op die IO, het ek dit nie probeer nie, maar ek dink dat as jy hardloop dit op poort 8080, jy waarskynlik wil in staat wees om toegang tot die bediener, net soos jy was vir die webwerf. Ja, maar dit is maklik om dit te verander as jy enige soort van soos port-ekspedisie dinge wat jy hoef te doen. Enige ander vrae? Ja? Publiek 1: So, sien ek in jou modelle wat, soos jy genoem het, jy het die spesifiseer databasis vir elke voorwerp. Het jy gebeur om te weet, doen wat maak dit regtig maklik as jy het baie van sQLite databasisse wat jy wil gebruik vir 'n enkele web app, dat jy net kan spesifiseer 'n klomp van verskillende mense in jou model? ESRA ZIGMOND: Ja, laat my oop te maak ware vinnig. So, jy sê, as jy wil hê 'n klomp van verskillende iets, miskien wil en die studente, vir 'n paar Daarom, so iets? Ja, so ek dink dat jy nog, elke model sou hê om nog net 'n databasis aan hom opgedra, maar as jy wil hê verskillende modelle wat het verskillende databasis voorwerpe opgedra om dit, kan jy beslis dit doen. So, as ek 'n nuwe, iets soos hierdie, en nou is dit 'n student wat lyk vreemd soos 'n blog post, Ek kon spesifiseer dat die databasis is gelyk aan hier db_2. So, ek dink dit is die belangrikste manier wat jy kan doen. Koel. Enige ander vrae? So net om klaar 'n bietjie bietjie, hier is 'n paar hulpbronne, en hierdie skyfies sal aanlyn gepos word sodat jy kan eintlik kry om hierdie skakels. Die beste hulpbronne is regtig die dokumentasie vir Fies en snuiter hulself. Hulle is baie goed geskryf, dink ek. So, die fles webwerf is hier, en hulle het 'n vinnig start handleiding wat sal loop deur soortgelyke dinge wat ek het, deur, maar as jy wil enige soort van hersiening van die dinge wat ek oor, of jy gedink het dat ek verduidelik iets in 'n verwarrende manier, hulle sal soortgelyke voorbeelde daar te hê. Snuiter het dokumentasie, en hulle het 'n vinnig start handleiding wat gaan oor die belangrikste parameters wat jy graag wil gebruik. So, die dinge wat ek het gepraat oor met die unieke en spesifiseer standaard, die verskillende vorme van velde wat jy kan gebruik, diegene sou daar wees nie. Ook, as jy ' vrae oor snuiter, en jy hulle te plaas op StackOverflow, die ou wat snuiter eintlik gaan op en beantwoord die soms. As jy 'n vraag, hopelik Hy sal in staat wees om dit te beantwoord, want hy het die hele ding. Ek dink dit is alles Ek wou dek. Dankie vir uit te kom.