[Música tocando] EZRA Zigmond: Ola, todo o mundo. Grazas por vir hoxe. Este seminario é "Python Web Apps con Flask ". Entón, eu vou estar falando un pouco de por pode querer usar Flask para facer aplicacións web con Python, en oposición para algúns outros cadros aí fóra, como Django, que é o máis ben coñecido. O subtítulo é "e peewee ", que é algo imos falar sobre como para interactuar con bases de datos SQL. Isto fai moi agradable. Entón, aquí é só un rápido resumo do que quero para pasar por riba. Entón, en primeiro lugar, só unha foto que será de inicio rápido, que é como comezar todo configurado no seu ordenador. Eu vou estar demostrando esta na miña máquina local Mac, só porque é aí onde eu fixen iso antes, eu estou máis cómodo con iso, pero este é sempre posible sobre o CD50 IDE. Entón, despois diso, quero introducir o que é Flask, e convencido-lo que ten que usalo en primeiro lugar. Entón, eu vou dar unha rápida exemplo do que pode facer en Flask, un exemplo rápido do que se pode facer en peewee, e entón eu vou amosar-lle un máis aplicación exemplo completo que engada que pode percorrer xuntos. E, a continuación, finalmente, en o último foto, eu teño algúns recursos que mira en en liña para obter máis información. Esta non é unha solución completa tutorial de como usar Flask. E eu vou esperar a saír moito tempo para preguntas. Calquera asistir localmente, só como, berrar no medio se ten algunha preguntas. Entón, material de instalación rápida, se quere seguir, ou se quere obter este Se na súa propia máquina, Eu vou estar usando Python 2.7.10. Flask fai o traballo con Python 3, pero me gusta usando Python 2, porque hai algúns paquetes Python que Non traballamos con 3 aínda. Se ten instalado PIP, que é un xestor de paquetes Python, Eu creo que se o Python é maior que ou igual a 2.7.9, tes iso xa instalado, é super fácil de instalar estes paquetes. Pode non instalar PIP Globo, PIP instalar peewee, Normalmente ten que correr sudo só de xeito que os permisos traballar fóra. E, se está a usar un Super versión antiga do Python, Recomendo actualizar o seu Python, ou usando EasyInstall instalar PIP. Así, a seguinte pregunta é, cal é Flask? E eu creo que, en primeiro lugar unha pregunta razoable Quedei imaxinando por un longo tempo é, o que é unha aplicación web? Porque esa é a palabra que eu pensas que vai arredor moi que realmente non sei. E eu creo que a mellor exemplo que unha aplicación web é, realmente é CS50 Finanzas, onde non é realmente só un sitio web, pero é algo que podería clasificar de interactuar con. Existen contas de usuario e todo tipo de cousas distintas. Entón, onde exactamente chamar a A liña entre o que é un sitio web, eo que é unha aplicación web, é unha especie de arbitraria, pero eu creo que a idea, é algo máis que un sitio e é unha aplicación útil. Entón, Globo é unha estrutura para facer aplicacións web utilizando Python. E espero que, ata finais deste, vou convencido-lo que realmente pode escribir algo como CS50 Finanzas utilizando Python, que como moito mellor que PHP, persoalmente. Entón, é Flask, que eles chaman dun microframework, polo cal, que significa que é moi simple, pero extensible. Entón, el ten só o que precisa, pero se quere máis recursos, é doado traelos. Pero só porque é un microframework, non fai significa que é só para pequenos proxectos. Eu teño un enlace que di aquí que Obama usou Flask en 2012 para a súa campaña sitio web, que esperamos, é algo dun endoso. Pero a cousa que eu Realmente me gusta sobre Flask é que, realmente non fai calquera tipo de decisións por ti. Só porque somos falando de aplicacións web, Teño que comparalo con Ruby on Rails e Django, sendo que ambos son grandes cadros, pero ambos fan suposicións sobre como quere interactuar con bases de datos, como quere presentar o seu puntos de vista, e son definitivamente bos aspectos a iso. Por exemplo, Ruby on Rails ten este sistema de rexistro activo, que é un moi bo forma de interactuar con datos, pero se quere usar Ruby on Rails, está tipo de amarre en que. Pero con Globo, como eu vou amosar-lle con peewee, pode usar calquera tipo de base de datos que quere, e pode só tirar que en como unha extensión en Flask. É por iso que realmente como Flask, é que non faga suposicións para ti con base en cousas que non precisa realmente. Entón, por que ten que usar Flask? As vantaxes son, só ten realmente os principais recursos construído para el o que necesitas. Así, non se preocupe entender unha morea de cousas que realmente non precisa. Non ten que ten que se preocupar sobre como desactivar recursos que realmente non precisa. E, como xa referín, é super fácil de engadir, a prolongación das cousas que necesitas. Algúns deles, Globo ten seu propio soporte para el. Polo tanto, hai algo chamado Flask admin, que reflicte o administrador panel que ofrece Django, o que lle dá unha forma visual agradable para administrar o seu sitio. Pero, de novo, se está facendo algo simple, probablemente non precisa dun gran administrador panel, entón eu creo que é super agradable. E son as desvantaxes, isto tes menos enerxía para fóra da caixa. Entón, cando abre por primeira vez Flask, e no seu programa Python, escriba desde Flask import *, ou o que quere, non exactamente obter todos as características que pode querer. E entón tes que máis explicitamente lista das características que quere. Entón esta é unha desvantaxe, pero eu creo que para a construción de pequenos web aplicacións como eu vou estar mostrando ti, iso non é realmente un problema. E o que é o último debería dicir, o que é un erro de dixitación, é que hai menos estándar convencións de como usar Flask, só porque non hai como moitos as persoas que o utilizan profesionalmente en comparación con Django. Entón, se ollar algo así como: "como fago x" en Django, probablemente vai atopalo. Hai un bo deseño patróns que pode usar, pero con Flask, é tipo de seguir o seu propio camiño, só porque é un moi pequena biblioteca. Polo tanto, estas son o desvantaxes, pero creo que que aínda é unha boa biblioteca de usar. Entón imos saltar directo para Flask. Este é sempre non vai para ser un tutorial completo, pero é para dar unha idea de como estruturar as cousas, e así vai se sentir cómodo fóra e mirando para a documentación e descubrir máis. Entón, deixe-me abrir un realmente exemplo simple a primeira vista, e amosar-lle o que iso parece, e entón nós imos decompô-lo un pouco máis. Polo tanto, este aquí, deixe-me facelo funcionar. Entón, agora teño o meu programa en execución. Vou abrir Safari, e está correndo no meu servidor local. Entón, eu estou indo só para facer esta grande. Pero localhost: 5000 E así, agora, todo isto fai é, cando visitar o sitio web, el imprime "Ola Globo," o que non é super útil, pero eu creo que é legal que neste pequeno arquivo aquí, temos un servidor web rodando que está a imprimir algo. Entón, imos realmente ollar o código para un segundo, e decompô-lo un pouco. É o tamaño bo para todos aquí? Entón, espero que, está un pouco cómodo usando Python. Estou asumindo que podemos ollar para o Python e ler a través del. Se ten dúbidas sobre calquera cousa, eu tamén podo pasar por riba diso. Así, a primeira liña é, de Globo, nos importan, Globo cun capital "F" que é unha especie de todo o características clave que precisa. Sempre que está escribindo un arquivo e utilizando Flask, vai querer importar que, só porque que ten todas as cousas principais. A seguinte cousa que facemos, é que chamar esa función Globo, só para crear un obxecto aplicación, e está sempre vai querer facelo. E, a continuación, para abaixo para a ir fondo rapidamente, esta parte aquí é, 'if_name _ == "_ main_" ", que é unha especie de convención Python. Entón, iso só será executado se executar o ficheiro directamente usando Python. Logo chamamos app.run, que será realmente comezar o app vai. Entón, esa é a estrutura principal que terá en calquera aplicación Flask, é que vai ter esa app = Flask (_name_) e, a continuación app.run. Así, as dúas cousas que eu teño aquí, son o que chamamos rutas. Entón, imos falar sobre reenvío de un pouco máis. Vou volver ao diapositiva. Así, o máis fundamental Concepto en globo é reenviar. E é a idea de que asignar funcións en Python para enderezos particulares na súa páxina web. Así, sempre que sexa para crear unha nova ruta, usa esta @ app.route función decorador. Entón, se non está familiarizado con decoradores de función en Python, é que este concepto Permite sacar unha función e preto-lo con outra cousa. Entón, realmente, o que fai este decorador, é que leva a función abaixo del, e engade máis información para el, pero o que realmente Flask non facer isto acontecer non é super crucial, pero o que é importante, é que, antes do percorrido, poñer isto @ app.route, e, a continuación, a dirección do percorrido, de xeito que a barra é o que nós vimos cando pode abrir a páxina web. Entón esta é a páxina de inicio. É só a ruta barra. E entón tes esa función. O nome da función pode ser o que quere. Non ten necesariamente ten que ver coa ruta. E, a continuación, calquera que sexa retorno da función, a función debe devolver unha cadea. E esa secuencia pode contén HTML ou calquera cousa, e que é realmente o que terá volveu para o seu navegador web como HTML, e ha procesar iso. Polo tanto, este é o mesmo código que foi o exemplo que só foi, por iso, cando visitar barra, el chama unha función Ola mundo, que volve só unha cadea, Ola Flask, e que queda impresa na pantalla. Polo tanto, hai outro exemplo, que é, cando visita / Ola, el imprime Ola Palabra, que que realmente dicir, Ola Mundo, pero imos finxir que foi intencional. Entón, imos tirar o real rápido. Entón, se ir localhost / Ola, agora vai imprimir outra cousa. Entón, iso é só un rápido exemplo de como pode crear dúas rutas diferentes. Entón, por agora este non é super útil, non hai un lote enteiro que podes facer, podería só facer todo isto con tendo diferentes páxinas HTML, e cando visita un determinado páxina só leva a páxina. Entón, imos ver un pouco máis cousas útiles que podes facer. Entón, unha cousa que pode ter notado no exemplo que eu puxei anterior, é que eu tiña app.run (debug = True). E así, o que iso argumento de depuración fai, é que cando realizar o seu servidor web, cando está na súa aplicación, se cambiar un arquivo, será actualizar automaticamente o servidor. E para que non tes que realmente restart Python, que é super útil. Podo amosar iso. Déixeme puxar arriba o meu código co erro de dixitación na mesma, e finxir que typo foi posto alí intencionalmente para fins instrutivo. Entón, imos engadir esta de volta. Entón, agora di Ola Mundo. Vou gardalo. E se nós tiramos ao o terminal, vai dicir que está reiniciar, porque detectou un cambio, e así agora cando recargar a páxina ha imprimir a cousa correcta. Entón depuración é super útil para iso. Ademais, se ten calquera tipo de accidente, para déixeme facer esta falla de aplicación por telo non voltar unha cadea. Entón, imos só telo Ningún volver por algún motivo. E entón cando visitar esta páxina, ela só vai fallar, pero o servidor non só curso, que de feito, dálle unha volta super útil trazo de todo o que deu errado. E o que é moi bo, é que en calquera paso nese trazo de volta, pode abrir un interactivo shell aquí, e tipo de imprimir o que variables que quere dar un ollo. E así a depuración é realmente útil para descubrir o que está a suceder co seu servidor, no canto de só vê- algo en PHP como un 500 interna erro do servidor, que é super inútil. Unha cousa a ter en conta, é que se pór o seu programa en liña polo que é visible para o público, nunca quere saír en modo de depuración, Porque a xente pode realmente usar este consola que eu mostrou que executa código arbitrario. Así, poden imprimir como calquera códigos secretos que ten alí, poden ollar exactamente como o seu sitio funciona. Entón, é realmente útil para o exame, pero sempre asegúrese de tiralo antes publicas algo en liña. Entón, cando está usando algo como PHP, hai esta idea que pode pasar información entre as páxinas web poñendo a información efectivamente no URL, que é unha proposta GET, pero na botella, pode, en realidade, facer algo máis ou menos como que, por ter un percorrido que posúe unha variable como parte do mesmo. Entón, se ollar para este exemplo na pantalla aquí, temos unha ruta que é ('/ Ola /'), e así, se visitar / Ola / algo, algo que vai realmente estar chea variábel nome. E teña en conta que a función que vén con esa ruta ten que tomar o parámetro nome, polo que vai realmente son pasadas para a función. E entón, cando está Dentro desa función, pode tratar isto como Python unha variable normal, e así, a continuación, ha imprimir Ola, e cubrirá o nome usando algunha formato cadea. Entón, para engadir partes variables para un enrutamento, usa o soporte de ángulo de reserva. E incluso pode utilizar o que se chama un conversor. E así, se pór isto anotación co colon, pode especificar que é un int ou un float, ou camiño, e ha converter automaticamente ese. Tamén pode facer a conversión dentro da función Python, só usando un elenco, pero ás veces se Quere garantir que é un int, pode pór que regra de conversión alí. Entón, imos puxar arriba un exemplo dalgunhas regras variables. Así, aquí, esta posúe a mesma básica estrutura coa importación de Flask Flask, o app = Flask (_name_), e, a continuación, el está en execución ao final. Temos estes dous diferente Rutas variables aquí. E a primeira, é o que eu mostre na corredías, a cal era que el só ten un nome de secuencia e só pode imprimir Ola, Nome. E entón, a segunda un usa a conversión. Entón, iso vai convertelo lo automaticamente para un int, e, a continuación, o dobre do int, e imprimir iso. E, non facemos calquera tipo de conversión dentro del porque Flask coida diso. Entón, imos comezar esta carreira. Cando ten un Flask aplicación en execución, Podes controlar-C fóra del para deter o servidor en execución. E entón eu vou correr as variables. Entón imos para localhost / Ola / Esdras e Afortunadamente, iso vai dicir Hola para min. Por iso, tomou no meu nome, a variábel ruta, e encheu-lo aquí. Entón eu tamén vou amosar un rápido exemplo da duplicación. Entón, se vai a / double / 3, ha imprimir 6. Polo tanto, este tivo o coidado de a conversión a nós. Entón, tamén pode facelo con float, e algo especial, se precisa especificar algo un camiño, que permite que aceptar barras, pero que xeralmente non debe ser un problema. Ata aquí, aínda teño só foi volver cordas, o que non é moi interesante. De feito, poderiamos volver cadea HTML literal. Así, no código podemos introducir algo como o tag-b para facelo en negra, pero a maioría do tempo non realmente queren estar escribindo código HTML no seu código Python. Está realmente confuso, e non é un bo momento. Flask permítenos separar o HTML para o que se chama Modelo, e por iso, se está a pensar en termos de modelo MVC que está familiarizado coa, esperanza, de traballar con CS50 Finanzas un pouco, pode pensar dos arquivos Python como máis Controller, onde están interactuando con o que quere modelo de datos que pode ter. E entón eles están chamando de Visitas e pasando información para que Vista para cubrir a información HTML que necesita. E o que chamamos eses Vistas Modelos están en clase. Entón Flask usa outro Python módulo que será automaticamente instalar cando se instala PIP Botella chamado Jinja, que para engadir estes anotacións ao HTML que ve na pantalla, que permite poñer en cousas como condicionais, e loops para HTML. Polo tanto, parece un pouco como como Pode utilizar o PHP nun ficheiro HTML, pero isto é só cando o Flask servidor serve o arquivo HTML, será executado este motor de templates e analizar a través deste e cubrir as cousas en. Entón Flask ten unha función render_template que se pode ver no fondo aquí. E así, cando visitar esta páxina, el tornaría este modelo hello.html, e logo, enche esta páxina HTML. Entón imos realizar este verdadeiro rápido, e ver o que parece, e entón eu vou pasar por un pouco en maior detalle. Así, os seus modelos van para ir nunha carpeta de modelos. Que vai mirar automaticamente no Templates cartafol para este modelo. Entón, imos abrir iso. Entón, eu vou facer o exemplo Templating. Entón, se eu ir / Ola / Ezra, ten esa horrible, tag marquesiña detestable que engada en. Moi bo, moi dinámico. Eu son un gran fan. Pero o que acontece se Só ir, / Ola? Entón, el só di Ola Mundo. Non pasarlle un nome, e encheuse o automaticamente. Entón, imos ver como o fixo, e como podemos librar desa marquesiña quizais. Entón, aquí, este é o tipo de un exemplo interesante de, se está familiarizado coa forma como chave declaracións traballar nun idioma. Dicir que este é tipo de como, este tipo de caída, a través, onde realmente anexa dous diferentes rutas para a mesma función. Por iso, achegar o / Ola ruta e o Ola / nome da ruta / para Ola, e nós especificar using-- Python permite que especifique función arguments-- estándar polo que, se non hai ningún nome, para se somos a só / Ola, ha filtrar automaticamente para nome é igual a None. Así entón, nós facer o Molde con name = nome, polo que vai pasar no parámetro nome igual a este parámetro función nome, para o modelo. Isto aínda non explica como é decidir se desexa imprimir Ola Mundo, ou imprimir o meu nome. Entón imos realmente ollar no propio modelo, e ver onde iso está a benvida. Así, dentro deste modelo, nós realmente ten algunha lóxica condicional, que algunhas persoas irían argumentan, ten, en realidade, non debe ter unha morea de condicional lóxica dentro do seu propio modelo. Debe ser máis dentro do Controlador, pero para este exemplo é algo moi pequeno. Entón, aquí, imos comprobar se o nome, entón o nome non é igual a ningún, un nome é, en realidade, transmitido, entón imos dicir Hola, nome co cabeceira e da marquesiña, todo isto HTML normal, se non, iremos imprimir Ola, mundo só normalmente. Entón, algunhas cousas a ter en conta aquí sobre como formatar a modelaxe, é que, todos estes instrucións condicionais, tipo de como como nós PHP cando quere introducir algúns PHP usa a non ser que pregunta marca, é unha especie de análogo aquí coa {%. Entón, aquí temos o noso código condicional. E entón, cando realmente quere literalmente avaliar algo, e de impresión Lo á pantalla, utilizar as claves dobres. Entón, aquí están as claves dobres, e, despois, especificar o nome, dentro dese, ha avaliar para o nome da variable, que foi aprobada en do facer función de modelo, no canto de só impresión fóra, nos libramos deles, sería só imprimir a palabra "nome". Entón, iso é algo que atente para. Polo tanto, outra cousa a aviso é que, cando quere usar o función render_template, nós realmente temos que importar Lo explicitamente a partir Flask. E este é un exemplo de a modularidade do Flask, que non ten que importar cousas que non precisa. Pode só traer o Funcións que, en realidade, precisa, que é ás veces agradable, para que non ten que ter todas estas funcións sentando-se en torno a que non está a usar, pero tamén, se esqueza que Debe importar render_template, probablemente vai recibir un aviso que vai deixar que saber sobre iso. Entón, que é de modelos. Entón, nós amosamos como facer páxinas web sinxela, e engade un pouco máis lóxica para que, en termos de enrutamento variable. El permite que fai cousas distintas en base a URL que vai a, e tamén, a continuación, dar- HTML un pouco máis de sentido en termos de como quere procesar as cousas. Non ten que poñer todo seu HTML no seu Python, pero para practicamente todas as aplicacións web, vai querer algún tipo do modelo de datos a el asociado. E así tradicionalmente, este sería ser algo así como unha base de datos SQL. E pode só interactuar directamente con SQL. Python ten, creo que se chama. SQLite 3. Pode só importar SQLite 3 e realizar consultas SQL directamente, pero eu non sei sobre ti, pero realmente non me gusta, só, escribindo consultas SQL. El tende a estar realmente longa e complicada. E así, algo que Eu gusto de usar é o que é coñecido como un ORM, que é un cartografía obxecto-relacional. E o punto dun cartografía obxecto-relacional, é que hai dous diferentes formas que pode pensar en bases de datos. Así, o exemplo que Profesor Malan normalmente utiliza en clase, é a táboa de Excel, onde tes esas liñas e esas columnas, e iso é realmente útil para como é representada na SQL e como interactúa con el, pero outra forma que é, en realidade, útil para pensar sobre iso, ás veces, é en termos de clases e obxectos. Entón, en vez de pensar de cada táboa como tendo esta liña que ten certa información, pode, en realidade, pense nisto como cada mesa é unha clase, e despois a cada sesión de clase ten certas propiedades. Así, neste exemplo, as instancias de a clase son as liñas da táboa, e, a continuación, cada propiedade faría ser unha columna na táboa. Así, o ORM que me gusta usar chámase peewee. Realmente pequeno, unha especie de globo. Eu creo que van ben xuntos, pero hai unha morea de outros ORMs que pode usar. A máis popular é unha coñecido como SQLAlchemy, e eu non me lembro por que eu orixinalmente escolleu peewee sobre SQLAlchemy, ou quere dicir porque creo que é o mellor, pero nós só estamos indo a usar este un, porque eu sei como usalo. Entón, unha pregunta é, por que ten que preocuparse usando un ORM, no canto de só directamente escribir consultas SQL? E eu creo que o mellor caso, é que realmente non ten que escribir consultas SQL. É moito máis doado, como eu vou amosar-lle, para facer cousas como selección, inserción, eliminación, especialmente a creación de táboas. É moito máis fácil escriba unha estrutura de clase, que é para estruturar un Crear Declaración de mesa, pero unha cousa ser consciente de, é que o ORM, que vai tentar o mellor para descubrir o que o máis consulta SQL eficiente sería, pero ás veces erra. E especialmente se é traballar con unha gran base de datos, pode notar que unha consulta que deben ser executados rapidamente, Está realmente levando máis tempo. E se ollar baixo o capo co quão o ORM é interpretar isto en SQL, podería estar facendo algo realmente ridículo, só porque especie de gesticulou súas intencións mal. E, houbo momentos nos que Tiven que substituílo, e só realizar os meus propios consultas SQL, só porque foi analizar de forma estraña. Así, hai algúns sobrecarga, só no camiño que compila o seu declaracións abaixo en SQL. Entón, imos ollar super rápido en un exemplo sinxelo dun modelo de datos que pode usar. Entón, esa é código Python, e por iso a primeiro que quere facer é de peewee import *. Así, a diferenza Flask, onde ten todos estes módulos individuais, e quere importar Flask, e escribir un modelo, e algúns outros que veremos máis tarde, a partir de peewee, pode simplemente descargar todo, porque é un moi pequena biblioteca. Entón, o primeiro que quere facer, é realmente crear este obxecto de base de datos. Entón, ten db = SQLiteDatabase, e, a continuación, o nome do seu banco de datos. E iso vai realmente crear un obxecto de base que pode interactuar con, con peewee. E, a continuación, temos a real modelo que queremos crear. Así, a táboa que queremos crear. Así, dentro peewee, cada clase ten súa propia táboa de dentro do seu banco de datos. Así, todos os graos herdan o modelo de base, e do modelo de capital M é algo que está definido no peewee. Así, todos os seus modelos deben herdar como o seu máis alto superclasse, eles deben herdar da modelo, pero o que é moi legal, é que realmente pode ter o seu modelos herdar un do outro. E unha gran parte do tempo, o seu modelos de datos non necesariamente facer unha xerarquía de herdanza agradable, pero momentos nos que eles fan, é moi bo, porque ten o modelo inherente un do outro. Así, definimos esta clase 'estudante', que herda un modelo, e que posúe tres propiedades. Ten un ID, que é un PrimaryKeyField, que é algo que se inclúe por peewee, nome é unha CharField, e unha nota é unha IntegerField. Polo tanto, este pode ou non ser como CS50 en realidade, almacena todos notas dos alumnos. Non é, pero iso é como eu faría iso. E entón el ten, dentro esta clase, e iso é algo que podes facer con Python, pode que clases noutras citas. E iso é algo o que se esixe por peewee. Entón, esa clase Meta, ten para especificar que a base de datos é igual ao obxecto que creamos anteriormente. E iso di que arquivo é esta táboa realmente vai ser contido no. Entón, iso é algo que ten para facer a todos os seus modelos. Vostede só ten que especificar dentro desta clase Meta ese banco de datos é igual a db. Entón, o que eu costume facer, se eu tivera unha morea de diferentes modelos, é que eu teño unha base de modelo, que eu costume só chamar "modelo básico" que ten a clase Meta, e define a base de datos igual a db. E entón todos os meus modelos posteriores herdarán a partir desa clase base. E entón eu non teño que preocupar-se sobre a definición da clase Meta. Así, cando este realmente queda compilado abaixo nunha instrución SQL, parece que esa cousa desagradable abaixo aquí, "Crear táboa carteira de estudante enteiro, "O que quere. E, eu creo que é máis curto, esta consulta SQL aquí mesmo, pero se ollar para esta clase aquí podes ver exactamente o que está a suceder. Podes ver que tipo de campos existen, o que están son chamados, e así, eu creo que mirar para este código Python é moito máis lexible que intentando escribir esta procura de SQL. Así, a fin de efectivamente usar a base de datos, temos que conectar a el dentro Python. Entón, eu costume escribir unha función chamada initialize_db que fai dúas cousas. Leva na base de datos obxecto db e conecta a el, que só abre up sección para a base de datos. Se vostede está só executando aínda sitio na súa máquina local, non é un super gran cousa para preocuparse sobre a conexión e desconexión, pero se está executando lo nun sitio web, quere estar seguro de que, cando un usuario conecta a el, cando se pechan para fóra o sitio web, eles desactivar para que Non temos unha morea de persoas conectadas para o seu banco de datos dunha soa vez. E entón, cando conectar co banco de datos, que quere chamar db.create_tables, e incluír os modelos para o que quere para crear táboas. Entón, aquí, eu só quero crealo para ese estudante. E entón, o que é importante, é especificar segura = True a maioría do tempo. Entón, o que esta declaración vai facer, é que crea táboas para a modelo do alumno, pero só se esa táboa non ten xa foi creado. Iso é o que indica o cofre. Por iso, non substituirá súa táboa existente, só pode crear un novo mesa se non hai ninguén alí. Entón, vostede podería simplemente crear as táboas dunha vez usando SQL. E entón ten que estar de base de datos alí, e, a continuación, conectar-se cada vez máis, pero normalmente é bo só para poñer no presente convocatoria create_tables, de xeito que, se nunca eliminar seu base de datos cando realizar o seu web aplicación de novo, ha recriá-lo. Así, só asegurarse de que seguro se especifica para ser verdade, ou vai atopar os seus datos só ficando cada vez derrotado. E entón, pode só chamar initialize_db para establecer unha conexión, e crear táboas se é necesario. Entón, o máis común que vai querer facer, ou unha das cousas máis comúns, é realmente introducir cousas en base de datos. E así, en vez de ter para escribir un INSERT INTO indicación con todos Os valores especificados, realmente pode chamar función na clase estudantil. Entón, cando se crea unha clase que herda de modelo, ten este método crea. Entón, fai clase name.create, e especificar os parámetros que quere pasar. Entón, se eu queira engadir algúns alumnos ao noso exemplo libro de notas CS50, Vou poñer en David, que ten un moi boa calidade, ten unha 95. E eu, que non está facendo tan ben en CS50, eu teño un 50. E así, a cousa agradable sobre o que esta función fai crear, é que volve a instancia, é o liña, que creou dentro da táboa, e así entón almacenar iso nun variable, e traballar con el máis tarde. Pode cambiar ao redor, que Vou amosar un exemplo de. Repare que eu non fixen debe especificar o ID, porque unha vez que é o PrimaryKeyField, el será automaticamente incrementa-lo se non especificalo lo. E, de feito, probablemente non debe especificalo lo, porque pode accidentalmente espancar ID doutra persoa. E quere facer Asegúrese de que é único. Así, en realidade, o máis cousa común que quere facer, pode ser a elección da base de datos xa que ten unha morea de información alí. E así, se quere comezar todo, de xeito que o equivalente da estrela seleccione declaración de estudantes, sería só student.select. E iso lle vai dar de volta unha matriz con toda a estudante obxectos nel que iterado sobre quere. Podes facer as cousas fóra. E a maioría das veces, ten non só quero facer selecto, realmente quere especificar algo. E así, pode cadea Xuntas, estas chamadas de función, como o xeito no que faría cadea en conxunto as declaracións en SQL. Para que poida facer student.select (). Onde neste exemplo. E entón, pode especificar as condicións, só usando normal do Python Booleans para comprobar as cousas. Entón, neste caso, quere limitar o que está seleccionando para, onde student.grade é igual a 50, e student.name é igual a Ezra, de xeito que só me vai facer iso. E teña en conta, un realmente cousa sutil aquí é que, se quere especificar un e / ou un ou e / ou, en Python, usaría normalmente, Creo que a palabra "e" de feito, pero aquí usa o único e comercial, que adoita ser un operador bit a bit, pero, neste caso particular, só a forma peewee fai iso, usa o único E comercial para especificar "e". Isto é algo que I se mesturan moi, pero non vén para arriba que moi na práctica. E entón, cando ten todo os estudantes fóra da base de datos, despois de ter feito escoller eo seu desgaste ou calquera outra cousa, pode usar un loop foreach, só como normal en Python, con calquera tipo de iterador ou con calquera tipo de matriz. Para que poida facer, para s en student.select (). whe re (Student.grade <75), e por iso esta vontade iterado sobre cada alumno na táboa cuxo grao é inferior a 75, a cal neste caso, aínda é só comigo. E, a continuación, podería facer algo dentro que loop, como enviar-me un email e realmente dicir virar nos meus Conxuntos de problemas. Entón, algo que poida facer, é que é moi fácil para actualizar liñas dentro da táboa. Entón, lembre-se de volta para aquí, seu cando inserido, Peguei o valor que se retornado por student.create, e eu lle atribúe a nome chamado Ezra. E agora, pode cambiar o valores dentro desa instancia, así como faría un clase normal en Python. Así, pode definir ezra.grade = 95 e que ha actualizar a copia local, pero se o quere cometer ese cambio de base de datos, ten que chamar ezra.save, para que chamou o método .Save na instancia. E agora, eu mudei correctamente meu propio grao dentro da base de datos. Así, entón imos dicir que eu pego cambiando miña nota na base de datos. Profesor Malan é probablemente vai querer me excluír da clase, e así pode chamar o .delete método de instancia só nesa cousa. Entón, se quería ir de volta a este ciclo aquí, e, de feito, no canto de enviar un correo todo dos estudantes cuxo grao é menos de 75, que quería borralos, dentro deste ciclo que podía chamar instancia s.delete. E a última cousa que quere facer, sempre que establecer unha conexión, e está feito co seu traballo, que quere chamar db.close, onde é que base de datos db objetar que tiñamos antes. E quere estar seguro de que todo queda pechado de fóra. Legal. Entón, agora, eu teño unha aplicación de exemplo. Eu tipo de prefabricados todo só de xeito que non haberá ningunha codificación vivo erros, pero podemos camiñar a través el e ver como poñer Flask e peewee xuntos, e facer unha aplicación sinxela. Eu chamo-CS50 divertido, e é unha especie de plataforma de blog simple. Entón, en primeiro lugar, eu vou executa-lo e mostran o que parece, e entón podemos ollar máis para o código. Ok, entón imos realizar este. Cool, eu vou facelo un pouco menor. Non é moi bonita, só porque Eu non fixen unha morea de CSS, pero o que fai é, ten ese banco de datos de mensaxes de blog, e pasa por todos los, e vai amosar-los na páxina da orde do máis recente. E así estes son só algúns artigos que tiña gardado na base de datos. Polo tanto, se queremos crear unha nova post, podemos ir para engadir un novo post, e podemos introducir o título do post, entón algo como, seminario CS50. Wow, realmente gusta do seminario. Legal. A continuación, prema post, e vai redireccionándoos-lo de volta para a páxina principal, e entón vai ver que a última mensaxe foi engadida. E aínda temos todo que alí. Entón, agora, imos percorrer todo o código para ver como iso é aplicado. Entón, eu creo que o primeiro que imos Bótalle un ollo, é en realidade os modelos. Unha gran parte do tempo, cando está designado algo, quere pensar primeiro sobre como está indo para representar os seus datos, e, a continuación, deseñar cousas ao seu redor que, para que todo ten sentido. E iso é realmente como eu fixo cando estaba facendo iso, Eu sentei e pensei, o que quero nun post. Entón, aquí temos a mesma estrutura que estaba mencionando anteriormente, onde facemos db = SqlDatabase ('posts.db'). En realidade, probablemente non quere código ríxido en bases de datos é o seu nome. Isto probablemente debe ser un parámetro que está almacenado nalgún lugar, quizais nun ficheiro de configuración, pero en un pequeno exemplo como este, non hai problema en codificar que en. Entón, agora, temos esa clase Post, que herda a partir do modelo base. E ten, de novo, o ID = PrimaryKeyField. En realidade, se non especificar, se realmente me librei diso, peewee entón imos coidar creando automaticamente o campo ID, e el será automaticamente facelo un PrimaryKey, que Creo que é moi bo, porque normalmente, iso é algo que quere ter, pero me gustaría poñelas en particular, só para que eu lembre que está aí. Pero se non especificar que, que vai estar alí automaticamente. Así entón, eu teño unha data que é un DateTimeField, e todos estes diferentes campos, se ollar a documentación peewee, el lle vai dar unha lista dos diferentes tipos de campos que pode usar. Para a maior parte, é análogo para o que vería en SQL. Polo tanto, hai unha CharField, un VarCharFields, TextFields, que son por moito tempo textos, como un post de blog potencialmente, DateTimeFields, DoubleFields, FloatFields, todas as cousas así. E pode pasar noutros argumentos para el, o que eu non especificou aquí. Digamos, por exemplo, non quere permitir que dúas mensaxes de ter o mesmo título, pode especificar algo así como única = True, e iso é só un parámetro adicional para O campo que cando compila-lo para abaixo para o SQL, que precisará que ten que ser único. Tamén pode especificar algo non nulo e todas as outras cousas normalmente fai en SQL. Entón, este é un ben simple modelo que ten a data. Observe aquí, dentro do DateTimeField, I especificar que o defecto é. I especificar que sexa datetime.datetime.now, debido á forma que iso queda avaliada, que realmente valora o datetime.now cando el insírese na base de datos. Coido que, eu tería para comprobar iso, pero se fixo algo coma isto, entón sería realmente avaliar que unha vez, e, a continuación, o datetime sería sempre a mesma. Así, só se está facendo algo con datetimes, comprobe que está avaliando cando de feito, insírese, ou pode ser confundido. O título é máis que unha CharField, que hai son máis argumentos pode pasar especificando exactamente canto tempo quere que sexa, pero aquí, iso realmente non importa. E texto será o texto de todo o post, e que vai ser un TextField só porque quere para permitir que sexa un tempo moi longo cadea. Entón temos esta Meta Orde que especifica que queremos que a base de datos onde iso está realmente aberto para sendo obxecto db que temos aquí. Ea última cousa que temos aquí, é só esta función que imos usar o noso programa principal para iniciar a base de datos para conectar co Lo, e, a continuación, para crear a táboa Post. Agora, imos ollar para o propio programa principal. Entón, este é un bo pouco máis que os que xa vimos antes, pero espero que non moi malo. Entón, deixe-me estender isto. De acordo. Entón, teña en conta o principio e eu importados unha morea de outras cousas Botella de que non temos realmente visto antes. E, esperamos, podemos pasar por cada un destes, un por un e falar un pouco máis sobre los, clasificado por exemplo. Entón, nós temos o Flask, eo render_template, que vimos antes, este obxecto da solicitude, que vai vir cara arriba cando nós miramos como a forma que eu estaba mostrando realmente funciona. Redireccionar, que permite redireccionar de volta do Crear Nova Mensaxe regresar á páxina de inicio orixinal, e logo URL, que é algo que o deixa descubrir onde o o sitio web dunha determinada páxina é. Así entón, o seguinte cousa que fago, é a importación I toda a información a partir dos modelos arquivos que estabamos só mirando. E, si. Entón, algo novo que vén ata cando está lidando con, especialmente bases de datos, é que pode especificar unha función que se chama antes cada solicitude, e función que recibe chamado despois de cada solicitude, mediante esta solicitude función decorador app.before. E para que isto pode obter executado sempre que esta función é. Isto non ten que ser chamado antes da solicitude, pero xeralmente é algo sensato para chamalo. Pode especificar calquera función quere chamado alí, entón eu doulle esta initialize_db función que tivemos de volta nos modelos ficheiro, polo tanto, antes de cada solicitude, ten quere conectar á base de datos. Existen dous diferentes formas que pode facelo. Pode fazerapp., I creo que é after_request. E a diferenza entre after_request e teardown_request, é que after_request só ocorrerá se a solicitude foi realmente válido. E así, só se o solicitude foi exitosa, se nada dese mal, pero teardown_request acontece no caso dun exitoso solicitude ou no caso dun erro. Entón, normalmente, quere para usar teardown_request, a menos que quere facer algo, especialmente diferente no caso dun erro. Pero só para pechar a base de datos, se é exitoso ou se non funciona, que quere desconectar desde a base de datos. Entón, é chamado, db.close no obxecto db. Teña en conta que o teardown_request ten en unha excepción. Así, pode comprobar se houbo realmente un erro cando estaba pechando, pero aquí, espero, non non son unha morea de erros, polo que estamos só unha especie de ignorar isto. Ok, eo resto non é tan malo. Entón, cando imos para o páxina principal, que rendeu este modelo home.html que vai abrir. O paso está post igual a, e que esta fai é, lembre que temos este post modelo, polo que, seleccione as mensaxes, e, a continuación, outra cousa que pode facer, pode especificar a cláusula WHERE, pode especificar un por orde, e así que nós tomamos todas as mensaxes que obter seleccionado e, a continuación nós requisito-los polo post.date.descending. E iso vai especificar, cando realmente saír, o último será moi primeiro. E entón, nós pasar isto para o modelo home.html, entón imos realmente abrir Template que realmente rápido, e dar un ollo a como iso funciona. E iso non é grande HTML, pero esperanza, podemos concentrar en Python. Polo tanto, hai unha ligazón ao Add New Post, e por iso este especifica a vía dentro da botella que definir, que é aquí mesmo. Esta é a nova ruta post, e especificar que ata aquí. E así que é un enlace que, a continuación, ir para ese percorrido dentro do servidor Flask. O máis interesante é este loop for aquí. Por iso, especificar que este parámetro post que foi pasado para o función render_template, para cada post no post de obxecto que é pasado no. Queremos imprimir o título do post, en H1, e, a continuación, a continuación, queremos imprimir o texto referenciado dentro dun parágrafo. E aquí, podemos, de feito, chamar unha función Python, así que podemos chamar strftime, -rf-time ST, e pode pasar na secuencia de formato que quere imprimir os datos no. Entón está é moi bo que poida realmente chamar esta función Python de dentro aquí. Non ten que facer o formatado lado do controlador, porque realmente, formatar a data é algo que quere tratar dentro do Vista. E todo iso por cento as cousas non é super importante. Se ollar a documentación para a función strftime en Python, el especifica todos estes cousas, pero iso é como, cando estabamos buscando na páxina principal aquí, formato iso cun bo data e especifica AM ou PM, pero normalmente, se nós non tiña iso aquí, probablemente vai ter algún lixo data que non parecía moi bo. E, entón, especificar o post.text, e eu podía colocar un par de saltos de liña aquí, só para poñer algúns espazos entre cada post. Entón, eu creo que o máis importante cousa neste exemplo, é que pode usar isto para loop. E isto é análogo cousas que podes facer en PHP. Pode percorrer, todo se pasou en, e así, en vez de ter que facer copy / paste, copiar / pegar todo o HTML, só ten que escribir unha vez, e, a continuación, podes iterado sobre todas as mensaxes. E iso é algo común que quere facer, cando tes unha morea de datos, é que para todo nos seus datos, quere facer algo semellante. E, a continuación, lembre, que cando desexa imprimir algo explicitamente en HTML, usa as claves dobres aquí, pero despois cando quere especificar algunha información sobre unha condición, ou preto de un loop, ten usar o soporte por cento. Entón, volvendo ao Python código, polo que explica o que está a suceder no principal ruta, cando imos, el só exhibe todas as mensaxes, pero, a continuación, o tema é, como é que imos realmente comezar mensaxes na base de datos, que é un pouco máis interesante. Entón, cando fai clic no New Ligazón do post, o que vimos aquí, el redirecciona para este formulario. E iso é só unha simple chamada ao función render_template, que, a continuación, pasa o novo cargo en formulario HTML. Entón imos dar un ollo niso. Entón, esta é moi sinxelo. Ten un formulario HTML simple, que vai mirar un pouco familiarizado, a partir dos formularios en CS50 Finanzas. E así, nós especificar aquí, a acción. E aquí, se está a traballar con PHP, normalmente, sería algo así como: create.PHP, pero aquí realmente especificar unha ruta dentro do servidor de botella. E así, corresponde esa ruta para crear a ruta que temos aquí, que nós falaremos sobre nun segundo. E así, nós especificar que é un método post, porque queremos enviar estes datos xeito, e, xeralmente, cando está enviando datos dun formulario, pode querer usar unha solicitude post, só para que non acabar con este grande, pesado URL. Pero tamén pode usar unha solicitude GET, e pasalo en con encamiñamento variable, pero para formularios, é bo a unha solicitude post aquí. E entón, así como faría HTML e PHP, pode especificar estas entradas de texto, e pode especificar o nome deles, e ese é o nome que se pasados no obxecto da solicitude no prazo de Flask. E entón temos unha Enviar botón que di Post. E aquí, Post é o nome do botón, porque é un post de blog, pero aquí, post é o método de solicitude. Polo tanto, estas son a mesma palabra pero, en realidade, non relacionada. Si Volvendo ao código Python, cando chamado método de crear, notar aquí que pode de feito especificar no percorrido os métodos de solicitude que pretende aceptar, e así por aquí, eu especificar que só queren aceptar un método Post. Entón, se eu realmente tentar visitar a páxina directamente, que está a usar unha solicitude GET, el me vai dicir "Método non permitido." E así, ten páxinas, tipo de como Nesta páxina crear, que eu só son realmente usando como unha forma de a forma de se someteu, pode especificar que non fai quero que a xente para poder ir máis alá directamente a través dunha petición GET, ou se non quere, por algún motivo, unha solicitude POST, podería só especificar chegar aquí, pero neste exemplo, só quere a solicitude POST para saír. Así, cando create_post chámase cando visitamos que vía a aplicación Post, sempre que vai a un determinado ruta, hai este obxecto da solicitude, e tivemos que importar solicitudes na parte superior, pero hai esta solicitude obxecto que é pasado en, e pode acceder aos datos do formulario, que será automaticamente cuberto cando envía unha solicitude dun formulario. E entón, o que eu penso é moi legal, é que o obxecto de formulario para obter pasado in, é só un dicionario Python que contén, se access-- iso aquí, deixe- me puxar arriba o HTML ó lado, só para que poida ter que como unha referencia, así, entón os nomes que especifican aquí para os distintos campos, para o título eo texto, entón é só usar aqueles con máis aquí como índices para os datos do formulario. Entón, iso é super cómodo. Entón chamamos post.create, que creará e introducir automaticamente este novo cargo obxecto na base de datos. E eu creo que iso crear función aquí está un exemplo de como moi legal Flask é poderosa e traballar con iso, porque se está facendo algo en PHP, pode ter que facer unha chea de validación, que tería que, a continuación, establecer unha conexión de base de datos, que tería que, a continuación, executar a consulta SQL, pero aquí só temos este bo post.create, que pode, entón, só obter a información do obxecto da solicitude, e, a continuación, pasalo a un novo posto que estamos creando. E, a continuación, o último cousa que queremos facer, é redireccionar o usuario de volta para a casa. E por iso usan este Flask redireccionar función. E algo que non viramos antes, era esta función URL. Así, a URL para a función permite pasa, en realidade, o nome dunha función no seu código Python, no canto da vía particular que está. Entón, eu podería ter só como facilmente redirixido un usuario para cortar, que ía envialo de volta a casa, pero usando o URL para a función é a de Niza, porque se cambiar o lugar onde as cousas son, entón imos dicir que eu cambiar o casa para estar en / home no seu lugar, iso aínda, entón, voltar / home, porque, en realidade, vai e mira cara arriba o nome da función, e lle vai dar de volta a URL para iso. Así, tipo de no presuposto de que é máis propensos a cambiar onde as cousas son, que os nomes das funcións. Podes usar isto realmente agradable URL para a función. E unha cousa que ser consciente de que é un pouco complicado, é que pensas que podería só chamar redireccionar a URL para, pero, en realidade, todas as rutas teñen para volver algún tipo de texto e HTML, así que realmente ten que voltar a chamada redirección. Se non, terá algo válido por non devolver unha cadea, porque todos estes teñen para voltar HTML que realmente quere procesar. E así, cando chamar a redirección, el redirecciona para a páxina, pero, en realidade, devolve o HTML precisa realizar ese redirección. Voltar á páxina de inicio. Polo tanto, temos estes dous puntos de vista diferentes. Temos a visión de casa. Ou, eu creo que eu debería dicir modelos. Temos estes dous modelos, o modelo de casa que exhibe todos os nosos postos de traballo, e entón temos esa cousa de anuncio, e cando fai clic no post, que vai para unha nova ruta no globo, pero ese camiño non necesariamente ten un modelo correspondente. Non ten que ver nada, pero aínda pode ter este traballo en curso nos bastidores. E entón redirixido volver á páxina de inicio. E, en definitiva, é fácil de traballar nalgúns CSS máis agradable para o modelo e facer este ollar moito máis agradable, pero toda a lóxica principal está aí no Python. Calquera dúbida sobre ese exemplo? Sei que hai unha morea de cousas distintas suceder alí, unha morea de cousas que non vira antes, pero como calquera cousa. Si. Audiencia 1: Ten que facer nada especial para fregar os datos que se vindo do formulario? Podo entender que acaba de dicir "crear", EZRA Zigmond: Si, o que é en realidade, iso é un punto moi bo. Entón, a pregunta era: que que comprobar e certificar- que os datos son válidos, e facer calquera tipo de fregar para asegurarse de que é válido, porque como podes ver aquí, Eu non estou facendo iso. Entón, imos ver que pasa se eu publicar algo en branco. Entón, que vai realmente facer só unha pos en branco e enche o DateTime. Entón, en realidade, probablemente quero facer algo así como: quizais especificar se o título é igual a a cadea baleira, non facelo. Ou, facelo só se o título é non é igual a unha cadea baleira. Entón, realmente non automaticamente coidar do que fregar para ti, entón aínda que facelo. Si, boa pregunta. Audiencia 2: Será que esfrega para inxección secuela? Sabes? EZRA Zigmond: Afortunadamente, peewee fai iso. Eu creo que sería certamente unha fermosa mal biblioteca, se non fixo iso. Non sei exactamente. Teño que mirar para o consulta que xerou. Eu creo que si eu escriba nun post de blogue que tipo de mirei como un ataque de inxección SQL, algo así, se esta é como un campo de contrasinal ou algo así, pode facer algo así. Eu creo que vai aínda obter literalmente posta, pero eu creo que fai peewee algún tipo de lavado dos datos antes de que realmente executa. Audiencia 1: Este campo de texto está deseñados para ter texto, non? EZRA Zigmond: Si, é. Si. Entón eu creo que todo o, polo que esta é comportamento correcto, que vai facer iso, pero eu creo que peewee espero que non facer algún tipo de protección na súa extremidade. E se quería comprobe que hai son formas cando xerar unha consulta. así que non ten que executa-lo directamente. Eu tería que tomar unha ollar para a documentación, pero realmente pode ver o SQL que está xerando, e vexan o que, e facer seguro de que está escapando cousas. Outra razón pola que pode quero ollar para o SQL peewee que está saíndo, é se As cousas parecen estar indo moi amodo, pode dar un ollo e ver o que é realmente facendo, porque é ás veces accidentalmente fácil engadir en, o xeito no que gravala-lo, podes telo accidentalmente seleccionar todo a base de datos en primeiro lugar, e, a continuación, facer algunha operación de clasificación en que, cando realmente destínase a seleccionar un subconxunto. E así, as cousas non son bastante indo para a dereita, é bo dar un ollo a petición que está realmente quedando xerado. Si. Audiencia 2: Cando comezou, poñer na porta como 5000. EZRA Zigmond: Yeah. Audiencia 2: É o estándar con peewee, ou iso é algo que pode cambiar? EZRA Zigmond: Si, así que o porta é estándar con Flask. Se executa-lo sen especificando nada, vai facelo automaticamente. Eu creo, eu tería para comprobar iso, pero pode especificar que, no app.run, Eu creo que pode facer algo así como: port = 8080. Imos dar que tentar real rápido. Si, entón podes só especificar port = 8080, e que pode executa-lo alí, que eu creo que, se quere executa-lo no IDE, non tente iso, pero eu creo que se el foi na porta 8080, probablemente sería capaz para acceder ao servidor, só como se fose para o sitio. Si, pero é doado para cambiar isto se ter ningún tipo de como porta-forwarding cousas que ten que facer. Algunha pregunta? Si? Audiencia 1: Entón, eu vin na súa modelos que, como mencionar, ten que especificar o base de datos para cada obxecto. Seica xa sabe, fai que fan realmente doado se ten unha morea de bancos de datos SQLite que quere empregar para un único programa da web, que pode só especificar un grupo de diferentes queridos no seu modelo? EZRA Zigmond: Si, déixeme abrir esta ben rápido. Entón, está dicindo que, se quere ter unha morea de diferentes algo, quizais gusta e os estudantes, para algúns razón, algo así? Si, entón eu creo que aínda, cada modelo tería que aínda ten só unha base de datos que lle é asignado, pero se quería ter diferentes modelos que ter diferentes obxectos de base de datos atribuído para el, que sempre podería facelo. Entón, se eu creei un novo, algo como iso, e agora este é un estudante que parece estrañas como un post de blog, Podería indicar que o base de datos é igual a db_2 aquí. Entón, eu creo que é a principal forma pode facelo. Legal. Algunha pregunta? Entón, só para rematar un pouco bit, aquí están algúns recursos, e eses diapositivas publicaranse en liña para que poida realmente chegar a eses enlaces. Os mellores recursos son realmente a documentación para Flask e peewee si. Están moi ben escrito, eu creo. Así, o sitio web do Flask está aquí, e eles teñen un tutorial de inicio rápido que ha percorrer semellante as cousas para que eu andei a través, pero se quere calquera tipo de avaliación das cousas que eu fun, ou penso que eu expliquei algo dunha forma confusa, terá exemplos semellantes alí. Peewee ten documentación, e eles teñen un tutorial de inicio rápido que vai sobre os principais parámetros que desexa usar. Entón, as cousas que eu falei sobre con os patróns únicos, e especificando, os distintos tipos de campos que pode usar, os que serían todos alí. Ademais, se ten preguntas sobre peewee, e publicala conxuntamente en stackoverflow, a cara que fixo realmente peewee continúa e responde a estas veces. Se tes unha pregunta, espero que que vai ser capaz de respostas la, porque escribiu a cousa toda. Eu creo que é todo Quería cubrir. Grazas por vir.