[Muziek] EZRA Zigmond: Hallo, iedereen. Bedankt voor het komen vandaag. Dit seminar is "Python Web Apps met fles. " Dus, ik ga praten een beetje over waarom je zou willen Flask gebruiken om web apps met Python, in tegenstelling sommige andere frameworks die er zijn, zoals Django, de bekendste. De ondertitel is "en peewee, "dat is iets we gaan praten over hoe om met SQL-databases. Het maakt het echt leuk. Dus, hier is slechts een kort overzicht van wat ik wil gaan over. Dus, eerst, slechts één dia dat gaat quickstart zijn, dat is hoe om alles ingesteld op uw computer. Ik ga om te demonstreren dit op mijn lokale Mac machine, gewoon omdat dat is waar ik heb dit gedaan voor, ik ben het meest comfortabel met het, maar dit is zeker mogelijk op de CD50 IDE. Dus, na dat, ik wil introduceren wat Kolf is, en u overtuigen waarom je zou moeten gebruiken in de eerste plaats. Dan zal ik een snelle geven voorbeeld van wat je kan doen in Kolf, een snel voorbeeld van wat je kunt doen in peewee, en dan zal ik je een meer tonen volledig voorbeeld applicatie dat ik samen te stellen dat we kunt door elkaar te lopen. En tenslotte, in de laatste dia, ik heb aantal middelen die je kijkt bij online voor meer informatie. Dit is niet een volledige handleiding hoe Kolf gebruiken. En ik hoop te vertrekken wat tijd voor vragen. Iedereen kijken lokaal, net zoals, schreeuwen in het midden als je vragen hebt. Dus snelle installatie stuff, als je wilt om mee te volgen, of als u wilt om dit te krijgen op uw eigen computer, Ik ga worden met behulp van Python 2.7.10. Kolf werkt met Python 3, maar ik hou met behulp van Python 2, want er is sommige Python pakketten die nog niet met 3. Als u pip hebt geïnstalleerd, die is een Python package manager, Ik denk dat als je Python is groter dan of gelijk aan 2.7.9, heb je het al geïnstalleerd, het is super gemakkelijk om deze pakketten te installeren. U kunt dit doen pip installeren Kolf, pip installeren peewee, Meestal moet je sudo gewoon lopen zodat de rechten uit te werken. En, als je gebruik maakt van een super oude versie van Python, Ik raad het bijwerken van uw Python, of met behulp van EasyInstall om pip installeren. Dus de volgende vraag is, wat is Kolf? En ik denk dat, voor het eerst een redelijke vraag ik me af voor een lange tijd is, wat is een web-app? Want dat is een woord dat ik denk is gegooid veel rond dat ik niet echt weten. En ik denk dat de beste voorbeeld van wat een web-app is, echt CS50 Finance, waar de het is echt niet alleen een website, maar het is iets dat je kon soort interactie met. Er zijn gebruikersaccounts en allerlei verschillende dingen. Dus, waar je precies de aandacht van de lijn tussen wat is een website, en wat is een web app, is een soort van willekeurig, maar ik denk dat het idee, het is iets meer dan een website en het is een nuttige toepassing. Dus, Kolf is een kader voor het maken van webapplicaties met behulp van Python. En hopelijk tegen het einde van deze, zal ik u te overtuigen dat je eigenlijk iets zou kunnen schrijven zoals CS50 Financiën met Python, die ik als een stuk beter dan PHP, persoonlijk. Dus, Kolf is, noemen ze een microframework, waarbij, ze bedoelen het is heel eenvoudig, maar uitbreidbaar. Dus, het is net wat je nodig hebt, maar als je wilt meer functies, het is makkelijk om ze in te brengen. Maar gewoon omdat het een microframework, niet betekent dat het alleen voor kleine projecten. Ik heb hier een link die zegt dat Obama gebruikt Fles in 2012 voor zijn campagne website, die hopelijk, is iets van een goedkeuring. Maar het ding dat ik heel graag over Zakflesje dat is, is het niet echt een soort van beslissingen voor je. Gewoon omdat we praten over web apps, Ik moet het vergelijken met Ruby on Rails en Django, die beide zijn geweldig kaders, maar ze allebei te maken veronderstellingen over hoe je wilt interactie met databases, hoe je je presenteren uitzicht, en ze zijn zeker goede aspecten die. Bijvoorbeeld, Ruby on Rails heeft dit actieve record systeem, dat is een heel mooi manier om te communiceren met data, maar als je wilt Ruby te gebruiken op Rails, je bent soort van gebonden in die. Maar met Fles, zo zal ik je laten zien met peewee, kunt u gebruik maken van welke aard van de database die u wilt, en je kunt gewoon trek dat in als een uitbreiding in Kolf. Dus dat is waarom ik echt zoals Kolf, het is dat het geen aannames te maken voor u gebaseerd op de dingen die je niet echt nodig hebt. Dus, waarom zou je Kolf gebruiken? De voordelen zijn, het is gewoon heeft echt de kern functies ingebouwd dat je nodig hebt. Dus, hoeft u zich geen zorgen te maken over begrijpen van een hele hoop dingen dat je niet echt nodig hebt. Je hoeft niet te zorgen te maken over het uitschakelen van functies dat je niet echt nodig hebt. En, zoals ik al zei, het is super eenvoudig toe te voegen in de uitbreidingen van de dingen dat je nodig hebt. Sommigen van hen, Kolf heeft hun steun daarvoor. Dus er is iets genaamd Kolf admin, die dat admin weerspiegelt paneel dat Django biedt, die geeft je een mooie visuele manier om uw website te beheren. Maar nogmaals, als je het maken van iets simpels, je waarschijnlijk niet een grote admin nodig panel, dus ik denk dat het super leuk. De nadelen zijn, dat heb je minder kracht uit de doos. Dus, als je voor het eerst openstellen Kolf, en in uw Python-programma, je typt gewoon van Kolf import *, of wat dan ook, je weet niet precies allemaal krijgen de functies die je zou willen. En dus moet je meer expliciet een lijst van de functies die u wilt. Dus dat is een nadeel, maar ik denken dat voor het bouwen van kleine web apps als ik ga laten zien u, dat is niet echt een probleem. En wat het laatste wat is dan zeggen, dat een typo, is dat er minder gestandaardiseerd conventies voor hoe Kolf gebruiken, omdat er niet zoveel mensen die het professioneel gebruik vergeleken met Django. Dus, als je iets uitzien, "hoe kan ik x doen" in Django, u zult waarschijnlijk vinden. Er is een goed ontwerp patronen die u kunt gebruiken, maar Fles, het soort ga je eigen weg, gewoon omdat het een vrij kleine bibliotheek. Dus dat zijn de nadelen, maar ik denk dat dat is het nog steeds een goede bibliotheek te gebruiken. Dus laten we gewoon springen recht in Kolf. Dit is zeker niet van plan om een ​​complete handleiding zijn, maar het is om u een idee te geven hoe om dingen te structureren, en zo je comfortabel gaan voelen af en kijken naar de documentatie en het vinden van meer. Dus, laat me het openen van een echt eenvoudig voorbeeld eerst, en u laten zien wat dat eruit ziet, en dan zullen we break it down een beetje meer. Dus dit hier, laat me laten draaien. Dus, ik heb nu mijn toepassing draait. Ik ga openstellen Safari, en het draait op mijn lokale gastheer. Dus ik ga gewoon om deze groter te maken. Maar localhost: 5000 En dus, nu, dit alles doet is, wanneer u de website bezoekt, Het drukt "Hallo Fles," dat niet super nuttig, maar ik vind het cool dat in dit kleine bestand hier wij hebben een web-server draait dat wordt afgedrukt iets. Dus, laten we er eigenlijk uit de code voor een tweede, en af ​​te breken een beetje. Is de grootte goed voor iedereen hier? Dus, hopelijk, je bent een beetje comfortabel met Python. Ik ga ervan uit dat we kunnen kijken de Python en lees doorheen. Als u vragen heeft over iets, kan ik ook gaan over dat. Dus de eerste lijn is, van Kolf, wij importeren, Kolf met een hoofdletter "F" dat is een soort van de belangrijkste functies die je nodig hebt. Wanneer je aan het schrijven bent een bestand en gebruiken Flask, je gaat te willen importeren dat, gewoon omdat dat alle belangrijke dingen. Het volgende wat we doen, is dat we noemen deze functie Kolf, net een app object te maken, en je bent altijd zal dat willen doen. En dan, springen naar het bodem snel, dit deel is hier, 'if_name == _ "_ main_' 'die soort van een Python conventie. Dus dit zal alleen uitvoeren als u run dit bestand direct met behulp van Python. Dan noemen we app.run, die zal daadwerkelijk beginnen met de app te gaan. Dus, dat is de belangrijkste structuur die je moet in elk Kolf applicatie is dat je dit hebt app = Kolf (_name_), en vervolgens app.run. Dus, de twee dingen die ik heb hier, zijn wat wij noemen routes. Dus, laten we praten over routing een beetje meer. Ik kom terug naar de dia gaan. Dus de meest fundamentele concept in de kolf wordt routing. En het is het idee dat je toewijzen functies in Python bijzondere adressen op uw webpagina. Dus, wanneer u maar wilt om een ​​nieuwe route te creëren, u deze @ app.route gebruiken functie decorateur. Dus, als je niet bekend bent met functie decorateurs in Python, Het is dit concept dat Hiermee kunt u een functie te nemen en omring het met iets anders. Dus echt, wat dit decorateur doet, is dat het de functie daaronder, en voegt informatie om het, maar wat eigenlijk Kolf maakt dat gebeurt is niet super van cruciaal belang, maar wat belangrijk is, is dat voordat de route u zet dit @ app.route, en vervolgens het adres van de route zodat de schuine streep is wat we zagen toen we open net op de webpagina. Dus dat is de homepage. Het is gewoon de slash route. En dan heb je deze functie. De naam van de functie kan zijn wat je wilt. Het hoeft niet noodzakelijk te maken met de route. En dan, ongeacht de functie terugkeer, de functie moet een string terug. En die string kan bevat HTML of wat dan ook, en dat is eigenlijk wat krijgt terug naar uw webbrowser als HTML, en het zal maken dat. Dus dit is dezelfde code Dat was in het voorbeeld dat ik net liep, dus toen we een bezoek slash, het een Hello World functie, noemt die maar geeft een string, Hello Kolf, en dat wordt afgedrukt op het scherm. Dus er is een ander voorbeeld, dat is, als u een bezoek / hello, Het drukt Hallo Woord, dat zou eigenlijk zeggen, Hello World, maar laten we doen alsof dat was de bedoeling. Dus laten we trekken dat tot echt snel. Dus als je naar localhost / hello, zal nu iets anders te drukken. Dus dat is gewoon een snelle voorbeeld van hoe kunt u twee verschillende routes te creëren. Dus, tot nu toe dit is niet super handig, Er is niet veel wat je kunt doen, je kon gewoon alles doen met met verschillende HTML pagina, en wanneer u een bezoek aan een bepaalde pagina het gewoon laadt de pagina. Dus laten we eens kijken wat meer nuttige dingen die je kunt doen. Dus, een ding dat je zou kunnen hebben zag in het voorbeeld dat ik trok up, is dat ik had app.run (debug = True). En ja, wat dit debug argument doet, is dat wanneer u uw web server te draaien, wanneer u in uw toepassing, Als u een bestand wijzigt, zal het de server automatisch herladen. En dus heb je eigenlijk niet hoeft te restart Python, dat is super handig. Ik kan zien dat. Laat me trek mijn code de typo erin, en doen alsof dat typo werd daar gezet opzet voor instructieve doeleinden. Dus laten we voegen deze opnieuw in. Dus nu het zegt Hello World. Ik zal het op te slaan. En als we pull back up de terminal, zult u zeggen dat het herstarten, omdat het gedetecteerde verandering, en zo nu wanneer we de pagina verversen, zal het printen van de juiste ding. Dus debug is super handig voor. Ook als u hebt soort van een crash, dus laat me deze applicatie crash door het hebben van het niet een string terug. Dus, laten we het hebben Geen terug om wat voor reden. En toen ik dit bezoek pagina, zal het alleen maar crashen, maar de server niet alleen crash, maar eigenlijk geeft je een super handig terug spoor van alles wat er mis ging. En wat is echt leuk, is dat elke stap in deze back trace, je zou kunnen openen een interactief shell hier, en een soort van afdrukken wat variabelen die je wilt een kijkje nemen. En dus debuggen is echt handig voor het uitzoeken wat er gebeurt met uw server, in plaats van alleen te zien iets in PHP als een 500 interne server error, dat is super nutteloos. Eén ding bewust te zijn van, is dat als je je app online dus het is zichtbaar voor het publiek, je nooit willen debug mode op te verlaten, omdat mensen kan eigenlijk gebruiken console die ik toonde u om willekeurige code uit te voeren. Zodat ze kunnen printen als elke geheime codes heb je daar, ze kunnen kijken op exact hoe uw website werkt. Dus het is echt handig voor het testen, maar altijd zorg ervoor om het eruit te halen voordat je iets online te publiceren. Dus als je met behulp van iets zoals PHP, is er dit idee dat u kunt doorgeven informatie tussen webpagina's door de invoering van de informatie daadwerkelijk in de URL, een GET verzoek maar in de fles, kan je eigenlijk iets wat een beetje zoals dat te doen, door het hebben van een route heeft een variabele als deel daarvan. Dus als je kijkt naar deze Bijvoorbeeld op het scherm hier we hebben een route die ('/ hallo /'), en zo, als u een bezoek / hallo / iets, dat er iets gaat eigenlijk gevuld in de naam variabele. En merk op dat de functie die wordt geleverd met die route moet nemen in de parameter te noemen, zodat het ook daadwerkelijk krijgen doorgegeven in de functie. En dan, als je eenmaal bent binnenzijde van die functie, u kunt behandelen dat als een normale Python variabele en zo dan, het zal uitprinten Hallo, en het zal in de naam in te vullen met behulp van een stukje tekst opmaak. Dus om variabele onderdelen toe te voegen aan een routing, u de hoek beugel markering gebruiken. En optioneel, kunt u gebruik maken wat heet een converter. En dus, als je dit te zetten annotatie het colon, kunt u opgeven dat het een int of een float, of pad, en het zal automatisch om te zetten dat. U kunt ook de conversie binnen de Python-functie, alleen door het gebruik van een cast, maar soms als wilt u ervoor zorgen dat het een int, kun je dat zetten conversieregel daar. Dus laten we trekken een voorbeeld van enkele variabele regels. Dus hier, deze heeft dezelfde structuur met de import van Fles Fles, de app = kolf (_name_), en dan is het lopen op het einde. We hebben deze twee verschillende variabele routes hier. En de eerste, is degene die ik liet zien in de slede, namelijk dat het duurt slechts in een string naam en het zal uitprinten Hallo, Naam. En dan, de tweede gebruikt men de conversie. Dus dit zal automatisch omzetten naar een int, en dan het dubbele van de int, en print dat uit. En, we hebben geen soort doen conversie daarbinnen omdat Kolf zorgt dat. Dus laten we dit lopen. Wanneer u een Fles toepassing actief is, U kunt bepalen-C uit het om de server draaiende te stoppen. En dan zal ik de variabelen uit te voeren. Dus laten we naar localhost / hallo / ezra en Hopelijk zal dit zeg hallo tegen me. Dus het duurde in mijn naam in de variabele route, en het vulde het hier. Dus ik zal ook laten zien een snelle voorbeeld van de verdubbeling. Dus als je naar / double / 3, het zal uit 6 drukken. Dus nam deze zorg de conversie voor ons. Dus je kunt het ook doen met vlotter, en iets speciaals, als je nodig hebt om iets te specificeren een pad, waarmee het te accepteren slashes, maar dat hoeft meestal niet een probleem zijn. Tot nu toe hebben we, nog steeds net terug strings, wat niet erg interessant. We zouden eigenlijk terug letterlijke HTML string. Dus in de code kunnen we iets invoegen zoals de b-label om het vet te maken, maar de meeste van de tijd die u eigenlijk niet willen te schrijven van HTML-code in de Python-code. Het echt rommelig, en het is niet een goede tijd. Kolf staat ons te scheiden van het HTML in wat er de Template genoemd, en dus als je denkt in termen van de MVC model dat u bekend bent met, hopelijk, van het werken met CS50 Finance een beetje, U kunt denken aan de Python-bestanden als meer van de controller, waarbij ze zijn interactie met wat datamodel u zou kunnen hebben. En dan worden ze roepen om Bekeken en het doorgeven van informatie aan die View de gegevens in te vullen in HTML die het nodig heeft. En wat wij noemen die Bekeken zijn Templates in de klas. Dus Kolf gebruikt een andere Python module die het zal automatisch installeren wanneer u pip installeren Kolf genaamd Jinja, die laat u deze toevoegen annotaties bij het HTML die je ziet op het scherm, waarmee u in zaken als voorwaardelijke, en lussen in de HTML. Dus het ziet er een beetje zoals hoe je zou kunnen gebruiken van PHP in een HTML-bestand, maar dit is net als de Fles server serveert het HTML-bestand, het zal dit templating engine draaien en ontleden door middel van deze en vul dingen. Dus Kolf heeft een render_template functie dat u hier op de bodem kunt zien. En dus als je deze pagina bezoekt, zou dit hello.html Template maken, en vervolgens in deze HTML pagina te vullen. Dus laten we gewoon lopen deze echte snel, en zien hoe het eruit ziet, en dan ga ik door een beetje meer in detail. Dus, je sjablonen gaan te gaan in een map Sjablonen. Het zal automatisch binnen het kijken De map templates voor die sjabloon. Dus laten we open deze omhoog. Dus, ik zal de Templating voorbeeld draaien. Dus als ik naar / hallo / ezra, het heeft deze afschuwelijke, onaangenaam marquee tag die ik in. Zeer mooi, zeer dynamisch. Ik ben een grote fan. Maar wat gebeurt er als Ik ga gewoon naar, / hallo? Dus zegt het enkel Hello World. Ik had het niet door een naam, en Het vulde het automatisch. Dus laten we zien hoe het dat deed, en hoe we kunnen misschien ontdoen van die tent te krijgen. Dus hier, dit is een soort van een interessant voorbeeld van, als je bekend bent met de manier waarop zijn schakelaar statements werken in een taal. Zeggen dat dit soort als, dat soort van een val door, waar u eigenlijk gehecht twee verschillende routes naar dezelfde functie. Dus hebben we de / hello route bevestigen en de / hallo / naam van de route naar Hello, en we specificeren using-- Python kunt u specificeren standaardfunctie arguments-- dus als er geen naam, zodat als we naar net / hello, het zal automatisch filteren naam gelijk is aan n. Zo dan, maken we het Sjabloon met name = naam, dus het zal pas in de parameter naam gelijk aan deze naam functie parameter, in de Template. Dat betekent nog steeds niet uitleggen hoe is de beslissing om Hello World te drukken, of afdrukken mijn naam. Dus laten we er eigenlijk uit in de Template zelf, en zien waar dat vandaan komt. Dus, in deze Template, we eigenlijk sommige conditionele logica, die sommige mensen zouden argumenteren, je eigenlijk zou niet veel van voorwaardelijke logica binnen uw Template zelf. Het moet meer zijn binnen de Controller, maar voor dit voorbeeld het is iets wat vrij klein. Dus hier, we controleren, als de naam, dus Als de naam niet gelijk is aan Geen, Als een naam is eigenlijk doorgegeven in, dan zullen we zeggen hello, naam met de header en de tent, dit alles normaal HTML, anders zullen we printen Hello, World gewoon normaal. Dus een paar dingen te merken over hoe je de template te formatteren, is dat al deze voorwaardelijke verklaringen, een beetje als hoe we PHP toen je wilt wat PHP te voegen, je de minder-dan gebruiken vraag merk, het is een soort van analoge hier met de {%. Dus hier hebben we onze voorwaardelijke code. En dan, als je eigenlijk wilt letterlijk iets te evalueren, en afdrukken het uit op het scherm, u gebruik maken van de dubbele beugels. Dus hier zijn de dubbele bretels, en dan opgeven we, zodat daarbinnen zal evalueren de variabele, waarbij werd in de rendertemplate functie, in plaats van alleen afdrukken out, als we verlost van deze, het zou gewoon uitprinten het woord "naam." Zo, dat is iets om op te letten. Zo een ander ding om kennisgeving is dat, wanneer we willen het gebruiken render_template functie, we eigenlijk moeten importeren uitdrukkelijk van Kolf. Dit is een voorbeeld van de modulariteit van Kolf, dat je niet hoeft te importeren dingen die je niet nodig hebt. Je kunt gewoon te brengen in de functies die u eigenlijk nodig hebben, wat soms leuk, dus je niet moeten al deze functies zitten rond die je niet gebruikt, maar ook, als je dat je vergeet moeten render_template importeren zult u waarschijnlijk een waarschuwing dat zal u laten weten. Zo, dat is templates. Dus, hebben we laten zien hoe maken eenvoudige webpagina's, en voeg een beetje meer logica het, wat betreft de variabele routing. Het laat je verschillende dingen gebaseerd op wat URL u dan naar, en ook geven de HTML een beetje meer zin in termen van hoe je dingen wilt maken. Je hoeft niet alles te zetten HTML in uw Python, maar voor vrijwel elke webapplicatie, je gaat om een ​​soort wilt van datamodel gekoppeld. En zo traditioneel, zou dit iets als een SQL-database. En je kunt gewoon communiceren rechtstreeks met SQL. Python heeft, denk ik dat het heet. SQLite 3. Je kunt gewoon importeren SQLite 3 en uitvoeren van SQL-queries direct, maar ik weet niet over u, maar ik echt niet graag, enkel, het schrijven van SQL queries. Het heeft de neiging om echt lang en gecompliceerd. En dus, iets dat Ik graag gebruik is wat bekend als een ORM, dat een object-relational mapping. En het punt van een object-relational mapping, is dat er twee verschillende manieren waarop je kunt bedenken over databases. Zodat het voorbeeld dat Professor Malan meestal gebruikt in de klas, is de Excel-tabel, waarin u deze rijen en deze kolommen, en dat is echt handig voor hoe het wordt weergegeven in SQL en hoe je interactie met het, maar een andere manier dat het eigenlijk handig om soms denken, is in termen van klassen en objecten. Dus in plaats van te denken elke tabel als hebbende deze rij dat bepaalde heeft informatie, kun je eigenlijk denk aan het als elke tafel is een klasse, en dan elke instantie van de klasse heeft bepaalde eigenschappen. Dus, in dit voorbeeld, de gevallen van de klasse zijn de rijen in de tabel, en dan elke woning zou is een kolom in de tabel. Dus de ORM dat ik graag te gebruiken wordt peewee genoemd. Het is erg klein, een beetje als Kolf. Ik denk dat ze gaan goed samen, maar er zijn een heleboel andere ORM die u kunt gebruiken. Een meer populaire is bekend als SQLAlchemy, en ik kan niet waarom ik oorspronkelijk herinner koos peewee dan SQLAlchemy, of ik zou je waarom ik zeg denk dat het het beste is, maar we gaan gewoon om dit te gebruiken één omdat ik weet hoe het te gebruiken. Dus, een vraag is, waarom moet je moeite met behulp van een ORM, in plaats van alleen direct het schrijven van SQL-query's? En ik denk dat het beste geval, is dat je eigenlijk niet hebben om SQL queries te schrijven. Het is veel gemakkelijker, want ik zal je laten zien, om dingen te doen, zoals selectie, insertie deletie, vooral maken van tabellen. Het is veel makkelijker om schrijf een klasse structuur, dan het is om een ​​structuur creëren Tafel verklaring, maar een ding te weten, dat de ORM zal proberen haar best om erachter te komen wat de meest efficiënte SQL-query zou zijn, maar soms krijgt het verkeerd. En vooral als je het werken met een grote database U kunt merken dat een query die moeten snel worden uitgevoerd, is eigenlijk meer nemen. En als je kijkt onder de motorkap hoe de ORM interpreteert dat in SQL, het zou iets moeten doen echt belachelijk, alleen omdat het soort gebaarde uw bedoelingen verkeerd. En er momenten waar zijn geweest Ik heb gehad om het te negeren, en gewoon uitvoeren van mijn eigen SQL queries, net want het was het ontleden in een vreemde manier. Er is dus enige overhead, net op de weg dat stelt uw statements beneden in SQL. Dus, laten we eens kijken super snel op een eenvoudig voorbeeld van een gegevensmodel dat je zou kunnen gebruiken. Dus, dit is Python-code, en dus de eerste wat je wilt doen is uit peewee import *. Dus, in tegenstelling tot Kolf, waar je al deze afzonderlijke modules, en u wilt Kolf importeren en schrijf een sjabloon, en enkele anderen dat we later zullen zien, van peewee, u kunt gewoon alles importeren, want het is een vrij kleine bibliotheek. Dus, het eerste wat je wilt doen, is eigenlijk maken deze database-object. Dus, heb je db = SqliteDatabase, en dan de naam van uw database. En dit ook daadwerkelijk het creëren van een database-object dat je kunt communiceren met, met peewee. En dan hebben we de eigenlijke model dat we willen creëren. Dus de tafel we willen creëren. Dus, binnen peewee, elke klas heeft haar eigen tafel in uw database. Dus, alle klassen erven van het basismodel, en de hoofdstad M model iets dat gedefinieerd in peewee. Dus, al uw modellen moeten erven als hun hoogste superklasse, zij moeten erven van de model, maar wat is echt cool, is dat je daadwerkelijk kunt uw modellen erven van elkaar. En een groot deel van de tijd, uw datamodellen niet noodzakelijkerwijs maak een mooie erfenis hiërarchie, maar tijden waarin ze dat doen, het is echt leuk, omdat je het model inherent van elkaar. Dus, we deze klasse gedefinieerd 'student', die een model erft, en het heeft drie eigenschappen. Het heeft een ID, dat is een PrimaryKeyField, die is iets dat voorzien door peewee, de naam is een Charfield, en een cijfer is een IntegerField. Dus kan of niet kan hoe CS50 eigenlijk slaat alle kwaliteiten van de studenten. Is het niet, maar dit is hoe ik het zou doen. En dan heeft binnen deze klasse, en dit is iets wat je kunt doen met Python, kunt u geneste klassen. En dit is iets dat is vereist door peewee. Dus, deze klasse Meta, je hebt om aan te geven dat de database gelijk aan het object dat we hierboven gemaakt. En dat zegt wat bestand is deze tabel daadwerkelijk zal worden opgenomen in. Dus dit is iets dat je hebt te doen op al uw modellen. Je hoeft alleen maar aan te geven binnen deze Meta klasse die database is gelijk aan db. Dus wat ik meestal doe, als ik een aantal verschillende modellen, is dat ik een base model, dat ik meestal gewoon bellen "basismodel" dat heeft de Meta klasse, en het zet de gegevensbank gelijk db. En dan al mijn latere modellen zullen erven van die basisklasse. En dan heb ik geen zorgen te maken over het instellen van de Meta klasse. Dus, als dit ook daadwerkelijk krijgt gecompileerd naar beneden in een SQL-instructie, het lijkt erop dat deze smerige ding neer hier, "Creëer tafel student ID integer, " boeiend. En, ik denk dat het is korter, Deze SQL-query hier, maar als je kijkt naar deze klasse hier kunt u precies zien wat er gaande is. U kunt wat voor soort velden te zien er zijn, wat ze zijn genoemd, en zo, denk ik dat kijken naar deze Python-code is veel beter leesbaar dan proberen om deze SQL-query te schrijven. Dus, om daadwerkelijk Gebruik de database we hebben om verbinding te maken met het binnen Python. Dus, ik schrijf meestal een functie genaamd initialize_db dat twee dingen doet. Het neemt in de database db object en het verbinding maakt, die net opent omhoogtreksectie de database. Als je gewoon loopt al website op uw lokale computer, het is niet een super big deal te maken over het aansluiten en loskoppelen, maar als u werkt het op een website, wilt u ervoor zorgen dat, wanneer een gebruiker verbindt met het, wanneer ze sluiten uit de website, zij verbreken zodat u niet een heleboel mensen aangesloten hebben om uw database in een keer. En dan, als je verbinding met de database, u wilt bellen db.create_tables, en een lijst van de modellen voor wat je wilt om tabellen te maken. Dus hier, ik wil gewoon maken het voor deze leerling. En dan, wat belangrijk is, is om specificeren veilig = True meeste tijd. Dus wat deze uitspraak doet, is dat het tafels creëert voor student model, maar alleen als dat tafel heeft niet zijn al gemaakt. Dat is wat de veilige specificeert. Dus het zal niet overschrijven uw bestaande tafel, het zal alleen maar leiden tot een nieuwe tafel als er niet één daar. Dus, kun je gewoon maken tabellen keer met SQL. En dan die database zitten daar, en vervolgens aan te sluiten op elke keer, maar het is meestal gewoon leuk om zet in dit create_tables oproep, zodat, als je ooit verwijderen van uw database als u uw web-run app weer, zal het opnieuw. Dus, gewoon ervoor zorgen dat veilig gespecificeerd waar te zijn, of u zult uw gegevens gewoon vinden krijgen pan gehakt elke keer. En dan kun je gewoon bellen initialize_db vaststellen een verbinding, en maak tafels als nodig. Dus, de meest voorkomende ding dat u wilt doen, of één van de meest voorkomende dingen, is om daadwerkelijk in te voegen dingen in uw database. Dus, in plaats van een insert schrijven INTO verklaring met alle de opgegeven waarden, je kunt eigenlijk bellen functie op de leerling de klas. Dus, als je een klasse te maken die erft van model, het heeft dit te maken methode. Dus, je klasse name.create doen, en u de parameters opgeven die u wilt passeren. Dus, als ik wil een aantal studenten toe te voegen onze CS50 klas boek voorbeeld, Ik zal in David te zetten, die een zeer goed cijfer, heeft hij een 95. En ikzelf, die het niet doet zo goed in CS50, ik heb een 50. En ja, het leuke wat dit te creëren functie doet, is dat het terugkeert het subsysteem, of rij, die het heeft aangemaakt in de tabel, en zo dan dat in een winkel je variabele, en later werken. U kunt rond veranderen, wat Ik zal een voorbeeld laten zien. Merk op dat ik niet hebben om de ID te geven, omdat aangezien het de PrimaryKeyField, zal het automatisch verhogen als je niet opgeeft het. En, in feite, heeft u waarschijnlijk moet niet opgeven het, omdat je misschien per ongeluk afranselen andermans ID. En u wilt maken ervoor dat het uniek is. Dus, in feite, de voorkomende wat je wilt doen, is waarschijnlijk kiezen uit van de database als je eenmaal hebben veel informatie in. En dus, als je alles wilt krijgen, dus het equivalent van de selecte ster van studenten verklaring, is het zou gewoon student.select. En dat geeft je weer een array met alle student objecten erin dat u herhalen over je heen wilt. Je kunt dingen uit te halen. En de meeste van de tijd, je willen niet alleen selecteert u om te doen, je echt iets wilt opgeven. En ja, kunt u keten Samen vormen deze functie oproepen, zoals hoe je zou keten samen de verklaringen in SQL. Dus je kunt student.select doen ()., Waar in dit voorbeeld. En dan kunt u geef de voorwaarden, alleen met behulp van een normale Python Booleans om dingen te controleren. Dus, in dit geval, je wilt beperken wat je selecteren om, waarbij student.grade is gelijk aan 50, en student.name is gelijk aan Ezra, dus dat zal gewoon me uit. En merk, een echt subtiele hier is dat, als je wilt opgeven een en / of een of en / of, in Python, zou u normaal gebruikt, Ik denk dat het woord "en" in feite, maar hier het enige teken te gebruiken, dat normaal een bitsgewijze operator, maar in dit bijzondere geval, alleen de manier waarop peewee doet, de enige gebruiken ampersand aan te geven "en." Dat is iets dat Ik word omhoog gemengd veel, maar het is niet komen die veel in de praktijk. En dan, als je eenmaal hebt al De studenten uit de databank, als je eenmaal hebt gedaan kun select bent en uw kleding of wat dan ook, kunt u een foreach lus, net als normaal in Python, met een soort van iterator of met een soort van matrix. Dus je kunt doen, want s in student.select (). whe re (Student.grade <75), en dus zal dit itereren over elke student in de tabel waarvan de kwaliteit is minder dan 75, die in dit geval, is nog steeds aan mij. En dan kon je iets doet binnen dat lus, net stuur me een e-mail en vertel me om daadwerkelijk draaien in mijn probleem Sets. Dus, een ander ding dat je kunt te doen, is het is echt gemakkelijk rijen in de tabel bij te werken. Dus vergeet niet hier terug, je wanneer ik gestoken, Ik nam de waarde die was geretourneerd door student.create, en ik toegewezen aan de naam genoemd Ezra. En nu, kunt u het veranderen waarden binnen dat geval net zoals je zou een normale klasse in Python. Dus u kunt instellen ezra.grade = 95 en dat de lokale kopie werken, maar als je echt wilt verplichten die verandering aan de database, je moet ezra.save bellen, zodat u de .save methode genaamd voor het subsysteem. En nu, heb ik met succes veranderd Mijn eigen klas in de database. Dus, laten we dan zeggen dat ik gepakt het veranderen van mijn klas in de database. Professor Malan is waarschijnlijk te willen me uit de klas te verwijderen, en zo kunt u de .delete bellen Zo methode gewoon op dat ding. Dus, als je wilde gaan terug in deze lus hier en eigenlijk plaats van het verzenden van e-mails alle van de studenten wier graad minder dan 75, je wilde om ze te verwijderen, binnen deze lus je kon noemen s.delete bijvoorbeeld. En het laatste wat je wilt doen, is wanneer je een verbinding tot stand, en je klaar bent met je werk, u wilt bellen db.close, waar de db is dat de database tegenwerpen dat we eerder hadden. En wilt u ervoor zorgen dat alles wordt gesloten uit. Koel. Dus nu heb ik een voorbeeld applicatie. Ik heb een soort van pre-maakte alles gewoon zodat er geen live-codering zal zijn fouten, maar we kunnen wandelen door het en zie hoe je Kolf zou zetten en peewee samen, en maak een eenvoudige app. Ik noem het CS50 rant, en het is soort van een eenvoudige blog platform. Dus, eerst, zal ik het uit te voeren en laten zien hoe het eruit ziet, en dan kunnen we verder kijken in de code. Oke, dus laten we dit uit te voeren. Cool, ik zal dit te maken een beetje kleiner. Het is niet erg mooi, alleen maar omdat Ik heb niet veel van CSS te maken, maar wat het doet is, heeft Deze databank van blog posts, en het gaat door alle ze en zal ze weer te geven op de pagina in de volgorde van de meest recente. En dus dit zijn slechts enkele berichten dat ik in de database had gered. Dus als we willen een nieuw te creëren post, kunnen we naar Nieuw bericht, en we kunnen de titel van de enter post, zo iets als, CS50 seminar. Wow, echt genieten van het seminar. Koel. Druk vervolgens op je post, en het zal redirect u terug naar de home page, en dan zult u zien dat Naar het laatste bericht werd toegevoegd. En we hebben nog steeds alle sprekers er. Dus nu, laten we stap voor stap door alle code en zien hoe dit wordt uitgevoerd. Dus, ik denk dat het eerste ding dat laten we neem een ​​kijkje op, is eigenlijk de modellen. Een groot deel van de tijd, toen je bent het ontwerpen van iets, u als eerste over hoe te denken je gaat om uw gegevens te vertegenwoordigen, en vervolgens het ontwerp dingen rond dat, zodat alles is logisch. En dat is eigenlijk hoe ik deed het toen ik het maken van deze, Ik ging zitten en dacht, wat wil ik in een post. Dus, hier, we hebben dezelfde structuur dat ik eerder vermelden, waar we doen db = Sqldatabase ('posts.db'). In werkelijkheid, waarschijnlijk u niet wilt hard code in de databases van uw naam. Dat moet waarschijnlijk een parameter dat is ergens opgeslagen, misschien in een configuratiebestand, maar in een klein voorbeeld als dit, het is goed om hard code in. Dus nu hebben we dit bericht klasse, die erft van het basismodel. En het heeft opnieuw de ID = PrimaryKeyField. Eigenlijk, als je niet opgeeft, als ik eigenlijk verlost van deze, dan peewee we zullen verzorgen automatisch creëren van die ID-veld, en het zal automatisch maak er een PrimaryKey, die Ik denk dat is echt leuk, want meestal, dat is iets wat je wilt hebben, maar ik wil hem in het bijzonder te zetten, zodat ik herinner me dat het er in zit. Maar als je niet opgeeft dat, dat zal er automatisch. Dus dan heb ik een datum die een DateTimeField en alle deze verschillende gebieden, als je kijk naar de peewee documentatie, het zal geven u een overzicht van de verschillende soorten velden die u kunt gebruiken. Voor het grootste deel is het analoog om wat je in SQL zou zien. Dus er is een Charfield, een VarCharFields, TextFields, die te lang teksten, zoals een blogpost potentieel, DateTimeFields, DoubleFields, FloatFields, al dat soort dingen. En u kunt doorgeven in andere argumenten om het, die ik niet opgeven. Zeg, bijvoorbeeld, je niet wilt staan ​​twee palen naar dezelfde titel, je kon opgeven iets als uniek = True, en dat is gewoon een extra parameter het veld dat wanneer het stelt het naar beneden in de SQL, zal het specificeren dat het moet uniek. U kunt ook iets als opgeven niet van nul en alle andere dingen je normaal doet in SQL. Dus, dit is een vrij eenvoudig model dat de datum heeft. Let hier, binnen de DateTimeField, Ik gespecificeerd wat de standaard is. Ik vermeld het te zijn datetime.datetime.now, vanwege de manier waarop Dit wordt geëvalueerd, het eigenlijk evalueert de DateTime.Now wanneer het wordt ingevoegd in de database. Ik denk dat, zou ik om dubbel te controleren dit, maar als je zoiets als dit deed, dan zou eigenlijk evalueren die eenmaal, en dan is de DateTime zou altijd hetzelfde zijn. Dus, als je iets doet met een tijd-tags, dubbele controle dat het evalueren wanneer eigenlijk wordt geplaatst, of anders je zou kunnen worden verward. De titel is slechts een Charfield, waarvan er zijn meer argumenten je kan passeren precies aangeven hoe lang u maar wilt, maar hier, het zag er niet echt toe. En tekst gaat worden de tekst van de gehele post, en dat gaat om een ​​te zijn TextField gewoon omdat je wilt in staat te stellen een vrij lange string. Dan hebben we dit Meta subklasse die net geeft aan dat we willen dat de database indien dit wel tot in geopend aan de db object dat we hier zijn. En het laatste wat we hebben hier is alleen deze functie dat we gaan gebruik maken van onze app met de database om verbinding te initialiseren , en dan de Post tabel. Laten we nu eens kijken naar de belangrijkste app zelf. Dus dit is een heel beetje langer dan de dat we eerder hebben gezien, maar hopelijk niet al te slecht. Dus, laat me uit te breiden dit uit. Oke. Dus, merken en de top ik geïmporteerd een hele hoop andere dingen Kolf van dat we niet echt eerder gezien. En hopelijk kunnen we gaan door elk van deze een voor een en praat een beetje meer over ze, gesorteerd op bijvoorbeeld. Dus hebben we de Fles, en render_template, die we eerder hebben gezien, dit verzoek object, die zal komen wanneer we kijken naar hoe de vorm die ik eigenlijk liet zien werken. Redirect, waarmee u omleiden terug uit de Create Nieuwe Post terug naar de oorspronkelijke homepage, en vervolgens URL, dat is iets waarmee je erachter te komen waar op de website van een bepaalde pagina is. Zo dan, de volgende wat ik doe, is dat ik import alle informatie van de modellen bestanden die we naar op zoek waren. En, ja. Dus, iets nieuws dat komt wanneer je te maken hebt met, met name databases, is dat je kunt opgeven een functie die wordt aangeroepen voordat elk verzoek, en de functie die krijgt genoemd naar elk verzoek, via deze functie decorateur app.before aanvraag. En zo zal dit word uitgevoerd waar deze functie is. Dit hoeft niet te worden aangeroepen voordat verzoek maar meestal dat is iets verstandig te noemen. U kunt ongeacht functie opgeven je wilt er gecalled, dus ik aangegeven deze initialize_db functie dat we terug in de modellen bestand, zodat voor elk verzoek, u verbinding wilt maken met de database. Er zijn twee verschillende manieren waarop u kunt dit doen. U kuntapp doen., I geloven dat het after_request. En het verschil tussen after_request en teardown_request, is dat after_request alleen zal gebeuren indien het verzoek daadwerkelijk geldig was. Dus, indien de verzoek was succesvol, als er niets mis ging, maar teardown_request gebeurt in het geval van een succesvolle verzoek, of in het geval van een fout. Dus, meestal, je wilt teardown_request te gebruiken, tenzij je wilt doen wat vooral anders in het geval van een fout. Maar voor het sluiten van de database of het nu lukt of als het niet lukt, wij wilt u verbreken uit de database. Dus het heet, db.close op de db object. Merk op dat de teardown_request neemt in een uitzondering. Zodat u kunt controleren of er daadwerkelijk een fout toen het sluiten, maar hier, hopelijk, er zijn niet heel veel fouten, dus we zijn gewoon soort van negeren dat. Oke, en de rest van het is niet al te slecht. Dus, als we naar de home page, we verleende deze home.html Template dat zal openen. De pas is in post gelijk, en wat dit doet is, herinneren we dit bericht model, dus selecteren we alle berichten, en dan nog een ding dat je kunt doen, kunt u de WHERE opgeven, kunt u een opgeven bestellen door, en dus nemen we alle berichten die krijgen geselecteerd, en vervolgens we om hen bij de post.date.descending. En dat zal opgeven, wanneer ze daadwerkelijk naar buiten komen, de meest recente zal allereerste zijn. En dan komen we dat in de home.html sjabloon, dus laten we eigenlijk open dat Template erg snel, en neem een ​​kijkje op hoe dat werkt. En dit is niet groot HTML, maar hopelijk kunnen we ons richten op de Python. Dus er is een link naar de nieuwe toevoegen Post, en dus dit geeft de route binnen de kolf dat we definiëren, die is hier. Dit is de nieuwe post route, en we aangeven dat hier. En dus dat is een link die dan zal gaan die route binnen de kolf server. De meer interessante is dit voor lus hier. Dus specificeren wij dat dit bericht parameter die werd overgegaan in de render_template functie, voor elke record in de post van object dat wordt doorgegeven. We willen printen de post titel, in H1, en dan hieronder, willen we uit te printen de post tekst in een paragraaf. En hier kunnen we eigenlijk bel een Python-functie, dus we kunnen strftime noemen, ST-RF-tijd, en je kunt pas in de format string dat u wilt de gegevens in te drukken. Dus het is erg leuk dat je kunt Dit Python functie daadwerkelijk op te roepen vanuit here. Je hoeft niet om de opmaak te doen op de controller zijde, want echt, formatteren van de datum is iets dat je wilt om te gaan binnen de View. En al deze procent dingen is niet super belangrijk. Als je omhoog kijkt de documentatie voor de strftime functie in Python, specificeert deze dingen, maar dat de hoe, wanneer we zochten hier in de home page, Het formatteert dit met een aardige datum, en het geeft AM of PM, maar normaal, als we dit niet hier, je zult waarschijnlijk een aantal vuilnis krijgen date dat niet erg goed uitzag. En dan geven wij de post.text, en ik kon een paar hebben gezet lijn breekt hier, net om enkele spaties tussen elk bericht te zetten. Dus, ik denk dat het belangrijkste wat in dit voorbeeld is dat u deze kunt gebruiken voor lus. Dit is analoog aan dingen die je kunt doen in PHP. U kunt door herhalen, alles wordt doorgegeven, en zo, in plaats van te doen copy / paste, kopiëren / plakken alle HTML, hoef je alleen maar te schrijven een keer, en dan U kunt itereren over alle van de berichten. En dit is iets gemeen dat u wilt te doen, als je een veel gegevens, is dat voor alles in uw gegevens, wilt u iets dergelijks te doen. En dan, alleen niet vergeten, dat wanneer u willen expliciet uit te drukken iets in de HTML-code, die u gebruikt dubbele beugels hier maar dan als je wilt opgeven wat informatie over een aandoening, of over een lus, u Gebruik het percentage beugel. Dus, terug te gaan naar de Python code, dus dat verklaart wat er gebeurt in de belangrijkste route, toen wij er gaan, het toont gewoon alle berichten, maar dan is de vraag is, hoe kunnen we eigenlijk berichten in de database, die is een beetje interessanter. Dus, als u klikt op de New Bericht link, die we hier zagen, het automatisch u dit formulier. En dat is nog maar een eenvoudige oproep aan de render_template functie, die vervolgens gaat in het nieuwe record in HTML-formulier. Dus laten we eens kijken naar dat. Dus dit is vrij eenvoudig. Het heeft een eenvoudige HTML formulier dat ziet er een beetje bekend, gebaseerd op de formulieren in CS50 Finance. En ja, we hier opgeeft, de actie. En hier, als je werkt met PHP, normaal gesproken, zou iets zijn als, create.PHP, maar hier we eigenlijk geeft u een route binnen de kolf server. En dus, deze route overeenkomt het creëren route dat we hier hebben, wat we zullen in een tweede in te gaan. En dus geven wij dat Het is een methode post, want we willen sturen deze vorm van gegevens, en meestal wanneer u gegevens wilt verzenden van een formulier, wilt u misschien een post verzoek te gebruiken, zodat je niet eindigen met deze grote, logge URL. Maar je kan ook een GET-verzoek te gebruiken, en geef het met variabele routing, maar voor formulieren, het is leuk op een post verzoek hier. En zo dan, net als jij zou doen met HTML en PHP, U kunt deze tekst ingangen opgeven, en u kunt de naam van hen te geven, en dat is de naam die krijgen zal voorbij in de aanvraag object in Kolf. En dan hebben we een Submit knop die bericht zegt. En hier Voeg de naam van de knop, want het is een blog post, maar hier, post is het verzoek methode. Dus dat zijn hetzelfde woord maar eigenlijk los van elkaar. Ja Terug te gaan naar de Python-code, toen we belden het creëren methode, merkt hier dat u kunt eigenlijk opgeven binnen de route verzoek methodes dat u wilt accepteren, en zo hier, ik aangeven dat ik willen alleen een bericht methode te accepteren. Dus, als ik eigenlijk probeer de pagina direct, die gebruikt een GET verzoek het zal me vertellen "Methode niet toegestaan." En dus heb je pagina's, een soort als deze pagina creëren, waarin ik ben alleen echt het gebruiken als een manier voor de vorm te krijgen voorgelegd, kunt u aangeven dat u niet willen mensen om er naartoe te gaan staat direct via een GET-verzoek, of als je niet wilt, om wat voor reden, een Post verzoek je kon gewoon opgeeft GET hier maar in dit voorbeeld, we net wil dat de aanvragen om uit te gaan. Dus, wanneer create_post wordt genoemd als bezoeken we dat via de aanvragen, wanneer je naar een bepaalde route, is er dit verzoek object, en we hadden om te importeren verzoeken aan de top, maar er is dit verzoek object dat wordt doorgegeven, en u kunt het formulier toegang tot de gegevens, die zal automatisch gevuld wanneer u een verzoek van een formulier te verzenden. En dan, wat ik denk is echt cool, is dat het formulier object krijgen doorgegeven in, is slechts een Python woordenboek dat bevat, als je dus even access--, laat ik trek de HTML ernaast, net dus je kunt die moeten als referentie, ja, zo de namen die we hier opgeven voor de verschillende gebieden, dus de titel en de tekst, wij gebruik dan alleen die hier als indices in de vorm van gegevens. Dus dat is super handig. Dus dan post.create noemen we dat zal maken en automatisch invoegen Deze nieuwe post object in de database. En ik denk dat dit te maken functie hier is een echt cool voorbeeld van hoe krachtige Fles is en het werken met dit, want als je iets aan het doen waren in PHP, moet u mogelijk doe heel veel van de validatie, u zou hebben om vervolgens een database verbinding, u zou hebben om vervolgens de SQL-query uit te voeren, maar hier hebben we alleen deze aardige post.create, die we kunnen dan gewoon krijgen de informatie uit van het verzoek object, en geef het dan in een nieuwe Post dat we creëren. En dan, de allerlaatste wat we willen doen, is om het omleiden gebruiker terug naar het huis. En dus hebben we dit gebruiken Kolf redirect functie. En iets dat we hadden niet gezien eerder was deze URL functie. Dus de URL voor functie kunt passeert u in feite de naam van een functie in uw Python-code, in plaats van de specifieke route dat het bij. Dus ik kon net zo goed hebben omgeleid een gebruiker slash, die zou naar huis te sturen, maar met behulp van de URL voor de functie is leuk, want als je het veranderen locatie waar dingen zijn, dus laten we zeggen dat ik de thuis te zijn op / home in plaats daarvan, Dit zou nog steeds dan terug / home, want eigenlijk gaat en kijkt omhoog de naam van de functie, en geeft u de URL terug voor. Dus, een soort van op het veronderstelling dat je bent meer kans om waar dingen veranderen zijn dan de namen van de functies. Je kunt dit goed gebruiken mooie URL voor de functie. En één ding bewust te zijn van dat is een beetje lastig, is dat je denkt dat je kon gewoon omleiden op de URL, maar eigenlijk alle van de routes hebben een soort van tekst en HTML terug te keren, zodat je eigenlijk moet de redirect terugbellen. Anders zul je iets te krijgen ongeldige over het niet terugsturen van een string Omdat al deze moeten terugkeren de HTML je eigenlijk wilt maken. En ja, wanneer u de omleiding te bellen, het automatisch naar de pagina, maar in feite geeft de HTML je nodig hebt om dat omleiding uit te voeren. Ga terug naar de homepage. Dus we hebben deze twee verschillende standpunten. We hebben het huis uitzicht. Of, ik denk dat ik moet zeggen templates. We hebben deze twee templates, het huis template die toont al onze berichten en dan hebben we deze advertentie ding, en wanneer u het bericht klikt, gaat het een nieuwe route in de kolf maar die route niet noodzakelijkerwijs een overeenkomstige matrijs. Je hoeft niet te zien iets, maar je kan nog steeds hebben dit werk te gaan achter de schermen. En dan krijg je doorgestuurd terug naar de homepage. En zeker, het is gemakkelijk om te werken in sommige mooiere CSS in de template en deze zien er een stuk mooier, maar alle van de belangrijkste logica er in de Python. Vragen over dat voorbeeld? Ik weet dat er een heleboel verschillende dingen aan de hand daar, een heleboel dingen die we niet hadden gezien eerder, maar als iets. Ja. PUBLIEK 1: Heeft u niets te doen speciaal voor de gegevens die schrobben vanaf de vorm? Ik zag je net zei "te creëren," EZRA Zigmond: Ja, dus dat is eigenlijk, dat is een heel goed punt. Dus de vraag is, heb je moeten controleren en ervoor te zorgen dat de gegevens geldig, en doen een soort van schrobben om ervoor te zorgen dat het geldig is, want zoals u hier kunt zien, Ik ben niet om dat te doen. Dus laten we zien wat er gebeurt als ik iets posten leeg. Dus, zal het eigenlijk gewoon een lege post en in de DateTime vullen. Dus in werkelijkheid, zou je waarschijnlijk willen iets doen, zoals, misschien opgeven als titel is gelijk aan de lege string, dan is dit niet te doen. Of, alleen doen als de titel niet gelijk lege string. Dus het maakt eigenlijk niet automatisch zorgen dat schrobben voor u, zodat u nog nodig hebt om dat te doen. Ja, goede vraag. PUBLIEK 2: Is het scrub voor sequel injectie? Weet jij? EZRA Zigmond: Hopelijk peewee doet dat. Ik denk dat het zeker een mooie slecht bibliotheek als het niet doen. Ik weet het niet precies. Ik zou moeten kijken naar de opzoeking dat gegenereerd. Ik denk dat, als ik getypt in een blogpost dat soort keek als een SQL-injectie aanval, zoiets als dit, als dit is als een wachtwoord veld of iets, u misschien iets als dit te doen. Ik denk dat dat nog steeds krijgen letterlijk geplaatst, maar ik denk dat peewee doet een soort schrobben van de data voordat het daadwerkelijk uitvoert. PUBLIEK 1: Dat tekstveld ontworpen om platte tekst te nemen, toch? EZRA Zigmond: Ja, het is. Ja. Dus ik denk dat alle, dus dit is correct gedrag, dat zal doen, maar ik denk dat peewee hopelijk doet een soort van bescherming op hun einde. En als je wilde dubbel te controleren dat er zijn manieren waarop u een query genereren. zodat je niet hoeft te direct uitvoeren. Ik moet een te nemen kijk naar documentatie maar je kunt eigenlijk zien de SQL dat genereert, en neem een ​​kijkje op dat, en maak zorgen dat het ontsnapt dingen. Een andere reden waarom je zou willen kijken naar de SQL dat peewee wordt uitvoeren, is als dingen lijken om echt te langzaam gaat, kunt u een kijkje nemen en zien wat het is werkelijk te doen, want het is soms makkelijk om per ongeluk toe te voegen in, de manier waarop je schrijven, je kunt het ongeluk hebben selecteert u de hele database eerste, en doe dan een soort operatie op dat, als je echt bedoeld om een ​​subset te selecteren. En dus, als dingen niet helemaal naar rechts, het is goed om een ​​blik op de aanvraag te nemen Dat is eigenlijk het krijgen gegenereerd. Ja. PUBLIEK 2: Als u voor het eerst begon, je in de poort als 5000. EZRA Zigmond: Ja. PUBLIEK 2: Is de standaard met peewee, of is dat iets wat je kunt veranderen? EZRA Zigmond: Ja, zodat de poort is standaard met fles. Als u het uit te voeren zonder iets specificeren, zal het automatisch doen. Ik geloof, dat ik zou moeten om dubbel te controleren dit, maar u kunt opgeven dat in de app.run, Ik denk dat je iets te doen, port = 8080. Laten we dat eens proberen echt snel. Ja, dus je kunt gewoon opgeven port = 8080, en het zal het daar draaien, waarvan ik denk dat, als je wilde om het uit te voeren op de IDE, heb ik dit niet geprobeerd, maar ik denk dat als je liep het op poort 8080, je waarschijnlijk zou kunnen toegang tot de server, net alsof je voor de website. Ja, maar het is makkelijk om dat te veranderen als je hebben een soort van, zoals port-forwarding dingen die je moet doen. Een andere vragen? Ja? PUBLIEK 1: Dus, zag ik in uw modellen die, zoals u al zei, je moet het specificeren gegevensbestand voor elk object. Heeft u toevallig weet, doet dat maakt het heel eenvoudig als je hebben veel SQLite databases die u wilt gebruiken voor een enkele web app, dat je gewoon kunt opgeven een bos van verschillende degenen in uw model? EZRA Zigmond: Ja, laat me open die up echt snel. Dus, je zegt, als je wilt hebben een heleboel verschillende iets, misschien wilt en de studenten, voor sommige reden, zoiets? Ja, dus ik denk dat je nog, elk model zou hebben om nog net één gegevensbestand toegewezen, maar als je wilde hebben verschillende modellen die hebben verschillende database-objecten toegewezen om het, kon je zeker doen. Dus, als ik een nieuwe, iets zoals dit, en nu dit is een student die lijkt vreemd als een blog post, Ik kon aangeven dat de databank gelijk hier db_2. Dus, ik denk dat het de belangrijkste manier kun je dat doen. Koel. Een andere vragen? Dus gewoon tot het einde van een beetje bit, hier zijn enkele bronnen, en deze dia's zal online worden geplaatst dus je kunt eigenlijk naar deze links. De beste middelen zijn echt de documentatie voor Fles en peewee zichzelf. Ze zijn echt goed geschreven, denk ik. Dus de Flask website is hier, en ze hebben een quickstart tutorial die loopt door soortgelijke dingen waar ik liep door, maar als je wilt een soort van beoordeling van de dingen die ik ging, of je dacht dat ik uitgelegd iets in een verwarrende manier, ze zullen gelijkaardige voorbeelden daar. Peewee heeft documentatie en ze hebben een quickstart handleiding dat gaat over de belangrijkste parameters die je zou willen gebruiken. Dus, de dingen die ik sprak over met de unieke, en specificeren van defaults, verschillende soorten velden u kunt gebruiken, deze zouden er al zijn. Ook als u vragen over peewee, en je ze post op StackOverflow, de man die peewee eigenlijk maakte gaat over en antwoorden die soms. Als je een vraag hebt, hopelijk hij zal in staat zijn om het te beantwoorden, want hij schreef de hele zaak. Ik denk dat dat alles Ik wilde dekken. Bedankt voor het komen uit.