[REPRODUCCIÓ DE MÚSICA] Esdras Zigmond: Hola, tothom. Gràcies per venir avui. Aquest seminari és "Python Web Apps amb el flascó ". Per tant, vaig a estar parlant una mica sobre per què és possible que vulgueu utilitzar Flascó fer aplicacions web amb Python, en contraposició amb alguns altres marcs per aquí, com Django, que és ben coneguda la majoria. El subtítol és "i peewee, "que és una cosa parlarem de com per interactuar amb bases de dades SQL. Això fa que sigui molt agradable. Així que, aquí és només un petit repàs del que vull per repassar. Així, en primer lloc, a una diapositiva que va ser d'inici ràpid, que és la forma d'aconseguir tot creat en l'equip. Vaig a estar demostrant això en el meu màquina local Mac, només perquè aquí és on ho he fet abans, estic més còmode amb ell, però això és definitivament possible en el CD50 IDE. Així que, després d'això, vull introduir el Flascó és, i convèncer per les quals ha utilitzar-lo en el primer lloc. Llavors, vaig a donar una ràpida exemple del que pot fer-ho al flascó, un exemple ràpid del que pot fer en peewee, i després jo et mostraré una manera més completa aplicació exemple que vaig posar junts que pot caminar a través de juntes. I finalment, en l'última diapositiva, tinc alguns recursos que vostè busca en línia per obtenir més informació. Això no és una completa tutorial de com utilitzar el flascó. I vaig espero que sortir un temps per a preguntes. Veient a ningú a nivell local, just com, cridar enmig si té alguna pregunta. Així les coses una instal·lació ràpida, si vols seguir endavant, o si vols aconseguir aquest fins a la seva pròpia màquina, Vaig a utilitzar Python 02/07/10. Flascó funciona amb Python 3, però m'agrada utilitzant Python 2, perquè no hi ha alguns paquets de Python que no funcionen amb 3 encara. Si ha instal·lat pip, que és un gestor de paquets de Python, Crec que si el teu Python és més gran que o igual a 2.7.9, el tens instal·lat, és super fàcil d'instal·lar aquests paquets. Vostè pot fer instal·lar pip Flascó, pip instal·lar peewee, en general ha d'executar sudo només de manera que els permisos de treball a terme. I, si vostè està utilitzant un súper versió antiga de Python, Jo recomano l'actualització del seu Python, o l'ús de EasyInstall instal·lar pip. Així, la següent pregunta és, quin és el flascó? I crec que, en primer lloc un pregunta raonable Em preguntava durant molt temps és, el que és una aplicació web? Perquè això és una paraula que em crec que és llançat al voltant d'una gran quantitat que jo no ho sé. I crec que la millor exemple del que una aplicació web és, Realment és CS50 Finances, on en realitat no és només un lloc web, però és una cosa que podria espècie d'interactuar. Hi ha comptes d'usuari i tot tipus de coses diferents. Llavors, on exactament es traça la la línia entre el que és un lloc web, i el que és una aplicació web, és una mena de arbitrària, però crec que la idea, és alguna cosa més que un lloc web i és una útil aplicació. Així, el flascó és un marc per fer aplicacions web fent servir Python. I és d'esperar, a la fi d'això, vaig a convèncer que es podia escriure alguna cosa com CS50 Finances usant Python, que em com a molt millor que PHP, personalment. Així, el pot és, que ells anomenen un microframework, pel qual, volen dir que és molt simple, però extensible. Per tant, té tot el que necessita, però si vols més característiques, és fàcil portar-los. Però només perquè es tracta d'un microframework, no vol dir que és només per a petits projectes. Tinc un enllaç aquí que diu que Obama fa servir el flascó en 2012 per a la seva campanya lloc web, que és d'esperar, és una cosa així com un aval. Però el que jo realment m'agrada d'Flascó és que, en realitat no fan qualsevol tipus de decisions per vostè. Només perquè estem parlant d'aplicacions web, He de comparar-ho amb Ruby on Rails i Django, tots dos dels quals són grans marcs, però tots dos fan suposicions sobre com vol interactuar amb bases de dades, com desitja presentar la seva punts de vista, i són sens dubte bons aspectes a això. Per exemple, Ruby on Rails té aquest sistema de registre actiu, que és un lloc molt agradable manera d'interactuar amb les dades, però si vol utilitzar Ruby on Rails, estàs tipus de lligats en això. Però amb el pot, com vaig a mostrar amb peewee, pot utilitzar qualsevol classe de la base de dades que desitgi, i vostè pot simplement tirar que, en com una extensió en el pot. Així que per això jo realment com Flascó, és que no fer suposicions per a vostè basat en coses que no necessita realment. Així que, per què ha de vostè utilitzar el flascó? Els avantatges són, simplement té realment les característiques principals construït en ell que vostè necessita. Per tant, vostè no ha de preocupar entendre un munt de coses que realment no necessita. Vostè no ha de tenir de preocupar sobre com desactivar característiques que realment no necessita. I, com ja he dit, és super fàcil d'afegir a les extensions de les coses que vostè necessita. Alguns d'ells, el flascó té el seu suport a la mateixa. Així que hi ha una cosa que es diu Flascó admin, que reflecteix que l'administració panell que Django ofereix, que li dóna una forma visual agradable per administrar el seu lloc web. Però, de nou, si vostè és fer una cosa senzilla, és probable que no necessita un gran administrador Panell, així que crec que això és súper agradable. I els desavantatges són, que vostè té menys poder treure'l de la caixa. Per tant, el primer cop que obre el pot, i en el seu programa de Python, només ha de teclejar des Flascó import *, o el que sigui, no obté exactament tots les característiques que vostè pot ser que vulgueu. I el que ha de més explícitament enumerar les característiques que desitja. Així que això és un desavantatge, però jo crec que per a la construcció de petites web aplicacions com vaig a estar mostrant vostè, això no és realment un problema. I l'últim que és suposa que dir, que és un error tipogràfic, és que hi ha menys estandarditzat convenis per a l'ús de Flascó, simplement perquè no hi ha tants les persones que l'utilitzen professionalment en comparació amb Django. Per tant, si es mira alguna cosa com: "Com puc fer x" en Django, vostè probablement trobarà. Hi ha un bon disseny patrons que es poden utilitzar, però amb el pot, és espècie de seguir el seu propi camí, només perquè és un bastant petita biblioteca. Així que aquests són la desavantatges, però crec que segueix sent una bona biblioteca d'utilitzar. Així que anem a entrar de ple en el pot. Aquest és, sens dubte no va ser un manual complet, però és per donar-li una idea de com estructurar les coses, i perquè et sentis còmode anar fora i mirant a la documentació i saber més. Per tant, permetin-me obrir una realitat exemple senzill al principi, i el que mostrar sembla, i després anem a descomposar una mica més. Així que aquesta aquí, deixa posar-lo en marxa. Així que, ara tinc la meva aplicació en execució. Vaig a obrir Safari i s'està executant en el meu host local. Així que només vaig a fer aquest més gran. Però localhost: 5000 I així, en aquest moment, tot això fa és a dir, quan vostè visita el lloc web, imprimeix "Hola Flascó" que no és molt útil, però crec que és genial que en aquest petit arxiu aquí, tenim un servidor web en execució que s'està imprimint alguna cosa. Així que, anem a veure en realitat en el codi d'un segon, i descomposar una mica. És la mida bo per a tothom aquí? Així que, amb sort, ets una mica còmode usant Python. Estic assumint que podem mirar el Python i llegir a través d'ell. Si vostè té alguna pregunta sobre res, jo també puc anar sobre això. Així que la primera línia és, des del flascó, importem, Flascó amb un capital "F" que és una espècie de tot el característiques clau que vostè necessita. Cada vegada que vostè està escrivint un arxiu i utilitzant el flascó, vostè va a voler importar que, només perquè això té totes les coses principals. La següent cosa que fem, som nosaltres cridar a aquesta funció Flascó, just per crear un objecte aplicació, i ja està sempre voldrà fer això. I després, saltant a la avall ràpidament, aquesta part és aquí, 'if_name _ == "_ main_"', que és una mena de convenció de Python. Així que això només s'executarà si executar aquest fitxer directament utilitzant Python. Després, truqui app.run, que ho farà en realitat iniciar l'aplicació en marxa. Per tant, aquesta és l'estructura principal que que tindrà en qualsevol aplicació Flascó, és que vostè tindrà aquesta aplicació = Flascó (_nombre_), i després app.run. Així, les dues coses que tinc aquí, són el que anomenem rutes. Per tant, parlarem de encaminar una mica més. Vaig a tornar a la diapositiva. Per tant el més fonamental concepte en el pot és l'enrutament. I és la idea que vostè assignar funcions en Python a adreces particulars a la teva pàgina web. Així que, quan vulguis per crear una nova ruta, utilitza aquesta @ app.route decorador funció. Per tant, si no està familiaritzat amb decoradors de funció en Python, és que aquest concepte Li permet prendre una funció i l'envolten amb una mica més. Així que en realitat, el que fa aquest decorador, és que pren la funció sota d'ella, i s'afegeix més informació a ell, però el que en realitat Flascó no a que això passi no és super crucial, però el que és important, és que abans de la ruta, posar això @ app.route, i després la direcció de la ruta, de manera que la barra és el que vam veure quan ens obrim la pàgina web. Així que aquesta és la pàgina d'inici. És només la ruta de tala. I llavors vostè té aquesta funció. El nom de la funció pot ser el que vulguis. No ha de necessàriament tenen a veure amb la ruta. I després, qualsevol que sigui El retorn de la funció, la funció ha de retornar una cadena. I aquesta cadena pot contenir HTML ni res, i això és realment el que va a aconseguir tornat al seu navegador web com HTML, i farà que el. Així que aquest és el mateix codi que era l'exemple que acaba d'executar, de manera que quan ens visita barra, es diu a una funció Hello World, que només retorna una cadena, Hola Flascó, i que s'imprimeix a la pantalla. Així que hi ha un altre exemple, que és, quan vostè visita / hola, imprimeix Hola Paraula, que en realitat hauria de dir Hello World, però anem a suposar que va ser intencional. Així que anem a llençar que fins molt ràpid. Així que si vas a localhost / hola, ara imprimirà una altra cosa. Així que això és només un exemple ràpid de com pot crear dues rutes diferents. Així que, fins al moment això no és molt útil, no hi ha molt que puguis fer, vostè podria fer tot això amb tenir diferents pàgines HTML, i quan vostè visita un particular, pàgina només carrega la pàgina. Així que anem a veure una mica més coses útils que pots fer. Per tant, una cosa que vostè pot ser que tingui notat en l'exemple que vaig treure amunt, és que jo havia app.run (debug = True). I així, el que això argument de depuració fa, és que quan s'executa el servidor web, quan estàs en la seva aplicació, si canvia un arxiu, ho farà recarregar automàticament el servidor. I pel que no ha de realment reinici Python, que és super útil. Puc demostrar que. Déjame treure el meu codi amb l'error tipogràfic en el mateix, i pretendre que typo va ser posat allà intencionalment per als propòsits instructius. Així que anem a afegir això de nou. Així que ara que diu Hello World. Vaig a guardar-lo. I si tirem una còpia de seguretat el terminal, se li dir que és reiniciar, perquè detecta un canvi, i així ara, quan recarreguem aquesta pàgina s'imprimirà la cosa correcta. Així depuració és super útil per això. A més, si vostè té qualsevol una mena d'accident, de manera que vull deixar aquesta caiguda de l'aplicació tenint no retorna una cadena. Així que, anem a tenir- tornar Cap per alguna raó. I després, quan visito aquesta pàgina, s'acaba d'estavellar, però el servidor no es limita a estavellar-se, es en realitat li dóna una volta super útil rastre de tot el que va sortir malament. I el que és molt agradable, és que en qualsevol pas en aquest rastreig, vostè podria obrir una interactiva shell aquí, i una mena de imprimir el que variables que volen veure. I així, la depuració és realment utilitat per a cercar el que està passant amb el seu servidor, en lloc de només veure alguna cosa en PHP com un intern 500 error al servidor, que és super inútil. Una cosa a tenir en compte, és que si poses la teva aplicació en línia pel que és visible per al públic, que mai volen sortir del mode de depuració en, perquè la gent realment pot usar aquesta consola que em va mostrar que permet executar codi arbitrari. Així que es poden imprimir com qualsevol codis secrets que tens aquí, poden veure exactament com el seu lloc web està funcionant. Així que és realment útil per a les proves, però sempre vos de treure-ho abans publicar qualsevol cosa en línia. Així que quan vostè està utilitzant alguna cosa com PHP, hi ha aquesta idea que pot passar informació entre pàgines web posant la informació en realitat a l'URL, que és una sol·licitud GET, però en el pot, en realitat es pot fer alguna cosa alguna cosa així com que, per tenir una ruta que té una variable com a part d'ella. Així que si ens fixem en aquest exemple a la pantalla d'aquí, tenim una ruta que és ('/ Hola /'), i per tant, si vostè visita / Hola / alguna cosa, aquesta cosa aconseguirà realment ple en la variable nom. I noti que la funció que ve amb aquesta ruta ha de prendre en el paràmetre nomenar, per la qual cosa farà realitat aconseguir passat a la funció. I després, una vegada que estàs dins d'aquesta funció, vostè pot tractar de que com una variable normal Python, i així doncs, que ho farà imprimir Hola, i omplirà en el nom usant part del format de cadena. Així que per afegir parts variables a un enrutament, s'utilitza el suport en angle marcat. I opcionalment, pot utilitzar el que es diu un convertidor. I així, si vostè posa aquest anotació amb el còlon, pot especificar que es tracta de 1 int o float, o ruta, i es convertirà automàticament això. També pot fer la conversió dins de la funció de Python, tot just usant un guix, però de vegades si vostè vol assegurar-se que és un int, pots posar això regla de conversió en aquest país. Així que anem a tirar cap amunt un exemple d'algunes regles variables. Així que aquí, això té el mateix bàsic estructura amb el del flascó d'importacions Flascó, l'aplicació = flascó (_nombre_), i després que s'està executant a l'extrem. Tenim aquests dos diferents rutes variables aquí. I el primer, és el que em vaig presentar en la corredissa, que va ser que només es necessita en un nom de cadena i s'imprimirà Hola, Nom. I llavors, el segon un utilitza la conversió. Així que això ho convertirà automàticament a un int i, a continuació, duplicar la int, i imprimir això. I, no fem cap tipus de la conversió dins d'ella perquè el flascó s'encarrega d'això. Així que anem a aquesta carrera. Quan vostè té un flascó aplicació en execució, vostè pot controlar-C fora d'ell per aturar el servidor en execució. I després vaig a córrer les variables. Així que anirem a localhost / hola / Esdras i Esperem que això saludar a mi. Així que va prendre en el meu nom, en la variable ruta, i el va omplir aquí. Així que jo també vaig a mostrar una ràpida exemple de la duplicació. Així que si vas a / doble / 3, s'imprimirà juny. Així que això es va fer càrrec de la conversió per a nosaltres. Així que vostè també pot fer-ho amb flotador, i alguna cosa especial, si vostè necessita especificar alguna cosa com un camí, que li permet acceptar barres, però això no ha de generalment ser un problema. Fins ara, encara té acaba de ser tornar cadenes, que no és molt interessant. Podríem realment tornar cadena HTML literal. Així que en el codi es pot inserir una mica com el b-tag perquè sigui audaç, però la major part del temps que en realitat no volen ser l'escriptura de codi HTML en el codi Python. Es posa molt brut, i no és un bon moment. Flascó ens permet separar el HTML en el que s'anomena la plantilla, i pel que si vostè està pensant en termes del model MVC que vostè està familiaritzat amb, amb sort, de treballar amb CS50 Finances una mica, es pot pensar en els arxius de Python com més del contralor, on estan interactuant amb el model de dades que pugui tenir. I després estan trucant a Vistes i passar informació a la Vista per emplenar la informació en HTML que necessita. I el que anomenem aquests Vistes són plantilles a classe. Així Flask utilitza una altra Python mòdul que ho farà de forma automàtica instal·lar quan Pip · la Flascó crida Jinja, que li permet afegir aquests anotacions a l'HTML que es veu a la pantalla, que li permet es posa en coses com els condicionals, i bucles en el codi HTML. Així que sembla una mica a com podria utilitzar PHP en un arxiu HTML, però això és només quan el flascó servidor serveix l'arxiu HTML, s'executarà aquest motor de plantilles i analitzar a través d'això i omplir coses. Així flascó té una funció render_template que es pot veure a la part inferior aquí. I així, quan vostè visita aquesta pàgina, faria que aquesta plantilla hello.html, i després ompli aquest pàgina HTML. Així que anem a executar aquesta veritable ràpida, i veure el que sembla, i després vaig a anar a través d'un poc amb més detall. Per tant, les seves plantilles es van anar en una carpeta Plantilles. Es veurà de forma automàtica dins de la Plantilles carpeta per a aquesta plantilla. Així que anem a obrir això. Per tant, vaig a córrer l'exemple de plantilles. Així que si vaig a / hola / Ezra, que té aquesta horrible, etiqueta marquesina odiós que vaig posar en. Molt bonic, molt dinàmic. Sóc un gran fan. Però, què passa si Acabo d'anar a, / hola? Per tant, es limita a dir Hello World. No vaig passar un nom, i es va omplir en forma automàtica. Així que anem a veure com es va fer això, i com podem desfer d'aquesta carpa potser. Així que aquí, aquesta és una espècie de un exemple interessant de, si està familiaritzat amb la forma de l'interruptor declaracions treballen en un idioma. Dir això és com, aquest tipus d'una caiguda a través, on realment aferrat de dos diferents rutes a la mateixa funció. Així li donem la / hola ruta i el / hola / nom de la ruta a Hello, i especifiquem using-- Python li permet especificar per defecte la funció arguments-- pel que si no hi ha un nom, per la qual cosa si anem a sol / hola, es filtrarà automàticament de nom és igual a cap. Així doncs, li rendim el Plantilla amb nom = nom, pel que passarà en el paràmetre de nom igual a aquest paràmetre de la funció nom, a la plantilla. Això encara no explica com és decidir si s'ha d'imprimir Hello World, o imprimir el meu nom. Així que anem a veure en realitat en la pròpia plantilla, i veure a on està venint. Així, dins d'aquesta plantilla, que en realitat tenen una mica de lògica condicional, que algunes persones es argumentar, en realitat no ha de tenir molta condicional lògica dins de la seva pròpia plantilla. Hauria de ser més dins de la Controller, però per a aquest exemple és una cosa molt petit. Així que aquí, comprovem, si el nom, per la qual cosa si el nom no és igual a cap, si un nom és en realitat aprovada en, llavors es dir hola, nom amb el capçalera i la marquesina, tot això HTML normals, en cas contrari, anem a imprimir Hola, món acaba normalment. Així que un parell de coses d'avís aquí sobre com formatar la plantilla, és que, tots aquests sentències condicionals, una mena de manera com PHP quan voleu inserir una mica de PHP, utilitza el menys-que pregunta marca, és una espècie d'anàleg aquí amb el {%. Així que aquí tenim el nostre codi condicional. I llavors, quan en realitat es vol literalment avaluar alguna cosa, i d'impressió fora de la pantalla, utilitzar els dobles tirants. Així que aquí estan les claus dobles, i després vam especificar nom, així que d'aquí a això, s'avaluarà amb el nom de la variable, que va ser aprovada per la render funció de plantilla, en lloc de només la impressió terme, si ens lliurem d'ells, seria simplement imprimiu la paraula "nom". Així que, això és una cosa a tenir en compte. Així que una altra cosa avís és que, quan ens que desitgi utilitzar el funció render_template, en realitat hem d'importar que explícitament del flascó. I aquest és un exemple de la modularitat de Flascó, que vostè no ha d'importar coses que no necessites. Vostè només pot portar al funcions que realment no necessita, que és de vegades agradable, així que no ho fa ha de tenir totes aquestes funcions asseguts al voltant de que no s'estigui fent servir, sinó també, si se li oblida que vostè necessitarà importar render_template, probablement obtindrà un advertiment que li permetrà saber sobre això. Per tant, és de plantilles. Per tant, hem demostrat com fer que les pàgines web senzilles, i afegir una mica més a la lògica que, en termes de l'encaminament variable. Et permet fer coses diferents sobre la base de el URL vostè va a, i llavors, donar l'HTML una mica més de sentit en termes de com vols fer les coses. Vostè no ha de posar tot codi HTML a la teva Python, però per a gairebé totes les aplicacions web, vostè va a voler algun tipus de model de dades associada amb ell. I així tradicionalment, podria alguna cosa així com una base de dades SQL. I vostè pot interactuar directament amb SQL. Python té, crec que es diu. SQLite 3. Només pot importar SQLite 3 i executar directament consultes SQL, però jo no sé vostès, però la veritat és que no m'agrada, simplement, escriure consultes SQL. Tendeix a ser realment llarga i complicada. I així, una cosa que M'agrada utilitzar és el que es conegut com un ORM, que és una mapatge objecte-relacional. I el punt d'un mapatge objecte-relacional, és que hi ha dos diferents maneres que vostè pot pensar en les bases de dades. Així l'exemple que Professor Malan general utilitza a classe, és la taula d'Excel, on vostè té aquestes files i aquestes columnes, i això és realment útil per la forma en què es representa en SQL i la forma d'interactuar amb ell, però d'una altra manera que en realitat és útil per pensar-hi de vegades, és en termes de classes i objectes. Així que en lloc de pensar de cada taula com tenir aquesta fila que té certa informació, en realitat es pot pensar en ell com sent cada taula és una classe, i llavors cada instància de la classe té certes propietats. Així, en aquest exemple, les instàncies de la classe són les files de la taula, i després cada propietat faria ser una columna a la taula. Així, l'ORM que m'agrada utilitzar es diu peewee. És molt petit, una cosa així com el flascó. Crec que van bé junts, però hi ha un munt d'altres ORM que es pot utilitzar. A una més popular és conegut com SQLAlchemy, i no puc recordar per què em originalment triar peewee sobre SQLAlchemy, o t'ho diria per què Crec que és la millor, però només utilitzarem aquest un perquè jo sé com usar-lo. Així, una pregunta és, per què en cas que et molestis a usar un ORM, en lloc de només directament escriure consultes SQL? I crec que el millor dels casos, és que no ho fa realitat d'escriure consultes SQL. És molt més fàcil, com jo us vaig a mostrar, a fer coses com la selecció, inserció, eliminació, especialment la creació de taules. És molt més fàcil escriure una estructura de classes, del que és estructurar un Crear TABLE, però una cosa a tenir en compte, és que l'ORM farà tot el possible esbrinar el que la major part consulta SQL eficient seria, però de vegades s'equivoca. I sobretot si ets treballar amb una gran base de dades, es pot observar que una consulta que ha d'estar en execució ràpida, en realitat està prenent més temps. I si es mira sota el capó en forma l'ORM està interpretant que en SQL, que podria estar fent alguna cosa realment ridícul, només perquè és una mena de va fer un gest a les seves intencions malament. I, hi ha hagut moments en els He hagut de anul·lar-la, i just executar les meves pròpies consultes SQL, simplement perquè analitzava d'una manera estranya. Per tant, hi ha una certa sobrecàrrega, just en el camí que compila la seva declaracions a baix en SQL. Per tant, anem a veure molt ràpidament a un exemple senzill d'un model de dades que vostè pot utilitzar. Així, es tracta de codi Python, de manera que el El primer que vull fer és de importació peewee *. Així, a diferència de Flascó, on has Tots aquests mòduls individuals, i voleu importar el flascó, i escriure una plantilla, i alguns altres que veurem més endavant, a partir de peewee, que només pot importar tot, perquè és una molt petita biblioteca. Per tant, el primer que vols fer, és de fet crear aquest objecte de base de dades. Per tant, vostè té db = SQLiteDatabase, i després el nom de la base de dades. I això ho farà realitat crear un objecte de base que es pot interactuar, amb peewee. I després, tenim la real model que volem crear. Així que la taula que volem crear. Així, dins de peewee, cada classe té seva pròpia taula dins de la base de dades. Per tant, totes les classes heretar el model base, i el model de capital M és cosa que es defineix en peewee. Per tant, tots els seus models haurien heretar la seva màxima superclasse, han heretar de la model, però el que és realment fresc, és que en realitat es pot tenir la seva models hereten l'un de l'altre. I una gran part del temps, la seva models de dades no ho fan necessàriament fer una jerarquia d'herència agradable, però moments en què ho fan, és molt agradable, perquè vostè té el model inherent entre si. Així, definim aquesta classe "estudiant", que hereta un model, i té tres propietats. Compta amb un ID, que és 1 primaryKeyField, que és una cosa que es proporciona per peewee, el nom és un CharField, i un grau és un IntegerField. Així que això pot o pot no ser com CS50 realitat emmagatzema tota els graus dels estudiants. No ho és, però així és com jo ho faria. I llavors té, dins de aquesta classe, i això és una cosa que es pot fer amb Python, pot tenir classes niades. I això és una cosa el que es requereix per peewee. Per tant, aquesta classe Meta, té per especificar que la base de dades és igual que l'objecte que hem creat anteriorment. I això ho diu fitxer és aquesta taula en realitat va a estar continguda en. Així que això és una cosa que has fer dins de tots els seus models. Només has d'especificar dins d'aquesta classe Meta aquesta base de dades és igual a db. Així que el que sol fer, si tinc un munt de diferents models, és que tinc una base de model, que en general només anomenar "model base" que té la classe Meta, i estableix la base de dades igual a db. I llavors tots els meus models posteriors heretarà d'aquesta classe base. I llavors jo no he de preocupar-me sobre la configuració de la classe Meta. Així que, quan això es posa realment compilat cap avall en una sentència SQL, sembla que aquesta cosa desagradable baix aquí, "Crear una taula d'identificació d'estudiant sencer, " el que sigui. I, crec que és més curt, aquesta consulta SQL aquí, però si ens fixem en aquesta classe aquí vostè pot veure exactament el que està passant. Vostè pot veure quin tipus de camps existeixen, el que estan són cridats, i així, crec que mirant el codi Python és molt més llegible que tractant d'escriure aquesta consulta SQL. Per tant, per tal de realitat utilitzar la base de dades, hem de connectar amb ella dins de Python. Així que, jo acostumo a escriure una funció anomenada initialize_db que fa dues coses. Porta a la base de dades db objecte i es connecta a ell, que acaba obre fins a la secció de la base de dades. Si acaba de córrer encara pàgina web en el seu equip local, no és un super gran cosa de preocupar sobre la connexió i desconnexió, però si està executant en un lloc web, voldrà assegurar-se que, sempre que un usuari es connecta a la mateixa, quan es tanquen a terme el lloc web, es desconnecten de manera que vostè no tenen un munt de persones connectades a la base de dades alhora. I després, quan connectar-se a la base de dades, que voleu marcar db.create_tables, i la llista de les models pel que vols per crear taules. Així que aquí, només vull crear per a aquest estudiant. I després, el que és important, és especifiqui segura = True major part del temps. Així que el que aquesta declaració va a fer, és que crea taules per al model d'estudiant, però només si aquesta taula no té ha creat ja. Això és el que els especifica segures. Així que no es sobreposen seva taula existent, només crearà una nova taula si no hi ha ningú allà. Per tant, vostè podria crear les taules un cop usant SQL. I després ha d'estar la base de dades allà i, a continuació, connectar-se a cada vegada, però en general és bo només per lloc en la present convocatòria create_tables, de manera que, si alguna vegada eliminar el seu quan la base de dades s'executa la web aplicació de nou, serà tornar a crear-la. Per tant, només assegureu-vos que segura s'especifica per ser veritat, o trobareu les seves dades només rebent una pallissa cada vegada. I llavors, només pot trucar a initialize_db per establir una connexió, i crear taules si cal. Així, el més comú que haurà de fer, o una de les coses més comunes, és inserir en realitat les coses a la base de dades. I així, en lloc de tenir escriure una inserció en declaració amb tots els valors especificats, en realitat es pot trucar funció de la classe dels estudiants. Per tant, quan es crea una classe que hereta de model, que té aquesta crear mètode. Per tant, ho fa la classe name.create, i especifica els paràmetres que desitja passar. Així, si vull afegir alguns estudiants al nostre exemple de qualificacions CS50, Vaig a posar en David, que té un molt bona nota, té un 95. I jo, que no ho està fent tan bé en CS50, tinc un 50. I així, el bo de el que fa aquesta funció de crear, és que retorna l'exemple, o la fila, que es va crear dins de la taula, i així llavors vostè emmagatzema que en un variables, i el treball amb ella més tard. Vostè pot canviar tot, que Et vaig a mostrar un exemple de. Fixa't que jo no vaig fer ha d'especificar l'ID, perquè ja que és el PrimaryKeyField, ho farà de forma automàtica incrementar si no ho especifica. I, de fet, és probable que no ho haurà d'especificar, perquè és possible que accidentalment donar-li una pallissa ID d'una altra persona. I vostè vol fer Segur que és únic. Així que, en realitat, el més cosa comuna que vols fer, és, probablement, seleccioneu terme de la base de dades una vegada que tenir una gran quantitat d'informació en aquest país. I així, si vols tenir tot, per la qual cosa l'equivalent del selecte estrelles de la declaració dels estudiants, que només seria student.select. I això li donarà volta una matriu amb tots els estudiants objectes en ella que iterar sobre vostè desitja. Vostè pot aconseguir coses fora d'ell. I la majoria de les vegades, no només volen fer de selecció, en realitat es vol especificar alguna cosa. I és així, vostè pot encadenar junts aquestes crides a funcions, com la forma en què ho faria en cadena junts les declaracions en SQL. Així que vostè pot fer student.select (). On en aquest exemple. I després, es pot especificar les condicions, simplement usant Python normals Booleans per comprovar les coses. Així que, en aquest cas, vostè vol limitar el que vostè està seleccionant a, on student.grade és igual a 50, i student.name és igual a Esdres, de manera que només em va a sortir-ne. I noti, realment El subtil aquí és que, si es vol especificar 1 i / o un o i / o, en Python, que normalment s'utilitzi, Crec que la paraula "i" en realitat, però aquí s'utilitza el signe únic, que normalment és un operador de bits, però en aquest cas especial, tal com ho fa peewee, utilitza l'única símbol d'unió per a especificar "i". Això és una cosa que Em confonc molt, però no apareix que molt en la pràctica. I després, una vegada que tingui tots els estudiants fora de la base de dades, una vegada que hagi fet vostè és selecte i la seva roba o el que sigui, pot utilitzar un bucle foreach, de la mateixa manera que el normal en Python, amb qualsevol tipus de Iterador o amb qualsevol tipus d'arranjament. Així que vostè pot fer, per s en student.select (). whe re (Student.grade <75), i pel que aquesta voluntat iterar sobre cada un dels estudiants a la taula la qualificació és inferior a 75, que en aquest cas, segueix sent només jo. I llavors vostè podria fer alguna cosa dins aquest bucle, com jo enviï un correu electrònic i jo realment dir-li convertir en els meus butlletins de problemes. Així, una altra cosa que pugui fer, és que és molt fàcil actualitzar files a la taula. Així, recorda tornar aquí, seva en inserir, Vaig prendre el valor que era retornat per student.create, i em van assignar a nom anomenat Esdras. I ara, vostè pot canviar el valors dins d'aquesta instància, de la mateixa manera que ho faria amb un classes normals en Python. Així que vostè pot establir ezra.grade = 95 i que va a actualitzar la còpia local, però si realment vols cometre aquest canvi a la base de dades, has de trucar ezra.save, per la qual cosa va cridar el mètode .save en la instància. I ara, he canviat correctament meu propi grau dins de la base de dades. Així que, a continuació, direm que m'atrapen canviar de grau dins de la base de dades. Professor Malan probablement va a voler que em elimini de la classe, i així que vostè pot trucar a la .Delete mètode d'instància només en aquesta cosa. Així que, si volia anar de nou en aquest bucle aquí, i, de fet, en comptes d'enviar missatges de correu electrònic tots dels estudiants el grau és menor de 75, que volia eliminar-los, dins d'aquest bucle poguessis cridar instància s.delete. I l'última cosa que vols fer, és quan s'estableix una connexió, i ja està amb el seu treball, que voleu marcar db.Close, on db és que la base de dades objectar que teníem abans. I vostè vol assegurar-se que tot es va tancar fora de. Fresc. Així que ara, tinc un exemple d'aplicació. He espècie de pre-fer tot tal de manera que no hi haurà cap tipus de codificació en viu errors, però podem caminar a través d' i veure com es posaria Flascó i Peewee junts, i fer una aplicació senzilla. Jo ho dic diatriba CS50, i és una mena de plataforma de bloc simple. Així, en primer lloc, vaig a córrer i mostren el que sembla, i llavors podem mirar més en el codi. Molt bé, així que anem a executar això. Refredar, faré això una mica més petit. No és molt bonica, només perquè No vaig fer un munt de CSS, però el que fa és, té aquesta base de dades de publicacions al bloc, i va a través de tots ells, i se'ls mostra a la pàgina amb la fi de les més recents. I així, aquests són només alguns dels llocs que havia guardat a la base de dades. Així que si volem crear una nova després, podem anar a Afegir una nova entrada, i podem entrar en el títol de la post, així que alguna cosa com, seminaris CS50. Wow, realment gaudint del seminari. Fresc. A continuació, premi post, i serà redirigir de nou a la pàgina d'inici, i ja veuràs com es va afegir l'últim missatge. I encara tenim tots els que hi ha. Així que ara, anem a fer un pas a través de tot el codi i veure com s'implementa. Per tant, crec que la primera cosa que farem fer una ullada a, és en realitat els models. Una gran part del temps, quan vostè està dissenyant alguna cosa, vostè vol pensar primer en com que representarà a les seves dades, i després dissenyar coses al seu voltant que, perquè tot tingui sentit. I això és realment la forma en què ho va fer quan jo estava fent això, Em vaig asseure i vaig pensar, ¿Què és el que vull en un pal. Així doncs, aquí, tenim la mateixa estructura que jo esmentava abans, on fem db = Sqldatabase ('posts.db'). En realitat, és probable que no vol al codi dur en les bases de dades del seu nom. Això probablement hauria de ser un paràmetre que s'emmagatzema en algun lloc, potser en un arxiu de configuració, però en un petit exemple d'aquest tipus, que està bé per codificar que en. Així que ara, tenim aquesta classe de correus, que hereta des del model base. I té, de nou, el ID = primaryKeyField. En realitat, si no s'especifica, si realment es va desfer d'això, llavors Peewee nosaltres ens encarregarem de la creació automàtica d'aquest camp ID, i ho farà de forma automàtica que sigui un PrimaryKey, que Crec que és molt agradable, perquè en general, això és una cosa que desitja tenir, però m'agrada posar-lo en concret, perquè jo recordo que hi ha allà. Però si no s'especifica que, que estaran allà automàticament. Així doncs, tinc una cita que és un DateTimeField, i tot aquests diferents camps, si mirar la documentació peewee, et donarà una llista dels diferents tipus de camps que es poden utilitzar. En la seva major part, és anàloga al que es veuria en SQL. Així que hi ha una CharField, 1 VarCharFields, camps de text, que són per molt temps textos, com una entrada de bloc potencialment, DateTimeFields, DoubleFields, FloatFields, totes les coses per l'estil. I pot passar en altres arguments a ell, que no va especificar aquí. Diguem, per exemple, que no vol permetre que dos missatges tinguin el mateix títol, podria especificar alguna cosa com a única = True, i això és només un paràmetre addicional per el camp que quan es compila baix en l'SQL, especificarà que ha de ser únic. També podeu especificar alguna cosa com no nul i totes les altres coses ho fa normalment en SQL. Per tant, aquest és un molt simple model que té la data. Cal notar aquí, dins el DateTimeField, He especificat quin és el valor per defecte és. He especificat que sigui datetime.datetime.now, causa de la forma que això s'avalua, que en realitat avalua el DateTime.Now quan que s'insereix a la base de dades. Crec que, tindria duplicar comprovar això, però si ho has fet alguna cosa com això, a continuació, que en realitat avaluar que una vegada, i després el DateTime sempre seria la mateixa. Així que, si estàs fent alguna cosa amb datetimes, doble control que està avaluant quan realment s'insereix, o bé pot ser confós. El títol és només una CharField, que hi ha són més arguments es poden passar en especificar exactament quant de temps vull que sigui, però aquí, realment no importa. I text serà el text de tot el post, i això serà un TextField només perquè vostè vol per permetre que sigui una cadena bastant llarga. Llavors tenim aquesta Meta subclasse que acaba Especifica que volem la base de dades on això és en realitat va obrir a ser l'objecte db que tenim aquí. I l'últim que tenim aquí, és només aquesta funció que anem a utilitzar des de la nostra aplicació principal per inicialitzar la base de dades per connectar-se a i, a continuació per crear la taula Post. Ara, donem una ullada a l'aplicació principal en si. Així que aquest és un bon poc més llargues que les que hem vist abans, però espero que no sigui massa dolent. Per tant, permetin-me expressar això. D'acord. Així, es va adonar i la part superior em va importar un munt d'altres coses Pot de que nosaltres no tenim realment vist abans. I és d'esperar, podem passar per cada un d'ells un per un i parlar una mica més sobre ells, ordenats per exemple. Així, tenim el pot, i la render_template, que hem vist abans, aquest objecte de sol·licitud, que es plantejaran quan ens fixem en la forma la manera que jo estava mostrant realitat funciona. Redirigir, que li permet redirigir darrere de la Afegeix nou post Tornar a la pàgina original, i després URL, que és una cosa que li permet esbrinar en quina part del lloc web una pàgina en particular és. Així doncs, la propera cosa que faig, és que la importació tota la informació dels models arxius que estàvem veient. I, sí. Per tant, una mica més nou que ve quan vostè està tractant, especialment bases de dades, és que es pot especificar una funció que és cridada abans cada petició, i la funció que obté anomenada després de cada sol·licitud, l'ús d'aquest sol·licitud funció decoradora app.before. I pel que això s'executen on aquesta funció és. Això no té per què ser anomenada abans de la sol·licitud, però en general això és una cosa assenyada cridar-ho. Podeu especificar qualsevol funció vol ser anomenat allà, així que he especificat aquesta initialize_db funció que vam tenir allà pels Models arxiu, de manera que abans de cada sol·licitud, volen connectar-se a la base de dades. Hi ha dues diferents maneres que vostè pot fer això. Vostè pot hacerapp., I crec que és after_request. I la diferència entre after_request i teardown_request, és que after_request només succeirà si la sol·licitud en realitat era vàlida. I així, només si el sol·licitud s'ha realitzat correctament, si res va sortir malament, però teardown_request que succeeix en el cas d'un èxit sol·licitud, o en el cas d'un error. Així que, en general, vostè vol utilitzar teardown_request, llevat que vols fer alguna cosa, especialment diferent en el cas d'un error. Però només pel tancament de la base de dades, si té èxit o si falla, fem que voleu alliberar de la base de dades. Així es diu, db.Close en l'objecte db. Tingueu present que el teardown_request pren en una excepció. Així que vostè pot comprovar si hi havia en realitat un error quan s'estava tancant, però aquí, és d'esperar, hi ha no són un munt d'errors, així que estem només una espècie d'ignorar això. Està bé, i la resta no és tan dolent. Així que, quan anem a la pàgina principal, prestem plantilla home.html que s'obrirà. La passada és en el post igual, i el que això fa és, recordeu que tenim aquesta entrada model, de manera que seleccionar tots els missatges, i després una altra cosa que pots fer, pot especificar la clàusula WHERE, pot especificar una ORDER BY, i així prenem tots els missatges que aconseguir seleccionat, i després els enviem pel post.date.descending. I això va a especificar, quan que en realitat surten, el més recent serà molt primera. I després, es passa això en la plantilla home.html, així que anem a realment obren Plantilla que realment ràpid, i fer una ullada a com està funcionant. I això no és gran HTML, però amb sort, podem centrar-nos en el Python. Així que hi ha un vincle amb el Afegiu nou Publicar, de manera que aquest especifica la ruta dins el flascó que definir, que està just aquí. Aquesta és la nova ruta de correus, i especifiquem que aquí. I el que és un enllaç que vagi a aquesta ruta dins del servidor matràs. El més interessant és aquest bucle for aquí. Així s'especifica que aquesta paràmetre càrrec que va ser aprovada en el funció render_template, per cada missatge en el lloc de objecte que es passa a. Volem imprimir el títol de l'entrada, a H1, i després més endavant, volem imprimir el text posat dins d'un paràgraf. I aquí, podem realitat cridar a una funció de Python, pel que podem anomenar strftime, RF en temps ST, i pot passar a la cadena de format que voleu imprimir les dades en. Així que ha és bastant agradable que pugui realment cridar a aquesta funció Python des de dins aquí. Vostè no té a veure el format de el costat del controlador, perquè realment, el format de la data és una cosa que vostè vol tractar dins de la vista. I tot això per cent les coses no és super important. Si es mira la documentació per a la funció strftime en Python, especifica totes aquestes coses, però això de com, quan estàvem buscant a la pàgina principal d'aquí, formata això amb un bon data, i especifica AM o PM, però normalment, si no tenia això aquí, probablement obtindrà una mica d'escombraries data que no es veia molt bé. I després especifiquem el post.text, i vaig poder han posat un parell de salts de línia aquí, només per posar alguns espais entre cada pal. Per tant, crec que el més important cosa en aquest exemple, és que es pot utilitzar aquest bucle for. I això és anàleg a coses que vostè pot fer en PHP. Pot recórrer, tot el que es passa a, i així, en lloc d'haver de fer copiar / enganxar, copiar / enganxar tot l'HTML, només has d'escriure una vegada, i després pots iterar sobre totes les parades. I això és una cosa comú que desitja fer, quan es té una gran quantitat de dades, és que per a tot en les seves dades, vostè vol fer una cosa similar. I llavors, només recorda, que quan es vol imprimir alguna cosa explícitament en el codi HTML, s'utilitza els dobles claus aquí, però després, quan desitja especificar alguna informació sobre una condició, o al voltant d'un bucle for, que utilitzar el suport per cent. Així que, tornant a la Python codi, pel que explica el que està succeint en el principal ruta, quan hi anem, només mostra tota la missatges, però llavors la pregunta És a dir, com podem realment arribar missatges a la base de dades, que és una mica més interessant. Per tant, en fer clic en el Nou Publicar enllaç, que vam veure aquí, se li redirigeix ​​a aquest formulari. I això és només una simple trucada a la funció render_template, que després passa en el nou missatge en formulari HTML. Així que anem a fer una ullada a això. Així que aquest és bastant simple. Té un formulari HTML simple, que es veurà una mica familiar, basat en les formes en CS50 Finances. I així, s'especifica aquí, l'acció. I aquí, si estàs treballant amb PHP, normalment, seria alguna cosa així com: create.php, però aquí que realment especifiquem una ruta dins del servidor flascó. I així, correspon aquesta ruta per crear la ruta que tenim aquí, que entrarem en en un segon. I així, s'especifica que és un mètode post, perquè volem enviar aquestes dades la forma, i en general quan vostè va a enviar les dades d'un formulari, és possible que vulgueu utilitzar una sol·licitud posterior, només perquè no acabin amb aquest gran, URL difícil de manejar. Però també es pot utilitzar una petició GET, i passar-lo amb enrutament variables, sinó per les formes, és bo a una petició post aquí. I llavors, de la mateixa manera que ho faria amb HTML i PHP, pot especificar aquestes entrades de text, i pot especificar el nom d'ells, i aquest és el nom que aconseguirà passat en l'objecte sol·licitud dins del pot. I després tenim un Presentar botó que diu Post. I aquí, Post és el nom de la botó, perquè és una entrada del bloc, però aquí, post és el mètode de sol·licitud. Així que aquests són la mateixa paraula però en realitat no relacionat. Sí Tornant al codi Python, quan cridem al mètode de crear, notar aquí que pugui en realitat especificar dins de la ruta els mètodes de petició que voleu acceptar, i aquí, puc especificar que Només volen acceptar un mètode Post. Així que, si realment tracte de visitar la pàgina directament, que està utilitzant una sol·licitud GET, m'ho dirà "Mètode no permès." I així, vostè té pàgines, una mena de aquesta pàgina crear, que només sóc realment utilitzant com una manera perquè la forma d'obtenir presentar, pot especificar que no ho fa volen que la gent sigui capaç d'anar-hi directament a través d'una petició GET, o si no vols, per alguna raó, una sol·licitud POST, vostè podria especificar arribar fins aquí, però en aquest exemple, només vol que la demanda Publicar sortir. Així que, quan create_post es digués, quan visitem que a través de la demanda Publicar, cada vegada que vas a un particular, ruta, hi ha un objecte de sol·licitud, i vam haver importar sol·licituds a la part superior, però hi ha aquesta sol·licitud objecte que es passa a, i es pot accedir a les dades del formulari, que automàticament s'omplen quan s'envia una sol·licitud d'un formulari. I llavors, el que penso és genial, es que l'objecte de formulari per obtenir passar en, és només un diccionari de Python que conté, si access-- asique, i molt Em llevo de l'HTML al seu costat, just el que pot haver de com a referència, si, per la els noms que especifiquem aquí per als diferents camps, de manera que el títol i el text, hem a continuació, només ha d'utilitzar els majors d'aquí com índexs en les dades del formulari. Així que és molt pràctic. Llavors diem post.create, que crearà i afegir automàticament aquest nou lloc objecte a la base de dades. I crec que aquesta funció crear aquí és un exemple genial de com poderosa flascó està treballant i amb això, perquè si estigués fent alguna cosa en PHP, pot ser que hagi de fer un munt de validació, vostè hauria de llavors establir una connexió de base de dades, vostè hauria de llavors executar la consulta SQL, però aquí només tenim aquesta bonica post.create, que podem llavors només obtenir la informació l'objecte de la sol·licitud, i després passar-lo a una nova Post que estem creant. I després, l'últim El que volem fer, és redirigir la tornar usuari a la casa. I pel que utilitzar aquest Flascó redirigir funció. I una cosa que no havíem vist abans, era aquesta funció URL. Així que la direcció URL de funció permet es passa en realitat el nom d'una funció en el codi Python, en lloc de la via particular que està. Així que podria tenir la mateixa facilitat redirigida a un usuari per retallar, que enviar-lo de tornada a casa, però usant l'adreça URL de la funció és agradable, perquè si canvia el lloc on estan les coses, així que anem a dir que puc canviar el casa per estar a / home en el seu lloc, això seria tot després tornar / home, perquè en realitat va i mira cap amunt el nom de la funció, i es li donarà una còpia de la URL per això. Així que, més o menys en la supòsit que ets més propensos a canviar quan les coses són, que els noms de les funcions. Es pot utilitzar aquesta realitat agradable URL per a la funció. I una cosa a tenir en compte que és una mica complicat, és que vostè pensa que podria simplement cridar a redirigir a la direcció URL per, però en realitat totes les rutes tenir tornar algun tipus de text i HTML, el que en realitat ha de tornar la trucada redireccionament. En cas contrari, vostè obtindrà una mica invàlida per no retornar una cadena, perquè tots ells han de tornar el codi HTML que realment vol fer. I així, quan es diu a la redirecció, se li redirigeix ​​a la pàgina, però en realitat torna el HTML que necessita per executar aquesta redirecció. Tornar a la pàgina principal. Així que tenim aquests dos punts de vista diferents. Tenim la vista d'inici. O bé, suposo que hauria de dir plantilles. Tenim aquests dos plantilles, la plantilla de la casa que mostra tots els nostres missatges, i llavors tenim aquesta cosa anunci, i en fer clic en el càrrec, es va a una nova ruta dins del pot, però aquest camí no el fa necessàriament tenir una plantilla corresponent. Vostè no té a veure res, però encara es pot tenen aquesta obra va darrere de les escenes. I després et redirigeix recolzar a la pàgina principal. I sens dubte, és fàcil de treballar en alguns CSS més agradable a la plantilla i fer que aquest es vegi molt més agradable, però tota la lògica principal ¿Hi ha al Python. Una pregunta sobre aquest exemple? Sé que hi ha una gran quantitat de coses diferents passant allà, un munt de coses que no havíem vist abans, però com qualsevol cosa. Sí. AUDIÈNCIA 1: Ha de fer res especial per fregar les dades que és Arribant per la forma? Em vaig adonar que acabes de dir "crear" Esdras Zigmond: Sí, així que això és En realitat, això és un molt bon punt. Per tant el dubte era, oi necessitarà comprovar i assegurar que les dades són vàlids, i fer qualsevol tipus de rentat per assegurar-se que és vàlid, ja que com es pot veure aquí, No faré això. Així que anem a veure què passa si he posat una mica blanc. Així, va en realitat només fer un missatge en blanc i completi el DateTime. Així que en realitat, és probable que voler fer alguna cosa com: potser especificar si el títol és igual a la cadena buida, llavors no ho facis. O bé, només ho fan si el títol és no és igual a la cadena buida. Així que no és així en realitat de forma automàtica tenir cura que la depuració per vostè, pel que encara ha de fer això. Sí, bona pregunta. AUDIÈNCIA 2: ¿Ho fa matolls per injecció seqüela? Saps? Esdras Zigmond: Amb sort, peewee fa això. Crec que sens dubte seria un bonic mala biblioteca si no ho va fer. No sé exactament. Hauria de mirar el consulta que es genera. Crec que, si he escrit en un entrada de bloc que tipus de mirada com un atac d'injecció SQL, alguna cosa com això, si això és com un camp de contrasenya o alguna cosa així, vostè pot fer alguna cosa com això. Crec que ho farà encara aconseguir literalment publicat, però crec que peewee fa algun tipus de rentat de les dades abans que realment ho executa. AUDIÈNCIA 1: Aquest camp de text és dissenyat per treure de text sense format, oi? Esdras Zigmond: Sí, ho és. Sí. Així que crec que tot el, així que això és comportament correcte, que ho farà, però crec que peewee esperem que ho fa fer algun tipus de protecció en el seu extrem. I si volia torni a comprovar que, no són formes quan vostè genera una consulta. per la qual cosa no ha de executar directament. Hauria de prendre una mirar la documentació, però en realitat es pot veure el SQL que s'està generant, i fer una ullada a això, i fer assegurar-se que s'està escapant coses. Una altra de les raons per les quals podria que desitgi veure en l'SQL peewee que està enviant, és si les coses semblen anar molt a poc a poc, pots fer una ullada i veure el que és realment fer, perquè és de vegades fàcil d'afegir accidentalment en la forma d'escriure que, vostè pot voler tenir-ho seleccionar tota la base de dades de primera, i després fer alguna cosa d'operació d'ordenació en això, quan realment la intenció de seleccionar un subconjunt. I així, si les coses no són bastant anar a la dreta, és bo fer una ullada a la sol·licitud això és en realitat aconseguir generat. Sí. AUDIÈNCIA 2: Quan vas començar, es posa al port com 5000. Esdras Zigmond: Sí. AUDIÈNCIA 2: És el defecte amb peewee, o és que alguna cosa pot canviar? Esdras Zigmond: Sí, per la qual cosa el port és per defecte amb el flascó. Si l'executa sense especificant res, ho farà automàticament que. Jo crec, hauria duplicar comprovar això, però es pot especificar que en el app.run, Crec que es pot fer alguna cosa així, port = 8080. Anem a donar-li una oportunitat que molt ràpid. Sí, de manera que només pot especificar port = 8080, i s'executarà allà, que crec que, si volia executar en l'IDE, no he provat això, però crec que si córrer al port 8080, probablement seria capaç per accedir al servidor, simplement com si fossis de la pàgina web. Sí, però és fàcil per canviar això si tenir cap tipus de redirecció de ports com coses que vostè necessita fer. Alguna altra pregunta? Sí? AUDIÈNCIA 1: Llavors, vaig veure en el seu models que, com vostè ha esmentat, vostè ha d'especificar el base de dades per a cada objecte. Per casualitat sap, fa que fan que sigui molt fàcil si vostè tenen un munt de bases de dades SQLite que que vulgueu utilitzar per a una aplicació web única, que només pot especificar un grup dels diferents en el seu model? Esdras Zigmond: Sí, em va deixar obrir que fins molt ràpid. Per tant, vostè està dient, si vostè vol tenir un munt de diferent alguna cosa, potser com i els estudiants, per a alguns raó, alguna cosa per l'estil? Sí, així que crec que encara, cada model hauria que encara tenen només una base de dades assignat a la mateixa, però si volia tenir diferents models que han assignat diferents objectes de base a ell, que sens dubte podria fer això. Així que, si em va crear una de nova, alguna cosa com això, i ara aquest és un estudiant que sembla estranyament com una entrada del bloc, Jo podria especificar que el base de dades és igual a db_2 aquí. Per tant, crec que aquesta és la camí principal es pot fer això. Fresc. Alguna altra pregunta? Així que per acabar una mica poc, he aquí alguns recursos, i aquestes diapositives es publicaran en línia el que realment pot arribar a aquests enllaços. Els millors recursos són realment la documentació per Flascó i Peewee si mateixos. Estan escrits molt bé, crec. Així, el lloc flascó és aquí, i tenen un tutorial d'inici ràpid que Caminarem per similars coses al que vaig caminar per, però si vols qualsevol tipus d'opinió de les coses que em vaig apropar, o vostè va pensar que jo vaig explicar alguna cosa d'una manera confusa, tindran exemples similars allà. Peewee té documentació, i tenen un tutorial d'inici ràpid que va més dels paràmetres principals que es vol utilitzar. Així, les coses que van parlar amb els valors predeterminats úniques, i que especifiquin, els diferents tipus de camps que es pot utilitzar, els que tot estaria allà. A més, si vostè té preguntes sobre peewee, i que els publiqui stackoverflow, el tipus que va fer peewee realitat segueix i respon les vegades. Si vostè té una pregunta, és d'esperar que serà capaç de respondre-hi, perquè va escriure tot l'assumpte. Crec que això és tot el Volia cobrir. Gràcies per venir.