[REPRODUCCIÓN DE MÚSICA] ESDRAS Zigmond: Hola, todo el mundo. Gracias por venir hoy. Este seminario es "Python Web Apps con el frasco ". Por lo tanto, voy a estar hablando un poco sobre por qué es posible que desee utilizar Frasco hacer aplicaciones web con Python, en contraposición con algunos otros marcos por ahí, como Django, que es bien conocida la mayoría. El subtítulo es "y peewee, "que es algo vamos a hablar de cómo para interactuar con bases de datos SQL. Esto hace que sea muy agradable. Así que, aquí es sólo un pequeño repaso de lo que quiero para repasar. Así, en primer lugar, a una diapositiva que va a ser de inicio rápido, que es la forma de conseguir todo creado en el equipo. Voy a estar demostrando esto en mi máquina local Mac, sólo porque ahí es donde lo he hecho antes, estoy más cómodo con él, pero esto es definitivamente posible en el CD50 IDE. Así que, después de eso, quiero introducir lo Frasco es, y convencer por las que debe utilizarlo en el primer lugar. Entonces, voy a dar una rápida ejemplo de lo que puede hacerlo en el frasco, un ejemplo rápido de lo que puede hacer en peewee, y luego yo te mostraré una manera más completa aplicación ejemplo que puse juntos que puede caminar a través de juntas. Y finalmente, en la última diapositiva, tengo algunos recursos que usted busca en línea para obtener más información. Esto no es una completa tutorial de cómo utilizar el frasco. Y voy espero que salir un tiempo para preguntas. Viendo a nadie a nivel local, justo como, gritar en medio si tienes alguna pregunta. Así las cosas una instalación rápida, si quieres seguir adelante, o si quieres conseguir este hasta en su propia máquina, Voy a utilizar Python 02/07/10. Frasco funciona con Python 3, pero me gusta utilizando Python 2, porque no hay algunos paquetes de Python que no funcionan con 3 todavía. Si ha instalado pip, que es un gestor de paquetes de Python, Creo que si tu Python es mayor que o igual a 2.7.9, lo tienes instalado, es super fácil de instalar estos paquetes. Usted puede hacer instalar pip Frasco, pip instalar peewee, por lo general tiene que ejecutar sudo solo por lo que los permisos de trabajo a cabo. Y, si usted está usando un súper versión antigua de Python, Yo recomiendo la actualización de su Python, o el uso de EasyInstall instalar pip. Así, la siguiente pregunta es, ¿cuál es el frasco? Y creo que, en primer lugar un pregunta razonable Me preguntaba durante mucho tiempo es, lo que es una aplicación web? Porque eso es una palabra que me creo que es lanzado en torno a una gran cantidad que yo no lo sé. Y creo que la mejor ejemplo de lo que una aplicación web es, Realmente es CS50 Finanzas, donde en realidad no es sólo un sitio web, pero es algo que podría especie de interactuar. Hay cuentas de usuario y todo tipo de cosas diferentes. Entonces, ¿dónde exactamente se traza la la línea entre lo que es un sitio web, y lo que es una aplicación web, es una especie de arbitraria, pero creo que la idea, es algo más que un sitio web y es una útil aplicación. Así, el frasco es un marco para hacer aplicaciones web usando Python. Y es de esperar, a finales de esto, voy a convencerte que se podía escribir algo como CS50 Finanzas usando Python, que me como mucho mejor que PHP, personalmente. Así, el frasco es, que ellos llaman un microframework, por el cual, quieren decir que es muy simple, pero extensible. Por lo tanto, tiene todo lo que necesita, pero si quieres más características, es fácil traerlos. Pero sólo porque se trata de un microframework, ¿no quiere decir que es sólo para pequeños proyectos. Tengo un enlace aquí que dice que Obama usa el frasco en 2012 para su campaña sitio web, que es de esperar, es algo así como un aval. Pero lo que yo realmente me gusta de Frasco es que, en realidad no hacen cualquier tipo de decisiones por usted. Sólo porque estamos hablando de aplicaciones web, Tengo que compararlo con Ruby on Rails y Django, ambos de los cuales son grandes marcos, pero ambos hacen suposiciones acerca de cómo desea interactuar con bases de datos, cómo desea presentar su puntos de vista, y son sin duda buenos aspectos a eso. Por ejemplo, Ruby on Rails tiene este sistema de registro activo, que es un lugar muy agradable manera de interactuar con los datos, pero si usted desea utilizar Ruby on Rails, estás tipo de atados en eso. Pero con el frasco, como voy a mostrar con peewee, puede utilizar cualquier clase de la base de datos que desee, y usted puede simplemente tirar de que, en como una extensión en el frasco. Así que por eso yo realmente como Frasco, es que no hacer suposiciones para usted basado en cosas que no necesita realmente. Así que, ¿por qué debe usted utilizar el frasco? Las ventajas son, simplemente tiene realmente las características principales construido en él que usted necesita. Por lo tanto, usted no tiene que preocuparse de entender un montón de cosas que realmente no necesita. Usted no tiene que tener que preocuparse sobre cómo desactivar características que realmente no necesita. Y, como ya he dicho, es super fácil de añadir en las extensiones de las cosas que usted necesita. Algunos de ellos, el frasco tiene su apoyo a la misma. Así que hay algo que se llama Frasco admin, que refleja que la administración panel que Django ofrece, que le da una forma visual agradable para administrar su sitio web. Pero, de nuevo, si usted es hacer algo sencillo, es probable que no necesita un gran administrador Panel, así que creo que eso es súper agradable. Y las desventajas son, que usted tiene menos poder sacarlo de la caja. Por lo tanto, la primera vez que abre el frasco, y en su programa de Python, sólo tiene que teclear desde Frasco import *, o lo que sea, no obtiene exactamente todos las características que usted puede ser que desee. Y lo que tiene que más explícitamente enumerar las características que desea. Así que eso es una desventaja, pero yo creo que para la construcción de pequeñas web aplicaciones como voy a estar mostrando usted, eso no es realmente un problema. Y lo último que es supone que decir, que es un error tipográfico, es que hay menos estandarizado convenios para el uso de Frasco, simplemente porque no hay tantos las personas que lo utilizan profesionalmente en comparación con Django. Por lo tanto, si se mira algo como: "¿cómo puedo hacer x" en Django, usted probablemente encontrará. Hay un buen diseño patrones que se pueden utilizar, pero con el frasco, es especie de seguir su propio camino, sólo porque es un bastante pequeña biblioteca. Así que estos son la desventajas, pero creo que sigue siendo una buena biblioteca de usar. Así que vamos a entrar de lleno en el frasco. Este es, sin duda no va ser un tutorial completo, pero es para darle una idea de cómo estructurar las cosas, y para que te sientas cómodo ir fuera y mirando a la documentación y saber más. Por lo tanto, permítanme abrir una realidad ejemplo sencillo al principio, y lo que mostrar parece, y luego vamos a descomponerlo un poco más. Así que esta aquí, déjame ponerlo en marcha. Así que, ahora tengo mi aplicación en ejecución. Voy a abrir Safari y se está ejecutando en mi host local. Así que sólo voy a hacer este más grande. Pero localhost: 5000 Y así, en este momento, todo esto hace es decir, cuando usted visita el sitio web, imprime "Hola Frasco" que no es muy útil, pero creo que es genial que en este pequeño archivo aquí, tenemos un servidor web en ejecución que se está imprimiendo algo. Así que, vamos a ver en realidad en el código de un segundo, y descomponerlo un poco. ¿Es el tamaño bueno para todo el mundo aquí? Así que, con suerte, eres un poco cómodo usando Python. Estoy asumiendo que podemos mirar el Python y leer a través de él. Si usted tiene alguna pregunta sobre nada, yo también puedo ir sobre eso. Así que la primera línea es, desde el frasco, importamos, Frasco con un capital "F" que es una especie de todo el características clave que usted necesita. Cada vez que usted está escribiendo un archivo y utilizando el frasco, usted va a querer importar que, sólo porque eso tiene todas las cosas principales. La siguiente cosa que hacemos, somos nosotros llamar a esta función Frasco, justo para crear un objeto aplicación, y ya está siempre va a querer hacer eso. Y luego, saltando a la abajo rápidamente, esta parte es aquí, 'if_name _ == "_ main_"', que es una especie de convención de Python. Así que esto sólo se ejecutará si ejecutar este archivo directamente utilizando Python. Luego, llame app.run, que lo hará en realidad iniciar la aplicación en marcha. Por lo tanto, esa es la estructura principal que que tendrá en cualquier aplicación Frasco, es que usted tendrá esta aplicación = Frasco (_nombre_), y luego app.run. Así, las dos cosas que tengo aquí, son lo que llamamos rutas. Por lo tanto, vamos a hablar de encaminar un poco más. Voy a volver a la diapositiva. Por lo tanto el más fundamental concepto en el frasco es el enrutamiento. Y es la idea de que usted asignar funciones en Python a direcciones particulares en tu página web. Así que, cuando quieras para crear una nueva ruta, utiliza esta @ app.route decorador función. Por lo tanto, si no está familiarizado con decoradores de función en Python, es que este concepto Le permite tomar una función y lo rodean con algo más. Así que en realidad, lo que hace este decorador, es que toma la función debajo de ella, y se añade más información a él, pero lo que en realidad Frasco no a que esto suceda no es super crucial, pero lo que es importante, es que antes de la ruta, poner esto @ app.route, y luego la dirección de la ruta, por lo que la barra es lo que vimos cuando nos abrimos la página web. Así que esa es la página de inicio. Es sólo la ruta de tala. Y entonces usted tiene esta función. El nombre de la función puede ser lo que quieras. No tiene que necesariamente tienen que ver con la ruta. Y luego, cualquiera que sea El regreso de la función, la función debe devolver una cadena. Y esa cadena puede contener HTML ni nada, y eso es realmente lo que va a conseguir regresado a su navegador web como HTML, y hará que el. Así que este es el mismo código que era el ejemplo que acaba de ejecutar, por lo que cuando nos visita barra, se llama a una función Hello World, que sólo devuelve una cadena, Hola Frasco, y que se imprime en la pantalla. Así que hay otro ejemplo, que es, cuando usted visita / hola, imprime Hola Palabra, que en realidad debería decir Hello World, pero vamos a suponer que fue intencional. Así que vamos a tirar que hasta muy rápido. Así que si vas a localhost / hola, ahora imprimirá otra cosa. Así que eso es sólo un ejemplo rápido de cómo puede crear dos rutas diferentes. Así que, hasta el momento esto no es muy útil, no hay mucho que puedas hacer, usted podría hacer todo eso con tener diferentes páginas HTML, y cuando usted visita un particular, página sólo carga la página. Así que vamos a ver un poco más cosas útiles que puedes hacer. Por lo tanto, una cosa que usted puede ser que tenga notado en el ejemplo que saqué arriba, es que yo había app.run (debug = True). Y así, lo que esto argumento de depuración hace, es que cuando se ejecuta el servidor web, cuando estás en su aplicación, si cambia un archivo, lo hará recargar automáticamente el servidor. Y por lo que no tiene que realmente reinicio Python, que es super útil. Puedo demostrar que. Déjame sacar mi código con el error tipográfico en el mismo, y pretender que typo fue puesto allí intencionalmente para los propósitos instructivos. Así que vamos a añadir esto de nuevo. Así que ahora que dice Hello World. Voy a guardarlo. Y si tiramos una copia de seguridad el terminal, se le decir que es reiniciar, porque detecta un cambio, y así ahora, cuando recargamos esta página se imprimirá la cosa correcta. Así depuración es super útil para eso. Además, si usted tiene cualquiera una especie de accidente, por lo que quiero dejar esta caída de la aplicación teniéndolo no devuelve una cadena. Así que, vamos a tenerlo volver Ninguno por alguna razón. Y luego, cuando visito esta página, se acaba de estrellar, pero el servidor no se limita a estrellarse, se en realidad le da una vuelta super útil rastro de todo lo que salió mal. Y lo que es muy agradable, es que en cualquier paso en este rastreo, usted podría abrir una interactiva shell aquí, y una especie de imprimir lo que variables que quieren ver. Y así, la depuración es realmente útil para averiguar lo que está pasando con su servidor, en lugar de sólo ver algo en PHP como un interno 500 error en el servidor, que es super inútil. Una cosa a tener en cuenta, es que si pones tu aplicación en línea por lo que es visible para el público, que nunca quieren salir del modo de depuración en, porque la gente realmente puede usar esa consola que me mostró que permite ejecutar código arbitrario. Así que se pueden imprimir como cualquier códigos secretos que tienes ahí, pueden ver exactamente cómo su sitio web está funcionando. Así que es realmente útil para las pruebas, pero siempre asegúrese de sacarlo antes publicar cualquier cosa en línea. Así que cuando usted está usando algo como PHP, hay esta idea que puede pasar información entre páginas web poniendo la información en realidad en el URL, que es una solicitud GET, pero en el frasco, en realidad se puede hacer algo algo así como que, por tener una ruta que tiene una variable como parte de ella. Así que si nos fijamos en este ejemplo en la pantalla de aquí, tenemos una ruta que es ('/ hola /'), y por lo tanto, si usted visita / hola / algo, ese algo va a conseguir realmente lleno en la variable nombre. Y note que la función que viene con esa ruta tiene que tomar en el parámetro nombrar, por lo que lo hará realidad conseguir pasado a la función. Y luego, una vez que estás dentro de esa función, usted puede tratar de que como una variable normal Python, y así entonces, que lo hará imprimir Hola, y llenará en el nombre usando parte del formato de cadena. Así que para añadir partes variables a un enrutamiento, se utiliza el soporte en ángulo marcado. Y opcionalmente, puede utilizar lo que se llama un convertidor. Y así, si usted pone este anotación con el colon, puede especificar que se trata de un int o un float, o ruta, y se convertirá automáticamente eso. También puede hacer la conversión dentro de la función de Python, apenas usando un yeso, pero a veces si usted quiere asegurarse de que es un int, puedes poner eso regla de conversión en ese país. Así que vamos a tirar para arriba un ejemplo de algunas reglas variables. Así que aquí, esto tiene el mismo básico estructura con el del frasco de importaciones Frasco, la aplicación = Frasco (_nombre_), y luego que se está ejecutando en el extremo. Tenemos estos dos diferentes rutas variables aquí. Y el primero, es el que me presenté en la corredera, que fue que sólo se necesita en un nombre de cadena y se imprimirá Hola, Nombre. Y entonces, el segundo uno utiliza la conversión. Así que esto lo convertirá automáticamente a un int y, a continuación, duplicar la int, e imprimir eso. Y, no hacemos ningún tipo de la conversión dentro de ella porque el frasco se encarga de eso. Así que vamos a esta carrera. Cuando usted tiene un frasco aplicación en ejecución, usted puede controlar-C fuera de él para detener el servidor en ejecución. Y luego voy a correr las variables. Así que vamos a ir a localhost / hola / Esdras y Esperamos que esto saludar a mí. Así que tomó en mi nombre, en la variable ruta, y lo llenó aquí. Así que yo también voy a mostrar una rápida ejemplo de la duplicación. Así que si vas a / doble / 3, se imprimirá 6. Así que esto se hizo cargo de la conversión para nosotros. Así que usted también puede hacerlo con flotador, y algo especial, si usted necesita especificar algo como un camino, que le permite aceptar barras, pero eso no debe generalmente ser un problema. Hasta ahora, todavía tiene acaba de ser regresar cadenas, que no es muy interesante. Podríamos realmente volver cadena HTML literal. Así que en el código se puede insertar algo como el b-tag para que sea audaz, pero la mayor parte del tiempo que en realidad no quieren ser la escritura de código HTML en el código Python. Se pone muy sucio, y no es un buen momento. Frasco nos permite separar el HTML en lo que se llama la plantilla, y por lo que si usted está pensando en términos del modelo MVC que usted está familiarizado con, con suerte, de trabajar con CS50 Finanzas un poco, se puede pensar en los archivos de Python como más del Contralor, donde están interactuando con lo modelo de datos que pueda tener. Y luego están llamando a Vistas y pasar información a la Vista para rellenar la información en HTML que necesita. Y lo que llamamos esos Vistas son plantillas en clase. Así Flask utiliza otra Python módulo que lo hará de forma automática instalar cuando Pip instala Frasco llama Jinja, que le permite agregar estos anotaciones al HTML que se ve en la pantalla, que le permite se pone en cosas como los condicionales, y bucles en el código HTML. Así que parece un poco a cómo podría usar PHP en un archivo HTML, pero esto es sólo cuando el frasco servidor sirve el archivo HTML, se ejecutará este motor de plantillas y analizar a través de esto y llenar cosas. Así frasco tiene una función render_template que se puede ver en la parte inferior aquí. Y así, cuando usted visita esta página, haría que esta plantilla hello.html, y luego rellene este página HTML. Así que vamos a ejecutar esta verdadera rápida, y ver lo que parece, y luego voy a ir a través de un poco con más detalle. Por lo tanto, sus plantillas se van ir en una carpeta Plantillas. Se verá de forma automática dentro de la Plantillas carpeta para esa plantilla. Así que vamos a abrir esto. Por lo tanto, voy a correr el ejemplo de plantillas. Así que si voy a / hola / ezra, que tiene esta horrible, etiqueta marquesina odioso que puse en. Muy bonito, muy dinámico. Soy un gran fan. Pero, ¿qué sucede si Acabo de ir a, / hola? Por lo tanto, se limita a decir Hello World. No pasé un nombre, y se llenó en forma automática. Así que vamos a ver cómo se hizo eso, y cómo podemos deshacernos de esa carpa tal vez. Así que aquí, esta es una especie de un ejemplo interesante de, si está familiarizado con la forma del interruptor declaraciones trabajan en un idioma. Decir esto es algo así como, ese tipo de una caída a través, donde realmente apegado de dos diferentes rutas a la misma función. Así le damos la / hola ruta y el / hola / nombre de la ruta a Hello, y especificamos using-- Python le permite especificar por defecto la función arguments-- por lo que si no hay un nombre, por lo que si vamos a solo / hola, se filtrará automáticamente de nombre es igual a ninguno. Así pues, le rendimos el Plantilla con nombre = nombre, por lo que va a pasar en el parámetro de nombre igual a este parámetro de la función nombre, en la plantilla. Eso todavía no explica cómo es decidir si se debe imprimir Hello World, o imprimir mi nombre. Así que vamos a ver en realidad en la propia plantilla, y ver a dónde está viniendo. Así, dentro de esta plantilla, que en realidad tienen algo de lógica condicional, que algunas personas se argumentar, en realidad no debe tener mucha condicional lógica dentro de su propia plantilla. Debería ser más dentro de la Controller, pero para este ejemplo es algo muy pequeño. Así que aquí, comprobamos, si el nombre, por lo que si el nombre no es igual a ninguno, si un nombre es en realidad aprobada en, entonces se decir hola, nombre con el cabecera y la marquesina, todo esto HTML normales, de lo contrario, vamos a imprimir Hola, mundo acaba normalmente. Así que un par de cosas de aviso aquí sobre cómo formatear la plantilla, es que, todos estos sentencias condicionales, algo así como la forma en que PHP cuando desea insertar algo de PHP, utiliza el menos-que pregunta marca, es una especie de análogo aquí con el {%. Así que aquí tenemos nuestro código condicional. Y entonces, cuando en realidad se quiere literalmente evaluar algo, y de impresión fuera de la pantalla, utilizar los dobles tirantes. Así que aquí están las llaves dobles, y luego especificamos nombre, así que dentro de eso, se evaluará con el nombre de la variable, que fue aprobada por la render función de plantilla, en lugar de sólo la impresión cabo, si nos libramos de ellos, sería simplemente imprima la palabra "nombre". Así que, eso es algo a tener en cuenta. Así que otra cosa aviso es que, cuando nos que desee utilizar el función render_template, en realidad tenemos que importar que explícitamente del frasco. Y este es un ejemplo de la modularidad de Frasco, que usted no tiene que importar cosas que no necesitas. Usted sólo puede traer en el funciones que realmente no necesita, que es a veces agradable, así que no lo hace tiene que tener todas estas funciones sentados alrededor de que no se esté usando, sino también, si se le olvida que usted necesitará importar render_template, probablemente obtendrá una advertencia que le permitirá saber acerca de eso. Por lo tanto, es de plantillas. Por lo tanto, hemos demostrado cómo hacer que las páginas web sencillas, y añadir un poco más a la lógica que, en términos del encaminamiento variable. Te permite hacer cosas diferentes sobre la base de lo URL usted va a, y entonces, dar el HTML un poco más de sentido en términos de cómo quieres hacer las cosas. Usted no tiene que poner todo código HTML en tu Python, pero para casi todas las aplicaciones web, usted va a querer algún tipo de modelo de datos asociada con él. Y así tradicionalmente, esto haría algo así como una base de datos SQL. Y usted puede interactuar directamente con SQL. Python tiene, creo que se llama. SQLite 3. Sólo puede importar SQLite 3 y ejecutar directamente consultas SQL, pero yo no sé ustedes, pero la verdad es que no me gusta, simplemente, escribir consultas SQL. Tiende a ser realmente larga y complicada. Y así, algo que Me gusta usar es lo que se conocido como un ORM, que es una mapeo objeto-relacional. Y el punto de un mapeo objeto-relacional, es que hay dos diferentes maneras que usted puede pensar en las bases de datos. Así el ejemplo que Profesor Malan general utiliza en clase, es la tabla de Excel, donde usted tiene estas filas y estas columnas, y eso es realmente útil para la forma en que se representa en SQL y la forma de interactuar con él, pero de otro modo que en realidad es útil para pensar en ello a veces, es en términos de clases y objetos. Así que en lugar de pensar de cada tabla como tener esta fila que tiene cierta información, en realidad se puede pensar en él como siendo cada tabla es una clase, y entonces cada instancia de la clase tiene ciertas propiedades. Así, en este ejemplo, las instancias de la clase son las filas de la tabla, y luego cada propiedad haría ser una columna en la tabla. Así, el ORM que me gusta utilizar se llama peewee. Es muy pequeño, algo así como el frasco. Creo que van bien juntos, pero hay un montón de otros ORM que se puede utilizar. A una más popular es conocido como SQLAlchemy, y no puedo recordar por qué me originalmente eligió peewee sobre SQLAlchemy, o te lo diría por qué Creo que es la mejor, pero sólo vamos a utilizar este uno porque yo sé cómo usarlo. Así, una pregunta es, ¿por qué en caso de que te molestes en usar un ORM, en lugar de sólo directamente escribir consultas SQL? Y creo que el mejor de los casos, es que no lo hace realidad que escribir consultas SQL. Es mucho más fácil, como yo os voy a mostrar, a hacer cosas como la selección, inserción, eliminación, especialmente la creación de tablas. Es mucho más fácil escribir una estructura de clases, de lo que es estructurar un Crear TABLE, pero una cosa a tener en cuenta, es que el ORM hará todo lo posible averiguar lo que la mayor parte consulta SQL eficiente sería, pero a veces se equivoca. Y sobre todo si eres trabajar con una gran base de datos, se puede observar que una consulta que debe estar en ejecución rápida, en realidad está tomando más tiempo. Y si se mira bajo el capó en forma el ORM está interpretando que en SQL, que podría estar haciendo algo realmente ridículo, sólo porque es una especie de hizo un gesto a sus intenciones mal. Y, ha habido momentos en los He tenido que anularla, y justo ejecutar mis propias consultas SQL, simplemente porque analizaba de una manera extraña. Por lo tanto, hay una cierta sobrecarga, justo en el camino que compila su declaraciones abajo en SQL. Por lo tanto, vamos a ver muy rápidamente a un ejemplo sencillo de un modelo de datos que usted puede utilizar. Así, se trata de código Python, por lo que el Lo primero que quiero hacer es de importación peewee *. Así, a diferencia de Frasco, donde tienes Todos estos módulos individuales, y desea importar el frasco, y escribir una plantilla, y algunos otros que veremos más adelante, a partir de peewee, que sólo puede importar todo, porque es una muy pequeña biblioteca. Por lo tanto, lo primero que quieres hacer, es de hecho crear este objeto de base de datos. Por lo tanto, usted tiene db = SQLiteDatabase, y luego el nombre de su base de datos. Y esto lo hará realidad crear un objeto de base que se puede interactuar, con peewee. Y luego, tenemos la real modelo que queremos crear. Así que la tabla que queremos crear. Así, dentro de peewee, cada clase tiene su propia tabla dentro de su base de datos. Por lo tanto, todas las clases heredar el modelo base, y el modelo de capital M es algo que se define en peewee. Por lo tanto, todos sus modelos deberían heredar como su más alta superclase, deben heredar de la modelo, pero lo que es realmente fresco, es que en realidad se puede tener su modelos heredan el uno del otro. Y una gran parte del tiempo, su modelos de datos no lo hacen necesariamente hacer una jerarquía de herencia agradable, pero momentos en los que lo hacen, es muy agradable, porque usted tiene el modelo inherente entre sí. Así, definimos esta clase "estudiante", que hereda un modelo, y tiene tres propiedades. Cuenta con un ID, que es un primaryKeyField, que es algo que se proporciona por peewee, el nombre es un CharField, y un grado es un IntegerField. Así que esto puede o puede no ser cómo CS50 realidad almacena toda los grados de los estudiantes. No lo es, pero así es como yo lo haría. Y entonces tiene, dentro de esta clase, y esto es algo que se puede hacer con Python, puede tener clases anidadas. Y esto es algo lo que se requiere por peewee. Por lo tanto, esta clase Meta, tiene para especificar que la base de datos es igual que el objeto que hemos creado anteriormente. Y esto lo dice archivo es esta tabla en realidad va a estar contenida en. Así que esto es algo que tienes hacer dentro de todos sus modelos. Sólo tienes que especificar dentro de esta clase Meta dicha base de datos es igual a db. Así que lo que suele hacer, si tengo un montón de diferentes modelos, es que tengo una base de modelo, que por lo general sólo llamar "modelo base" que tiene la clase Meta, y establece la base de datos igual a db. Y entonces todos mis modelos posteriores heredará de esa clase base. Y entonces yo no tengo que preocuparme sobre la configuración de la clase Meta. Así que, cuando esto se pone realmente compilado hacia abajo en una sentencia SQL, parece que esta cosa desagradable abajo aquí, "Crear una tabla de identificación de estudiante entero, " lo que sea. Y, creo que es más corto, esta consulta SQL aquí, pero si nos fijamos en esta clase aquí usted puede ver exactamente lo que está pasando. Usted puede ver qué tipo de campos existen, lo que están son llamados, y así, creo que mirando el código Python es mucho más legible que tratando de escribir esta consulta SQL. Por lo tanto, con el fin de realidad utilizar la base de datos, tenemos que conectar con ella dentro de Python. Así que, yo suelo escribir una función llamada initialize_db que hace dos cosas. Lleva en la base de datos db objeto y se conecta a él, que acaba abre hasta la sección de la base de datos. Si acaba de correr aunque página web en su equipo local, no es un super gran cosa que preocuparse acerca de la conexión y desconexión, pero si está ejecutando en un sitio web, querrá asegurarse de que, siempre que un usuario se conecta a la misma, cuando se cierran a cabo el sitio web, se desconectan de modo que usted no tienen un montón de personas conectadas a su base de datos a la vez. Y luego, cuando conectarse a la base de datos, que desea llamar db.create_tables, y la lista de las modelos por lo que quieres para crear tablas. Así que aquí, sólo quiero crear para este estudiante. Y luego, lo que es importante, es especifique segura = True mayor parte del tiempo. Así que lo que esta declaración va a hacer, es que crea tablas para el modelo de estudiante, pero sólo si esa mesa no tiene ha creado ya. Eso es lo que los especifica seguras. Así que no se sobreponen su tabla existente, sólo va a crear una nueva tabla si no hay nadie allí. Por lo tanto, usted podría crear las mesas una vez usando SQL. Y luego tiene que estar la base de datos allí y, a continuación, conectarse a cada vez, pero por lo general es bueno sólo para puesto en la presente convocatoria create_tables, de modo que, si alguna vez eliminar su cuando la base de datos se ejecuta la web aplicación de nuevo, será volver a crearla. Por lo tanto, sólo asegúrese de que segura se especifica para ser verdad, o usted encontrará sus datos solo recibiendo una paliza cada vez. Y entonces, sólo puede llamar a initialize_db para establecer una conexión, y crear tablas si es necesario. Así, lo más común que tendrá que hacer, o una de las cosas más comunes, es insertar en realidad las cosas en su base de datos. Y así, en lugar de tener escribir una inserción en declaración con todos los valores especificados, en realidad se puede llamar función de la clase de los estudiantes. Por lo tanto, cuando se crea una clase que hereda de modelo, que tiene esta crear método. Por lo tanto, lo hace la clase name.create, y especifica los parámetros que desea pasar. Así, si quiero añadir algunos estudiantes a nuestro ejemplo de calificaciones CS50, Voy a poner en David, que tiene un muy buena nota, tiene un 95. Y yo, que no lo está haciendo tan bien en CS50, tengo un 50. Y así, lo bueno de lo que hace esta función de crear, es que devuelve el ejemplo, o la fila, que se creó dentro de la tabla, y así entonces usted almacena que en un variables, y el trabajo con ella más tarde. Usted puede cambiar todo, que Te voy a mostrar un ejemplo de. Fíjate que yo no hice tiene que especificar el ID, porque ya que es el PrimaryKeyField, lo hará de forma automática incrementarlo si no lo especifica. Y, de hecho, es probable que no debe especificarlo, porque es posible que accidentalmente darle una paliza ID de otra persona. Y usted quiere hacer Seguro que es único. Así que, en realidad, el más cosa común que quieres hacer, es, probablemente, seleccione cabo de la base de datos una vez que tener una gran cantidad de información en ese país. Y así, si quieres tener todo, por lo que el equivalente del selecto estrellas de la declaración de los estudiantes, que sólo sería student.select. Y eso le dará vuelta una matriz con todos los estudiantes objetos en ella que iterar sobre usted desea. Usted puede conseguir cosas fuera de él. Y la mayoría de las veces, no sólo quieren hacer de selección, en realidad se desea especificar algo. Y es así, usted puede encadenar juntos estas llamadas a funciones, como la forma en que lo haría en cadena juntos las declaraciones en SQL. Así que usted puede hacer student.select (). Donde en este ejemplo. Y luego, se puede especificar las condiciones, simplemente usando Python normales Booleanos para comprobar las cosas. Así que, en este caso, usted quiere limitar lo que usted está seleccionando a, donde student.grade es igual a 50, y student.name es igual a Esdras, de manera que sólo me va a salir de ella. Y note, realmente Lo sutil aquí es que, si se desea especificar una y / o un o y / o, en Python, que normalmente se utilice, Creo que la palabra "y" en realidad, pero aquí se utiliza el signo único, que normalmente es un operador de bits, pero en este caso especial, tal y como lo hace peewee, utiliza la única símbolo de unión para especificar "y". Eso es algo que Me confundo mucho, pero no aparece que mucho en la práctica. Y luego, una vez que tenga todos los estudiantes fuera de la base de datos, una vez que haya hecho usted es selecto y su ropa o lo que sea, puede utilizar un bucle foreach, al igual que lo normal en Python, con cualquier tipo de iterador o con cualquier tipo de arreglo. Así que usted puede hacer, por s en student.select (). whe re (Student.grade <75), y por lo que esta voluntad iterar sobre cada uno de los estudiantes en la mesa cuya calificación es inferior a 75, que en este caso, sigue siendo sólo yo. Y entonces usted podría hacer algo dentro ese bucle, como yo envíe un correo electrónico y yo realmente decirle convertir en mis boletines de problemas. Así, otra cosa que pueda hacer, es que es muy fácil actualizar filas en la tabla. Así, recuerda volver aquí, su al insertar, Tomé el valor que era devuelto por student.create, y me asignaron a nombre llamado Esdras. Y ahora, usted puede cambiar el valores dentro de esa instancia, al igual que lo haría con un clases normales en Python. Así que usted puede establecer ezra.grade = 95 y que va a actualizar la copia local, pero si realmente quieres cometer ese cambio en la base de datos, tienes que llamar ezra.save, por lo que llamó el método .save en la instancia. Y ahora, he cambiado correctamente mi propio grado dentro de la base de datos. Así que, a continuación, vamos a decir que me atrapan cambiar de grado dentro de la base de datos. Profesor Malan probablemente va a querer que me elimine de la clase, y así que usted puede llamar a la .Delete método de instancia sólo en esa cosa. Así que, si quería ir de nuevo en este bucle aquí, y, de hecho, en vez de enviar mensajes de correo electrónico todos de los estudiantes cuyo grado es menor de 75, que quería eliminarlos, dentro de este bucle pudieras llamar instancia s.delete. Y la última cosa que quieres hacer, es cuando se establece una conexión, y ya está con su trabajo, que desea llamar db.Close, donde db es que la base de datos objetar que teníamos antes. Y usted quiere asegurarse de que todo se cerró fuera de. Guay. Así que ahora, tengo un ejemplo de aplicación. He especie de pre-hizo todo tal de modo que no habrá ningún tipo de codificación en vivo errores, pero podemos caminar a través de y ver cómo se pondría Frasco y Peewee juntos, y hacer una aplicación sencilla. Yo lo llamo diatriba CS50, y es una especie de plataforma de blog simple. Así, en primer lugar, voy a correr y muestran lo que parece, y entonces podemos mirar más en el código. Muy bien, así que vamos a ejecutar esto. Enfriar, voy a hacer esto un poco más pequeño. No es muy bonita, sólo porque No hice un montón de CSS, pero lo que hace es, tiene esta base de datos de publicaciones en el blog, y va a través de todos ellos, y se los muestra en la página con el fin de las más recientes. Y así, estos son sólo algunos de los puestos que había guardado en la base de datos. Así que si queremos crear una nueva después, podemos ir a Agregar una nueva entrada, y podemos entrar en el título de la post, así que algo como, seminarios CS50. Wow, realmente disfrutando del seminario. Guay. A continuación, pulse post, y será redirigir de nuevo a la página de inicio, y luego verás que se añadió el último mensaje. Y todavía tenemos todos los que hay. Así que ahora, vamos a dar un paso a través de todo el código y ver cómo se implementa. Por lo tanto, creo que la primera cosa que vamos a echar un vistazo a, es en realidad los modelos. Una gran parte del tiempo, cuando usted está diseñando algo, usted quiere pensar primero en cómo que va a representar a sus datos, y luego diseñar cosas a su alrededor que, para que todo tenga sentido. Y eso es realmente la forma en que lo hizo cuando yo estaba haciendo esto, Me senté y pensé, ¿qué es lo que quiero en un poste. Así pues, aquí, tenemos la misma estructura que yo mencionaba antes, donde hacemos db = Sqldatabase ('posts.db'). En realidad, es probable que no quiere al código duro en las bases de datos de su nombre. Eso probablemente debería ser un parámetro que se almacena en algún lugar, tal vez en un archivo de configuración, pero en un pequeño ejemplo de este tipo, que está bien para codificar que en. Así que ahora, tenemos esta clase de correos, que hereda desde el modelo base. Y tiene, de nuevo, el ID = primaryKeyField. En realidad, si no se especifica, si realmente se deshizo de esto, entonces Peewee nosotros nos encargaremos de la creación automática de ese campo ID, y lo hará de forma automática que sea un PrimaryKey, que Creo que es muy agradable, porque por lo general, eso es algo que desea tener, pero me gusta ponerlo en concreto, para que yo recuerdo que hay ahí. Pero si no se especifica que, que estarán allí automáticamente. Así pues, tengo una cita que es un DateTimeField, y todo estos diferentes campos, si mirar la documentación peewee, te dará una lista de los diferentes tipos de campos que se pueden utilizar. En su mayor parte, es análoga a lo que se vería en SQL. Así que hay una CharField, un VarCharFields, campos de texto, que son por mucho tiempo textos, como una entrada de blog potencialmente, DateTimeFields, DoubleFields, FloatFields, todas las cosas por el estilo. Y puede pasar en otros argumentos a él, que no especificó aquí. Digamos, por ejemplo, que no quiere permitir que dos mensajes tengan el mismo título, podría especificar algo como única = True, y eso es sólo un parámetro adicional para el campo que cuando se compila abajo en el SQL, especificará que tiene que ser único. También puede especificar algo como no nulo y todas las otras cosas lo hace normalmente en SQL. Por lo tanto, este es un muy simple modelo que tiene la fecha. Nótese aquí, dentro del DateTimeField, He especificado cuál es el valor por defecto es. He especificado que sea datetime.datetime.now, debido a la forma que esto se evalúa, que en realidad evalúa el DateTime.Now cuando que se inserta en la base de datos. Creo que, tendría duplicar comprobar esto, pero si lo has hecho algo como esto, a continuación, que en realidad evaluar que una vez, y luego el DateTime siempre sería la misma. Así que, si estás haciendo algo con datetimes, doble control que está evaluando cuando realmente se inserta, o bien puede ser confundido. El título es sólo una CharField, que hay son más argumentos se pueden pasar al especificar exactamente cuánto tiempo quiero que sea, pero aquí, realmente no importa. Y texto va a ser el texto de todo el post, y eso va a ser un TextField sólo porque usted quiere para permitir que sea una cadena bastante larga. Entonces tenemos esta Meta subclase que acaba Especifica que queremos la base de datos donde esto es en realidad abrió en ser el objeto db que tenemos aquí. Y lo último que tenemos aquí, es sólo esta función que vamos a usar desde nuestra aplicación principal para inicializar la base de datos para conectarse a y, a continuación para crear la tabla Post. Ahora, echemos un vistazo a la aplicación principal en sí. Así que este es un buen poco más largas que las que hemos visto antes, pero espero que no sea demasiado malo. Por lo tanto, permítanme expresar esto. Bueno. Así, se dio cuenta y la parte superior me importó un montón de otras cosas Frasco de que nosotros no tenemos realmente visto antes. Y es de esperar, podemos pasar por cada uno de ellos uno por uno y hablar un poco más sobre ellos, ordenados por ejemplo. Así, tenemos el frasco, y la render_template, que hemos visto antes, este objeto de solicitud, que se van a plantear cuando nos fijamos en la forma la forma que yo estaba mostrando realidad trabajos. Redirigir, que le permite redirigir detrás de la Crear Nuevo post Volver a la página original, y luego URL, que es algo que le permite averiguar en qué parte del sitio web una página en particular es. Así pues, la próxima cosa que hago, es que la importación toda la información de los modelos archivos que estábamos viendo. Y, sí. Por lo tanto, algo más nuevo que viene cuando usted está tratando, especialmente bases de datos, es que se puede especificar una función que es llamada antes cada petición, y la función que obtiene llamada después de cada solicitud, el uso de este solicitud función decoradora app.before. Y por lo que esto se ejecutan donde esta función es. Esto no tiene por qué ser llamada antes de la solicitud, pero por lo general eso es algo sensata llamarlo. Puede especificar cualquier función quiere ser llamado allí, así que he especificado esta initialize_db función que tuvimos allá por los Modelos archivo, por lo que antes de cada solicitud, quieren conectarse a la base de datos. Hay dos diferentes maneras que usted puede hacer esto. Usted puede hacerapp., I creo que es after_request. Y la diferencia entre after_request y teardown_request, es que after_request sólo sucederá si la solicitud en realidad era válida. Y así, sólo si el solicitud se ha realizado correctamente, si nada salió mal, pero teardown_request que sucede en el caso de un éxito solicitud, o en el caso de un error. Así que, por lo general, usted quiere utilizar teardown_request, a menos que quieres hacer algo, especialmente diferente en el caso de un error. Pero sólo por el cierre de la base de datos, si tiene éxito o si falla, hacemos que desea desconectar de la base de datos. Así se llama, db.Close en el objeto db. Observe que el teardown_request toma en una excepción. Así que usted puede comprobar si había en realidad un error cuando se estaba cerrando, pero aquí, es de esperar, hay no son un montón de errores, así que estamos sólo una especie de ignorar eso. Está bien, y el resto no es tan malo. Así que, cuando vamos a la página principal, prestamos plantilla home.html que se abrirá. El pase es en el post igual, y lo que esto hace es, recuerde que tenemos esta entrada modelo, por lo que seleccionar todos los mensajes, y luego otra cosa que puedes hacer, puede especificar la cláusula WHERE, puede especificar una ORDER BY, y así tomamos todos los mensajes que conseguir seleccionado, y luego les mandamos por el post.date.descending. Y eso va a especificar, cuando que en realidad salen, el más reciente será muy primera. Y luego, se pasa eso en la plantilla home.html, así que vamos a realmente abren Plantilla que realmente rápido, y echar un vistazo a cómo está funcionando. Y esto no es grande HTML, pero con suerte, podemos centrarnos en el Python. Así que hay un vínculo con el Agregar nuevo Publicar, por lo que este especifica la ruta dentro del frasco que definir, que está justo aquí. Esta es la nueva ruta de correos, y especificamos que aquí. Y lo que es un enlace que vaya a esa ruta dentro del servidor matraz. Lo más interesante es este bucle for aquí. Así se especifica que esta parámetro cargo que fue aprobada en el función render_template, por cada mensaje en el puesto de objeto que se pasa en. Queremos imprimir el título de la entrada, en H1, y luego más adelante, queremos imprimir el texto puesto dentro de un párrafo. Y aquí, podemos realidad llamar a una función de Python, por lo que podemos llamar strftime, RF en tiempo ST, y puede pasar en la cadena de formato que desea imprimir los datos en. Así que ha es bastante agradable que pueda realmente llamar a esta función Python desde dentro aquí. Usted no tiene que ver el formato de el lado del controlador, porque realmente, el formato de la fecha es algo que usted quiere tratar dentro de la Vista. Y todo esto por ciento las cosas no es super importante. Si se mira la documentación para la función strftime en Python, especifica todas estas cosas, pero eso de cómo, cuando estábamos buscando en la página principal de aquí, formatea esto con un buen fecha, y especifica AM o PM, pero normalmente, si no tenía esto aquí, probablemente obtendrá un poco de basura fecha que no se veía muy bien. Y luego especificamos el post.text, y pude han puesto un par de saltos de línea aquí, sólo para poner algunos espacios entre cada poste. Por lo tanto, creo que lo más importante cosa en este ejemplo, es que se puede utilizar este bucle for. Y esto es análogo a cosas que usted puede hacer en PHP. Puede recorrer, todo lo que se pasa en, y así, en lugar de tener que hacer copiar / pegar, copiar / pegar todo el HTML, sólo tienes que escribir una vez, y luego puedes iterar sobre todos los puestos. Y esto es algo común que desea hacer, cuando se tiene una gran cantidad de datos, es que para todo en sus datos, usted quiere hacer una cosa similar. Y entonces, sólo recuerda, que cuando se quiere imprimir algo explícitamente en el código HTML, se utiliza los dobles llaves aquí, pero luego, cuando desea especificar alguna información acerca de una condición, o alrededor de un bucle for, que utilizar el soporte por ciento. Así que, volviendo a la Python código, por lo que explica lo que está sucediendo en el principal ruta, cuando vamos allí, sólo muestra toda la mensajes, pero entonces la pregunta Es decir, ¿cómo podemos realmente llegar mensajes en la base de datos, que es un poco más interesante. Por lo tanto, al hacer clic en el Nuevo Publicar enlace, que vimos aquí, se le redirige a este formulario. Y eso es sólo una simple llamada a la función render_template, que luego pasa en el nuevo mensaje en formulario HTML. Así que vamos a echar un vistazo a eso. Así que éste es bastante simple. Tiene un formulario HTML simple, que se verá un poco familiar, basado en las formas en CS50 Finanzas. Y así, se especifica aquí, la acción. Y aquí, si estás trabajando con PHP, normalmente, sería algo así como: create.php, pero aquí que realmente especificamos una ruta dentro del servidor frasco. Y así, corresponde esta ruta para crear la ruta que tenemos aquí, que vamos a entrar en en un segundo. Y así, se especifica que es un método post, porque queremos enviar estos datos la forma, y ​​por lo general cuando usted va a enviar los datos de un formulario, es posible que desee utilizar una solicitud posterior, sólo para que no terminen con este grande, URL difícil de manejar. Pero también se puede utilizar una petición GET, y pasarlo con enrutamiento variables, sino por las formas, es bueno a una petición post aquí. Y entonces, al igual que lo haría con HTML y PHP, puede especificar estas entradas de texto, y puede especificar el nombre de ellos, y ese es el nombre que logrará pasado en el objeto solicitud dentro del frasco. Y luego tenemos un Presentar botón que dice Post. Y aquí, Post es el nombre de la botón, porque es una entrada del blog, pero aquí, post es el método de solicitud. Así que estos son la misma palabra pero en realidad no relacionado. Sí Volviendo al código Python, cuando llamamos al método de crear, notar aquí que pueda en realidad especificar dentro de la ruta los métodos de petición que desea aceptar, y aquí, puedo especificar que Sólo quieren aceptar un método Post. Así que, si realmente trato de visitar la página directamente, que está utilizando una solicitud GET, me lo dirá "Método no permitido." Y así, usted tiene páginas, algo así como esta página crear, que sólo soy realmente utilizando como una manera para que la forma de obtener presentó, puede especificar que no lo hace quieren que la gente sea capaz de ir allí directamente a través de una petición GET, o si no quieres, por alguna razón, una solicitud POST, usted podría especificar llegar hasta aquí, pero en este ejemplo, sólo quiere que la demanda Publicar salir. Así que, cuando create_post se llamara, cuando visitamos que a través de la demanda Publicar, cada vez que vas a un particular, ruta, hay un objeto de solicitud, y tuvimos que importar solicitudes en la parte superior, pero hay esta solicitud objeto que se pasa en, y se puede acceder a los datos del formulario, que automáticamente se llenan cuando se envía una solicitud de un formulario. Y entonces, lo que pienso es genial, se que el objeto de formulario para obtener pasó en, es sólo un diccionario de Python que contiene, si access-- asique, y mucho Me levanto del HTML junto a él, justo lo que puede tener que como referencia, sí, por lo los nombres que especificamos aquí para los diferentes campos, por lo que el título y el texto, hemos a continuación, sólo tiene que utilizar los mayores de aquí como índices en los datos del formulario. Así que es muy práctico. Entonces llamamos post.create, que va a crear e insertar automáticamente este nuevo puesto objeto en la base de datos. Y creo que esta función crear aquí es un ejemplo genial de cómo poderosa frasco está trabajando y con esto, porque si estuviera haciendo algo en PHP, puede que tenga que hacer un montón de validación, usted tendría que entonces establecer una conexión de base de datos, usted tendría que entonces ejecutar la consulta SQL, pero aquí sólo tenemos esta bonita post.create, que podemos entonces sólo obtener la información del objeto de la solicitud, y luego pasarlo a una nueva Post que estamos creando. Y luego, el último Lo que queremos hacer, es redirigir la volver usuario a la casa. Y por lo que utilizar este Frasco redirigir función. Y algo que no habíamos visto antes, era esta función URL. Así que la dirección URL de función permite se pasa en realidad el nombre de una función en el código Python, en lugar de la vía particular que está. Así que podría tener la misma facilidad redirigida a un usuario para recortar, que enviarlo de vuelta a casa, pero usando la dirección URL de la función es agradable, porque si cambia el lugar donde están las cosas, así que vamos a decir que puedo cambiar el casa para estar en / home en su lugar, esto sería aún después volver / home, porque en realidad va y mira hacia arriba el nombre de la función, y se le dará una copia de la URL para eso. Así que, más o menos en la supuesto de que eres más propensos a cambiar cuando las cosas son, que los nombres de las funciones. Puede utilizar esta realidad agradable URL para la función. Y una cosa a tener en cuenta que es un poco complicado, es que usted piensa que podría simplemente llamar a redirigir a la dirección URL para, pero en realidad todas las rutas tener volver algún tipo de texto y HTML, lo que en realidad tiene que devolver la llamada redireccionamiento. De lo contrario, usted obtendrá algo inválida por no devolver una cadena, porque todos ellos tienen que volver el código HTML que realmente quiere hacer. Y así, cuando se llama a la redirección, se le redirige a la página, pero en realidad devuelve el HTML que necesita para ejecutar esa redirección. Volver a la página principal. Así que tenemos estos dos puntos de vista diferentes. Tenemos la vista de inicio. O bien, supongo que debería decir plantillas. Tenemos estos dos plantillas, la plantilla de la casa que muestra todos nuestros mensajes, y entonces tenemos esta cosa anuncio, y al hacer clic en el cargo, se va a una nueva ruta dentro del frasco, pero ese camino no lo hace necesariamente tener una plantilla correspondiente. Usted no tiene que ver nada, pero todavía se puede tienen esta obra va detrás de las escenas. Y luego te redirige respaldar a la página principal. Y sin duda, es fácil de trabajar en algunos CSS más agradable en la plantilla y hacer que este se vea mucho más agradable, pero toda la lógica principal ¿hay en el Python. ¿Una pregunta sobre ese ejemplo? Sé que hay una gran cantidad de cosas diferentes pasando allí, un montón de cosas que no habíamos visto antes, pero como cualquier cosa. Sí. AUDIENCIA 1: ¿Tiene que hacer nada especial para fregar los datos que es Llegando por la forma? Me di cuenta de que acabas de decir "crear" ESDRAS Zigmond: Sí, así que eso es En realidad, eso es un muy buen punto. Así que la pregunta era, ¿verdad necesitará comprobar y asegurarse que los datos son válidos, y hacer cualquier tipo de lavado para asegurarse de que es válido, ya que como se puede ver aquí, No voy a hacer eso. Así que vamos a ver qué pasa si he puesto algo blanco. Así, va en realidad sólo hacer un mensaje en blanco y complete el DateTime. Así que en realidad, es probable que querer hacer algo como: quizá especificar si el título es igual a la cadena vacía, entonces no lo hagas. O bien, sólo lo hacen si el título es no es igual a la cadena vacía. Así que no es así en realidad de forma automática cuidar de que la depuración por usted, por lo que aún tiene que hacer eso. Sí, buena pregunta. AUDIENCIA 2: ¿Lo hace matorrales para inyección secuela? ¿Tú sabes? ESDRAS Zigmond: Con suerte, peewee hace eso. Creo que sin duda sería un bonito mala biblioteca si no lo hizo. No sé exactamente. Tendría que mirar el consulta que se genera. Creo que, si he escrito en un entrada de blog que tipo de mirada como un ataque de inyección SQL, algo como esto, si esto es como un campo de contraseña o algo así, usted puede hacer algo como esto. Creo que lo hará aún conseguir literalmente publicado, pero creo que peewee hace algún tipo de lavado de los datos antes de que realmente lo ejecuta. AUDIENCIA 1: Ese campo de texto es diseñado para sacar de texto sin formato, ¿verdad? ESDRAS Zigmond: Sí, lo es. Sí. Así que creo que todo el, así que esto es comportamiento correcto, que lo hará, pero creo que peewee esperemos que lo hace hacer algún tipo de protección en su extremo. Y si quería vuelva a comprobar que, no son formas cuando usted genera una consulta. por lo que no tiene que ejecutarlo directamente. Tendría que tomar una mirar a la documentación, pero en realidad se puede ver el SQL que se está generando, y echar un vistazo a eso, y hacer asegurarse de que se está escapando cosas. Otra de las razones por las que podría que desee ver en el SQL peewee que está enviando, es si las cosas parecen ir muy despacio, puedes echar un vistazo y ver lo que es realmente hacer, porque es a veces fácil de añadir accidentalmente en la forma de escribir que, usted puede querer tenerlo seleccionar toda la base de datos de primera, y luego hacer algo de operación de ordenación en eso, cuando realmente la intención de seleccionar un subconjunto. Y así, si las cosas no son bastante ir a la derecha, es bueno echar un vistazo a la solicitud eso es en realidad conseguir generado. Sí. AUDIENCIA 2: Cuando empezaste, se pone en el puerto como 5000. ESDRAS Zigmond: Sí. AUDIENCIA 2: Es el defecto con peewee, o es que algo puede cambiar? ESDRAS Zigmond: Sí, por lo que el puerto es por defecto con el frasco. Si lo ejecuta sin especificando nada, lo hará automáticamente que. Yo creo, tendría duplicar comprobar esto, pero se puede especificar que en el app.run, Creo que se puede hacer algo así, port = 8080. Vamos a darle una oportunidad que muy rápido. Sí, por lo que sólo puede especificar port = 8080, y se ejecutará allí, que creo que, si quería ejecutarlo en el IDE, no he probado esto, pero creo que si corrió en el puerto 8080, probablemente sería capaz para acceder al servidor, simplemente como si fueras de la página web. Sí, pero es fácil para cambiar eso si tener ningún tipo de redirección de puertos como cosas que usted necesita hacer. ¿Alguna otra pregunta? ¿Sí? AUDIENCIA 1: Entonces, vi en su modelos que, como usted ha mencionado, usted tiene que especificar el base de datos para cada objeto. ¿Por casualidad sabe, hace que hacen que sea muy fácil si usted tienen un montón de bases de datos SQLite que que desee utilizar para una aplicación web única, que sólo puede especificar un grupo de los diferentes en su modelo? ESDRAS Zigmond: Sí, me dejó abrir que hasta muy rápido. Por lo tanto, usted está diciendo, si usted quiere tener un montón de diferente algo, tal vez como y los estudiantes, para algunos razón, algo por el estilo? Sí, así que creo que todavía, cada modelo tendría que todavía tienen solo una base de datos asignado a la misma, pero si quería tener diferentes modelos que han asignado diferentes objetos de base a él, que sin duda podría hacer eso. Así que, si me creó una nueva, algo como esto, y ahora este es un estudiante que parece extrañamente como una entrada del blog, Yo podría especificar que el base de datos es igual a db_2 aquí. Por lo tanto, creo que esa es la camino principal se puede hacer eso. Guay. ¿Alguna otra pregunta? Así que para terminar un poco poco, he aquí algunos recursos, y estas diapositivas se publicarán en línea lo que realmente puede llegar a estos enlaces. Los mejores recursos son realmente la documentación para Frasco y Peewee sí mismos. Están escritos muy bien, creo. Así, el sitio frasco está aquí, y tienen un tutorial de inicio rápido que Caminaremos por similares cosas a lo que caminé por, pero si quieres cualquier tipo de opinión de las cosas que me acerqué, o usted pensó que yo expliqué algo de una manera confusa, tendrán ejemplos similares allí. Peewee tiene documentación, y tienen un tutorial de inicio rápido que va más de los parámetros principales que se desea utilizar. Así, las cosas que hablaron con los valores predeterminados únicas, y que especifiquen, los diferentes tipos de campos que se puede utilizar, los que todo estaría allí. Además, si usted tiene preguntas sobre peewee, y que los publique en stackoverflow, el tipo que hizo peewee realidad sigue y responde las veces. Si usted tiene una pregunta, es de esperar que va a ser capaz de responder a ella, porque escribió todo el asunto. Creo que eso es todo lo Quería cubrir. Gracias por venir.