[Música tocando] EZRA Zigmond: Oi, todo mundo. Obrigado por terem vindo hoje. Este seminário é "Python Web Apps com Flask ". Então, eu vou estar falando um pouco sobre o porquê você pode querer usar Flask para fazer aplicações web com Python, em oposição para alguns outros quadros lá fora, como Django, que é o mais bem conhecido. O subtítulo é "e peewee ", que é algo vamos falar sobre como para interagir com bancos de dados SQL. Isso torna muito agradável. Então, aqui é apenas um rápido resumo do que eu quero para passar por cima. Então, em primeiro lugar, apenas um slide que vai ser de início rápido, que é como começar tudo configurado no seu computador. Eu vou estar demonstrando esta na minha máquina local Mac, só porque é aí que eu fiz isso antes, eu estou mais confortável com isso, mas este é definitivamente possível sobre o CD50 IDE. Então, depois disso, eu quero introduzir o que é Flask, e convencê-lo porque você deve usá-lo em primeiro lugar. Então, eu vou dar uma rápida exemplo do que você pode fazer em Flask, um exemplo rápido do que você pode fazer em peewee, e então eu vou mostrar-lhe um mais aplicação exemplo completo que eu coloquei que nós pode percorrer juntos. E, em seguida, finalmente, em o último slide, eu tenho alguns recursos que você olha em on-line para obter mais informações. Esta não é uma solução completa tutorial de como usar Flask. E eu vou esperar para sair algum tempo para perguntas. Qualquer pessoa assistindo localmente, apenas como, gritar no meio se você tiver quaisquer perguntas. Então, material de instalação rápida, se você quiser acompanhar, ou se você deseja obter este -se em sua própria máquina, Eu vou estar usando Python 2.7.10. Flask faz o trabalho com Python 3, mas eu gosto usando Python 2, porque há alguns pacotes Python que Não trabalhamos com 3 ainda. Se você tiver instalado pip, que é um gerenciador de pacotes Python, Eu acho que se o seu Python é maior do que ou igual a 2.7.9, você tem isso já instalado, é super fácil de instalar esses pacotes. Você pode não instalar pip Balão, pip instalar peewee, Normalmente você tem que correr sudo apenas de modo que as permissões trabalhar fora. E, se você estiver usando um Super versão antiga do Python, Eu recomendo atualizar seu Python, ou usando EasyInstall instalar pip. Assim, a próxima pergunta é, qual é Flask? E eu acho que, em primeiro lugar uma pergunta razoável Fiquei imaginando por um longo tempo é, o que é um aplicativo web? Porque essa é uma palavra que eu acha que é jogado ao redor muito que eu realmente não sei. E eu acho que a melhor exemplo do que uma aplicação web é, realmente é CS50 Finanças, onde não é realmente apenas um site, mas é algo que você poderia classificar de interagir com. Existem contas de usuário e todos os tipos de coisas diferentes. Então, onde exatamente você chamar a A linha entre o que é um site, eo que é um aplicativo da web, é uma espécie de arbitrária, mas eu acho que a idéia, é algo mais do que um site e é uma aplicação útil. Então, Balão é uma estrutura para fazer aplicações web usando Python. E espero que, até o final deste, vou convencê-lo que você realmente pode escrever algo como CS50 Finanças utilizando Python, que eu como muito melhor do que PHP, pessoalmente. Então, é Flask, que eles chamam de um microframework, pelo qual, que significa que é muito simples, mas extensível. Então, ele tem apenas o que você precisa, mas se você quiser mais recursos, é fácil trazê-los. Mas só porque é um microframework, não faz significa que é apenas para pequenos projetos. Eu tenho um link que diz aqui que Obama usou Flask em 2012 para sua campanha site, que esperamos, é algo de um endosso. Mas a coisa que eu realmente gosto sobre Flask é que, ele realmente não faz qualquer tipo de decisões por você. Só porque somos falando de aplicações web, Eu tenho que compará-lo com Ruby on Rails e Django, sendo que ambos são grandes quadros, mas ambos fazem suposições sobre como você deseja interagir com bases de dados, como você deseja apresentar o seu pontos de vista, e eles são definitivamente bons aspectos a isso. Por exemplo, Ruby on Rails tem este sistema de registro ativo, que é um muito bom forma de interagir com dados, mas se você quiser usar Ruby on Rails, você está tipo de amarrado em que. Mas com Balão, como eu vou mostrar-lhe com peewee, você pode usar qualquer tipo de banco de dados que você quer, e você pode apenas puxar que em como uma extensão em Flask. É por isso que eu realmente como Flask, é que não faça suposições para você com base em coisas que você não precisa realmente. Então, por que você deve usar Flask? As vantagens são, apenas tem realmente os principais recursos construído para ele que você precisa. Assim, você não precisa se preocupar com entender um monte de coisas que você realmente não precisa. Você não tem que tem que se preocupar sobre como desativar recursos que você realmente não precisa. E, como já referi, é super fácil de adicionar, no prolongamento das coisas que você precisa. Alguns deles, Balão tem seu próprio suporte para ele. Portanto, há algo chamado Flask admin, que espelha o administrador painel que fornece Django, o que lhe dá uma forma visual agradável para administrar seu site. Mas, novamente, se você estiver fazendo algo simples, você provavelmente não precisa de um grande administrador painel, então eu acho que é super agradável. E são as desvantagens, isto você tem menos energia para fora da caixa. Então, quando você abre pela primeira vez Flask, e em seu programa Python, basta digitar a partir Flask import *, ou o que quer, você não exatamente obter todos as características que você pode querer. E então você tem que mais explicitamente listar as características que você deseja. Então essa é uma desvantagem, mas eu acho que para a construção de pequenos web aplicativos como eu vou estar mostrando você, isso não é realmente um problema. E o que é a última coisa deveria dizer, o que é um erro de digitação, é que existem menos padronizado convenções de como usar Flask, apenas porque não há como muitos as pessoas que o utilizam profissionalmente em comparação com Django. Então, se você olhar algo como: "como eu faço x" em Django, provavelmente você vai encontrá-lo. Há um bom design padrões que você pode usar, mas com Flask, é tipo de seguir seu próprio caminho, só porque ele é um muito pequena biblioteca. Portanto, estas são o desvantagens, mas acho que que ainda é uma boa biblioteca de usar. Então vamos pular direto para Flask. Este é definitivamente não vai para ser um tutorial completo, mas é para dar uma idéia de como estruturar as coisas, e assim você vai se sentir confortável fora e olhando para a documentação e descobrir mais. Então, deixe-me abrir um realmente exemplo simples à primeira vista, e mostrar-lhe o que isso parece, e então nós vamos decompô-lo um pouco mais. Portanto, este aqui, deixe-me fazê-lo funcionar. Então, agora tenho meu aplicativo em execução. Vou abrir o Safari, e ele está correndo no meu host local. Então, eu estou indo só para fazer esta maior. Mas localhost: 5000 E assim, agora, tudo isso faz é, quando você visitar o site, ele imprime "Olá Balão," o que não é super útil, mas eu acho que é legal que neste pequeno arquivo aqui, temos um servidor web rodando que está a imprimir algo. Então, vamos realmente olhar o código para um segundo, e decompô-lo um pouco. É o tamanho bom para todos aqui? Então, espero que, você está um pouco confortável usando Python. Estou assumindo que podemos olhar para o Python e ler através dele. Se você tem dúvidas sobre qualquer coisa, eu também posso passar por cima disso. Assim, a primeira linha é, de Balão, nós importamos, Balão com um capital "F" que é uma espécie de todo o características-chave que você precisa. Sempre que você está escrevendo um arquivo e usando Flask, você vai querer importar que, só porque que tem todas as coisas principais. A próxima coisa que fazemos, é que chamar essa função Balão, apenas para criar um objeto aplicativo, e você está sempre vai querer fazer isso. E, em seguida, para baixo para a saltar fundo rapidamente, esta parte aqui é, 'if_name _ == "_ main_" ", que é uma espécie de convenção Python. Então, isso só será executado se você executar esse arquivo diretamente usando Python. Em seguida, chamamos app.run, que será realmente começar o app vai. Então, essa é a estrutura principal que você vai ter em qualquer aplicação Flask, é que você vai ter essa app = Flask (_name_) e, em seguida app.run. Assim, as duas coisas que eu tenho aqui, são o que chamamos de rotas. Então, vamos falar sobre encaminhamento de um pouco mais. Eu vou voltar para o slide. Assim, o mais fundamental Conceito em balão é encaminhamento. E é a idéia de que você atribuir funções em Python para endereços particulares na sua página web. Assim, sempre que você quiser para criar uma nova rota, você usar esta @ app.route função decorador. Então, se você não estiver familiarizado com decoradores de função em Python, é que este conceito Permite tirar uma função e cercá-lo com outra coisa. Então, realmente, o que faz este decorador, é que leva a função abaixo dele, e acrescenta mais informações para ele, mas o que realmente Flask não fazer isso acontecer não é super crucial, mas o que é importante, é que, antes do percurso, colocar isso @ app.route, e, em seguida, o endereço do percurso, de modo que a barra é o que nós vimos quando basta abrir a página web. Então essa é a homepage. É apenas a rota barra. E então você tem essa função. O nome da função pode ser o que quiser. Não tem necessariamente tem a ver com a rota. E, em seguida, qualquer que seja retorno da função, a função deve retornar uma string. E essa seqüência pode contém HTML ou qualquer coisa, e que é realmente o que terá voltou para o seu navegador web como HTML, e ele irá processar isso. Portanto, este é o mesmo código que foi o exemplo de que eu apenas correu, por isso, quando visitar barra, ele chama uma função Olá mundo, que retorna apenas uma string, Olá Flask, e que fica impressa na tela. Portanto, há um outro exemplo, que é, quando você visita / Olá, ele imprime Olá Palavra, que deve realmente dizer, Olá Mundo, mas vamos fingir que foi intencional. Então, vamos puxar o real rápido. Então, se você ir para localhost / Olá, agora vai imprimir outra coisa. Então, isso é apenas um rápido exemplo de como você pode criar duas rotas diferentes. Então, até agora este não é super útil, não há um lote inteiro que você pode fazer, você poderia apenas fazer tudo isso com tendo diferentes páginas HTML, e quando você visita um determinado página apenas carrega a página. Então, vamos ver um pouco mais coisas úteis que você pode fazer. Então, uma coisa que você pode ter notado no exemplo que eu puxei acima, é que eu tinha app.run (debug = True). E assim, o que isso argumento de depuração faz, é que quando você executar o seu servidor web, quando você está em seu aplicativo, se você alterar um arquivo, ele será recarregar automaticamente o servidor. E para que você não tem que realmente restart Python, que é super útil. Eu posso mostrar isso. Deixe-me puxar para cima o meu código com o erro de digitação na mesma, e fingir que typo foi colocado ali intencionalmente para fins instrutivos. Então, vamos adicionar esta de volta. Então, agora ele diz Olá Mundo. Vou guardá-lo. E se nós puxamos de volta o terminal, você vai dizer que ele está reiniciando, porque ele detectou uma alteração, e assim agora quando recarregar esta página, ele irá imprimir a coisa correta. Então debug é super útil para isso. Além disso, se você tem qualquer tipo de acidente, de modo deixe-me fazer esta falha de aplicativo por tê-lo não retornar uma string. Então, vamos apenas tê-lo Nenhum voltar por algum motivo. E então quando eu visitar esta página, ela só vai falhar, mas o servidor não apenas curso, que na verdade, dá-lhe uma volta super útil traço de tudo o que deu errado. E o que é muito bom, é que em qualquer passo nesse traço de volta, você pode abrir um interativo shell aqui, e tipo de imprimir o que variáveis ​​que você quiser dar uma olhada. E assim a depuração é realmente útil para descobrir o que está acontecendo com o seu servidor, em vez de apenas vê- algo em PHP como um 500 interna erro do servidor, que é super inútil. Uma coisa a ter em conta, é que se você colocar seu aplicativo on-line por isso é visível para o público, você nunca quer sair no modo de depuração, Porque as pessoas podem realmente usar esse console que eu mostrou que você execute código arbitrário. Assim, eles podem imprimir como qualquer códigos secretos que você tem lá, eles podem olhar exatamente como seu site está funcionando. Então, é realmente útil para o teste, mas sempre certifique-se de tirá-lo antes você publicar alguma coisa online. Então, quando você estiver usando algo como PHP, há esta idéia que você pode passar informações entre as páginas web colocando a informação efectivamente no URL, que é um pedido GET, mas na garrafa, você pode, na verdade, fazer algo mais ou menos como que, por ter um percurso que possui uma variável como parte do mesmo. Então, se você olhar para este exemplo no ecrã aqui, temos uma rota que é ('/ Olá /'), e assim, se você visitar / Olá / alguma coisa, algo que vai realmente ficar cheia na variável nome. E observe que a função que vem com essa rota tem que tomar no parâmetro nome, de modo que ele vai realmente são passadas para a função. E então, quando você está Dentro dessa função, você pode tratar isso como Python uma variável normal, e assim, em seguida, ele irá imprimir Olá, e preencherá o nome usando alguma formatação string. Então, para adicionar partes variáveis ​​para um roteamento, você usa o suporte de ângulo de marcação. E, opcionalmente, você pode usar o que é chamado um conversor. E assim, se você colocar isso anotação com o cólon, você pode especificar que é um int ou um float, ou caminho, e ele irá converter automaticamente esse. Você também pode fazer a conversão dentro da função Python, apenas usando um elenco, mas às vezes se Você quer garantir que ele é um int, você pode colocar que regra de conversão lá. Então, vamos puxar para cima um exemplo de algumas regras variáveis. Assim, aqui, esta possui a mesma básica estrutura com a importação de Flask Flask, o app = Flask (_name_), e, em seguida, ele está sendo executado no final. Nós temos estes dois diferente rotas variáveis ​​aqui. E a primeira, é o que eu mostrei na corrediça, a qual era que ele só tem um nome de seqüência e ele vai imprimir Olá, Nome. E então, o segundo um usa a conversão. Então, isso vai convertê-lo automaticamente para um int, e, em seguida, o dobro do int, e imprimir isso. E, nós não fazemos qualquer tipo de conversão dentro dele porque Flask cuida disso. Então, vamos começar esta corrida. Quando você tem um Flask aplicativo em execução, Você pode controlar-C fora dele para parar o servidor em execução. E então eu vou correr as variáveis. Então vamos para localhost / Olá / Esdras e Felizmente, isso vai dizer Olá para mim. Por isso, tomou em meu nome, na variável rota, e encheu-lo aqui. Então eu também vou mostrar um rápido exemplo da duplicação. Então, se você vai para / double / 3, ele irá imprimir 6. Portanto, este teve o cuidado de a conversão para nós. Então, você também pode fazê-lo com float, e algo especial, se você precisa especificar algo como um caminho, que permite que ele aceitar barras, mas que geralmente não deve ser um problema. Até aqui, ainda tenho apenas sido voltar cordas, o que não é muito interessante. Na verdade, poderíamos voltar string HTML literal. Assim, no código podemos inserir algo como o tag-b para torná-lo em negrito, mas a maioria do tempo você não realmente querem estar escrevendo código HTML em seu código Python. Fica realmente confuso, e não é um bom momento. Flask nos permite separar o HTML para o que é chamado de Modelo, e por isso, se você está pensando em termos de modelo MVC que você está familiarizado com, esperançosamente, de trabalhar com CS50 Finanças um pouco, você pode pensar dos arquivos Python como sendo mais do Controller, onde eles estão interagindo com o que quer modelo de dados que você pode ter. E então eles estão chamando de Visualizações e passando informações para que Vista para preencher as informações em HTML que ele precisa. E o que nós chamamos esses Visualizações Modelos estão em sala de aula. Então Flask usa outro Python módulo que ele será automaticamente instalar quando você instala pip Garrafa chamado Jinja, que permite-lhe adicionar estes anotações para o HTML que você vê na tela, que permite que você colocar em coisas como condicionais, e loops para o HTML. Portanto, parece um pouco como como você pode usar o PHP em um arquivo HTML, mas isto é apenas quando o Flask servidor serve o arquivo HTML, ele será executado este motor de templates e analisar através deste e preencher as coisas em. Então Flask tem uma função render_template que você pode ver na parte inferior aqui. E assim, quando você visitar esta página, ele tornaria este modelo hello.html, e em seguida, preencha esta página HTML. Então vamos executar este verdadeiro rápido, e ver o que parece, e então eu vou passar por um pouco em maior detalhe. Assim, seus modelos vão para ir em uma pasta de modelos. Ele vai olhar automaticamente dentro do Templates pasta para esse modelo. Então, vamos abrir isso. Então, eu vou executar o exemplo Templating. Então, se eu ir para / Olá / Ezra, ele tem essa horrível, tag marquise detestável que eu coloquei em. Muito bom, muito dinâmico. Eu sou um grande fã. Mas o que acontece se Eu só ir para, / Olá? Então, ele apenas diz Olá Mundo. Eu não passar-lhe um nome, e encheu-o automaticamente. Então, vamos ver como ele fez isso, e como podemos nos livrar dessa marquise talvez. Então, aqui, este é o tipo de um exemplo interessante de, se você estiver familiarizado com a forma como interruptor declarações trabalhar em um idioma. Dizer que este é tipo de como, esse tipo de queda, através, onde você realmente anexa dois diferentes rotas para a mesma função. Por isso, anexar o / Olá rota e o Olá / nome da rota / para Olá, e nós especificar using-- Python permite que você especifique função arguments-- padrão por isso, se não há nenhum nome, de modo se formos a apenas / Olá, ele irá filtrar automaticamente para nome é igual a None. Assim então, nós tornar o Molde com name = nome, por isso vai passar no parâmetro nome igual a este parâmetro função nome, para o modelo. Isso ainda não explica como é decidir se deseja imprimir Olá Mundo, ou imprimir o meu nome. Então vamos realmente olhar no próprio modelo, e ver onde isso está vindo. Assim, dentro deste modelo, nós realmente tem alguma lógica condicional, que algumas pessoas iriam argumentam, você, na verdade, não deve ter um monte de condicional lógica dentro do seu próprio modelo. Deve ser mais dentro do Controlador, mas para este exemplo é algo muito pequeno. Então, aqui, vamos verificar, se o nome, então se o nome não é igual a nenhum, se um nome é, na verdade, transmitido, então vamos dizer Olá, nome com o cabeçalho e da marquise, tudo isto HTML normal, caso contrário, iremos imprimir Olá, mundo apenas normalmente. Então, algumas coisas a notar aqui sobre como formatar a modelagem, é que, todos estes instruções condicionais, tipo de como como nós PHP quando você quer inserir alguns PHP, você usar a menos que pergunta marca, é uma espécie de análogo aqui com o {%. Então, aqui, temos o nosso código condicional. E então, quando você realmente quer literalmente avaliar alguma coisa, e de impressão -lo para a tela, você usar as chaves duplas. Então, aqui estão as chaves duplas, e, depois, especificar o nome, dentro desse, ele irá avaliar para o nome da variável, que foi aprovada em do tornar função de modelo, ao invés de apenas impressão fora, se nos livramos deles, seria apenas imprimir a palavra "nome". Então, isso é algo que atente para. Portanto, outra coisa a aviso é que, quando quer usar o função render_template, nós realmente temos que importar -lo explicitamente a partir Flask. E este é um exemplo de a modularidade do Flask, que você não tem que importar coisas que você não precisa. Você pode apenas trazer o Funções que, na verdade, precisa, que é às vezes agradável, para que você não tem que ter todas estas funções sentando-se em torno de que você não está usando, mas também, se você se esqueça que você precisa importar render_template, você provavelmente vai receber um aviso que vai deixar você saber sobre isso. Então, que é de templates. Então, nós mostramos como fazer páginas da web simples, e adicione um pouco mais lógica para que, em termos de roteamento variável. Ele permite que você faça coisas diferentes com base em URL que você vá para, e também, em seguida, dar- o HTML um pouco mais de sentido em termos de como você deseja processar as coisas. Você não tem que colocar tudo seu HTML no seu Python, mas para praticamente todas as aplicações web, você vai querer algum tipo do modelo de dados a ele associado. E assim tradicionalmente, este seria ser algo como um banco de dados SQL. E você pode apenas interagir diretamente com SQL. Python tem, eu acho que é chamado. SQLite 3. Você pode apenas importar SQLite 3 e executar consultas SQL diretamente, mas eu não sei sobre você, mas eu realmente não gosto, apenas, escrevendo consultas SQL. Ele tende a ficar realmente longa e complicada. E assim, algo que Eu gosto de usar é o que é conhecido como um ORM, que é um mapeamento objeto-relacional. E o ponto de um mapeamento objeto-relacional, é que existem dois diferentes maneiras que você pode pensar em bancos de dados. Assim, o exemplo que Professor Malan normalmente utiliza em sala de aula, é a tabela de Excel, onde você tem essas linhas e essas colunas, e isso é realmente útil para como ela é representada na SQL e como você interage com ele, mas uma outra maneira que é, na verdade, útil para pensar sobre isso, por vezes, é em termos de classes e objetos. Então, ao invés de pensar de cada tabela como tendo esta linha que tem certa informações, você pode, na verdade, pense nisso como sendo cada mesa é uma classe, e depois a cada instância do classe tem certas propriedades. Assim, neste exemplo, as instâncias de a classe são as linhas da tabela, e, em seguida, cada propriedade faria ser uma coluna na tabela. Assim, o ORM que eu gosto usar é chamado peewee. É realmente pequeno, uma espécie de balão. Eu acho que eles vão bem juntos, mas há um monte de outros ORMs que você pode usar. A mais popular é uma conhecido como SQLAlchemy, e eu não me lembro por que eu originalmente escolheu peewee sobre SQLAlchemy, ou gostaria de dizer porque eu acho que é o melhor, mas nós apenas estamos indo para usar este um, porque eu sei como usá-lo. Então, uma pergunta é, por que você deve se preocupar usando um ORM, em vez de apenas diretamente escrever consultas SQL? E eu acho que o melhor caso, é que você realmente não tem que escrever consultas SQL. É muito mais fácil, como eu vou mostrar-lhe, para fazer coisas como seleção, inserção, eliminação, especialmente a criação de tabelas. É muito mais fácil escreva uma estrutura de classe, que é para estruturar um Criar Declaração de mesa, mas uma coisa estar ciente de, é que o ORM, que vai tentar o seu melhor para descobrir o que o mais consulta SQL eficiente seria, mas às vezes ele erra. E especialmente se você é trabalhar com uma grande base de dados, você pode notar que uma consulta que devem ser executados rapidamente, está realmente levando mais tempo. E se você olhar sob o capô com o quão o ORM é interpretar isso em SQL, ele poderia estar fazendo algo realmente ridículo, só porque ele espécie de gesticulou suas intenções errado. E, houve momentos em que Eu tive que substituí-lo, e apenas executar minhas próprias consultas SQL, apenas porque foi analisar de uma forma estranha. Assim, há alguns sobrecarga, apenas no caminho que compila seu declarações para baixo em SQL. Então, vamos olhar super rapidamente em um exemplo simples de um modelo de dados que você pode usar. Então, essa é código Python, e por isso a primeira coisa que você quer fazer é de peewee import *. Assim, ao contrário Flask, onde você tem todos estes módulos individuais, e você deseja importar Flask, e escrever um modelo, e alguns outros que veremos mais tarde, a partir de peewee, você pode simplesmente importar tudo, porque é um muito pequena biblioteca. Então, a primeira coisa que você quer fazer, é realmente criar este objeto de banco de dados. Então, você tem db = SQLiteDatabase, e, em seguida, o nome do seu banco de dados. E isso vai realmente criar um objeto de banco que você pode interagir com, com peewee. E, em seguida, temos a real modelo que queremos criar. Assim, a tabela que queremos criar. Assim, dentro de peewee, cada classe tem sua própria tabela de dentro de seu banco de dados. Assim, todas as classes herdam o modelo de base, e do modelo de capital M é algo que está definido no peewee. Assim, todos os seus modelos devem herdar como seu mais alto superclasse, eles devem herdar da modelo, mas o que é muito legal, é que você pode realmente ter o seu modelos herdar um do outro. E uma grande parte do tempo, o seu modelos de dados não necessariamente fazer uma hierarquia de herança agradável, mas momentos em que eles fazem, é muito bom, porque você tem o modelo inerente um do outro. Assim, definimos esta classe 'estudante', que herda um modelo, e que possui três propriedades. Ele tem um ID, que é um PrimaryKeyField, que é algo que é fornecido por peewee, nome é uma CharField, e uma nota é uma IntegerField. Portanto, este pode ou não ser como CS50 na verdade, armazena todos notas dos alunos. Não é, mas isso é como eu faria isso. E então ele tem, dentro de esta classe, e isso é algo que você pode fazer com Python, você pode ter classes aninhadas. E isso é algo o que é exigido por peewee. Então, essa classe Meta, você tem para especificar que o banco de dados é igual ao objeto que criamos acima. E isso diz que arquivo é esta tabela realmente vai ser contido no. Então, isso é algo que você tem para fazer a todos os seus modelos. Você apenas tem que especificar dentro desta classe Meta esse banco de dados é igual a db. Então, o que eu costumo fazer, se eu tiver um monte de diferentes modelos, é que eu tenho uma base de modelo, que eu costumo apenas chamar "modelo básico" que tem a classe Meta, e define o banco de dados igual a db. E então todos os meus modelos subseqüentes herdarão a partir dessa classe base. E então eu não tenho que preocupar-se sobre a definição da classe Meta. Assim, quando este realmente fica compilado para baixo em uma instrução SQL, parece que essa coisa desagradável para baixo aqui, "Criar tabela carteira de estudante inteiro, " tanto faz. E, eu acho que ele é mais curto, esta consulta SQL aqui mesmo, mas se você olhar para esta classe aqui você pode ver exatamente o que está acontecendo. Você pode ver que tipos de campos existem, o que eles estão são chamados, e assim, eu acho que olhar para este código Python é muito mais legível do que tentando escrever essa consulta SQL. Assim, a fim de efectivamente usar o banco de dados, temos que conectar a ele dentro de Python. Então, eu costumo escrever uma função chamada initialize_db que faz duas coisas. Leva na base de dados objeto db e conecta a ele, que só abre up seção para o banco de dados. Se você está apenas executando embora site em sua máquina local, não é um super grande coisa para se preocupar sobre a conexão e desconexão, mas se você estiver executando lo em um site, você quer ter a certeza de que, sempre que um usuário conecta a ele, quando se fecham para fora o site, eles desligar para que você Não temos um monte de pessoas conectadas para seu banco de dados de uma só vez. E então, quando você conectar-se ao banco de dados, que deseja chamar db.create_tables, e listar os modelos para o que você quer para criar tabelas. Então, aqui, eu só quero criá-lo para esse estudante. E então, o que é importante, é especificar segura = True a maioria do tempo. Então, o que esta declaração vai fazer, é que ele cria tabelas para a modelo do aluno, mas apenas se essa tabela não tem já foi criado. Isso é o que especifica o cofre. Por isso, não irá substituir sua tabela existente, ele só irá criar um novo mesa se não houver ninguém lá. Então, você poderia simplesmente criar as tabelas de uma vez usando SQL. E então tem que estar de banco de dados lá, e, em seguida, conectar-se a cada vez, mas normalmente é bom apenas para colocar no presente convite create_tables, de modo que, se você nunca excluir seu banco de dados quando você executar o seu web aplicativo novamente, ele irá recriá-lo. Assim, apenas se certificar de que segura é especificado para ser verdade, ou você vai encontrar os seus dados apenas ficando cada vez derrotado. E então, você pode apenas chamar initialize_db para estabelecer uma conexão, e criar tabelas se necessário. Então, a coisa mais comum que você vai querer fazer, ou uma das coisas mais comuns, é realmente inserir coisas em seu banco de dados. E assim, em vez de ter para escrever um INSERT INTO indicação com todos Os valores especificados, você pode realmente chamar função na classe estudantil. Então, quando você cria uma classe que herda de modelo, ele tem esse método cria. Então, você faz classe name.create, e você especificar os parâmetros que você quer passar em. Então, se eu quiser adicionar alguns alunos ao nosso exemplo livro de notas CS50, Vou colocar em David, que tem um muito boa qualidade, ele tem uma 95. E eu, que não está fazendo tão bem em CS50, eu tenho um 50. E assim, a coisa agradável sobre o que essa função faz criar, é que ele retorna a instância, ou o linha, que ele criou dentro da tabela, e assim então você armazenar isso em um variável, e trabalhar com ele mais tarde. Você pode mudar ao redor, que Vou mostrar um exemplo de. Repare que eu não fiz tem de especificar o ID, porque uma vez que é o PrimaryKeyField, ele será automaticamente incrementá-lo se você não especificá-lo. E, de fato, você provavelmente não deve especificá-lo, porque você pode acidentalmente espancar ID de outra pessoa. E você quiser fazer Certifique-se de que ele é único. Assim, na verdade, o mais coisa comum que você quer fazer, é provavelmente a escolha do banco de dados uma vez que você tem um monte de informações lá. E assim, se você quiser começar tudo, de modo que o equivalente da estrela seleccione declaração de estudantes, seria apenas student.select. E isso vai lhe dar de volta uma matriz com toda a estudante objetos nele que você iterar sobre você quer. Você pode fazer as coisas de fora. E na maioria das vezes, você não só quero fazer seleto, você realmente deseja especificar alguma coisa. E assim, você pode cadeia Juntas, essas chamadas de função, como a forma como você faria cadeia em conjunto as declarações em SQL. Assim você pode fazer student.select (). Onde neste exemplo. E então, você pode especificar as condições, apenas usando normal do Python Booleans para verificar as coisas. Então, neste caso, você quer limitar o que você está selecionando para, onde student.grade é igual a 50, e student.name é igual a Ezra, de modo que só vai me tirar isso. E observe, um realmente coisa sutil aqui é que, se você deseja especificar um e / ou um ou e / ou, em Python, você usaria normalmente, Acho que a palavra "e" na verdade, mas aqui você usa o único e comercial, que é normalmente um operador bit a bit, mas, neste caso especial, apenas a maneira peewee faz isso, você usa o único E comercial para especificar "e". Isso é algo que I se misturam muito, mas ele não vem para cima que muito na prática. E então, quando você tem todos os estudantes para fora da base de dados, depois de ter feito você selecione e seu desgaste ou qualquer outra coisa, você pode usar um loop foreach, apenas como normal em Python, com qualquer tipo de iterador ou com qualquer tipo de matriz. Assim você pode fazer, para s em student.select (). whe re (Student.grade <75), e por isso esta vontade iterar sobre cada aluno na tabela cujo grau é inferior a 75, a qual neste caso, ainda é só comigo. E, em seguida, você poderia fazer algo dentro que loop, como enviar-me um email e eu realmente dizer virar em meus Conjuntos de Problemas. Então, outra coisa que você puder fazer, é que é muito fácil para atualizar linhas dentro da tabela. Então, lembre-se de volta para cá, seu quando eu inserido, Peguei o valor que foi retornado por student.create, e eu atribuído a nome chamado Ezra. E agora, você pode mudar o valores dentro dessa instância, assim como você faria um classe normal em Python. Assim, você pode definir ezra.grade = 95 e que irá atualizar a cópia local, mas se você realmente quer cometer essa mudança de banco de dados, você tem que chamar ezra.save, para que você chamou o método .Save na instância. E agora, eu mudei com sucesso meu próprio grau dentro do banco de dados. Assim, então vamos dizer que eu pego mudando minha nota no banco de dados. Professor Malan é provavelmente vai querer me excluir da classe, e assim você pode chamar o .delete método de instância apenas nessa coisa. Então, se você queria ir de volta a este ciclo aqui, e, na verdade, em vez de enviar e-mails todos os dos estudantes cujo grau é menos de 75, que queria excluí-los, dentro deste ciclo que podia chamar instância s.delete. E a última coisa que você quer fazer, é sempre que você estabelecer uma conexão, e está feito com o seu trabalho, que deseja chamar db.close, onde é que banco de dados db objetar que tínhamos antes. E você quiser ter certeza de que tudo fica fechado de fora. Frio. Então, agora, eu tenho um aplicativo de exemplo. Eu tipo de pré-fabricados tudo apenas de modo que não haverá qualquer codificação vivo erros, mas podemos caminhar através ele e ver como você colocaria Flask e peewee juntos, e fazer um aplicativo simples. Eu chamo-CS50 divertido, e é uma espécie de plataforma de blog simples. Então, em primeiro lugar, eu vou executá-lo e mostram o que parece, e então nós podemos olhar mais para o código. Ok, então vamos executar este. Cool, eu vou fazer isso um pouco menor. Não é muito bonita, só porque Eu não fiz um monte de CSS, mas o que ele faz é, ele tem esse banco de dados de mensagens de blog, e ele passa por todos los, e vai exibi-los na página na ordem do mais recente. E assim estes são apenas alguns posts que eu tinha guardado no banco de dados. Portanto, se queremos criar uma nova post, podemos ir para adicionar um novo post, e nós podemos introduzir o título do post, então algo como, seminário CS50. Wow, realmente gostando do seminário. Frio. Em seguida, você pressionar post, e vai redirecioná-lo de volta para a home page, e então você vai ver que a última mensagem foi adicionada. E ainda temos todos os que lá. Então, agora, vamos percorrer todo o código e ver como isso é implementado. Então, eu acho que a primeira coisa que vamos Dê uma olhada, é na verdade os modelos. Uma grande parte do tempo, quando você está projetando algo, você quer pensar primeiro sobre como você está indo para representar seus dados, e, em seguida, projetar coisas ao seu redor que, para que tudo faz sentido. E isso é realmente como eu fez isso quando eu estava fazendo isso, Eu sentei e pensei, o que eu quero em um post. Então, aqui, temos a mesma estrutura que eu estava mencionando anteriormente, onde fazemos db = SqlDatabase ('posts.db'). Na realidade, você provavelmente não quer código rígido em bancos de dados é o seu nome. Isso provavelmente deve ser um parâmetro que está armazenado em algum lugar, talvez em um arquivo de configuração, mas em um pequeno exemplo como este, não há problema em codificar que em. Então, agora, temos essa classe Post, que herda a partir do modelo base. E tem, novamente, o ID = PrimaryKeyField. Na verdade, se você não especificar, se eu realmente me livrei disso, peewee então vamos cuidar de criando automaticamente o campo ID, e ele será automaticamente torná-lo um PrimaryKey, que Eu acho que é muito bom, porque normalmente, isso é algo que você quer ter, mas eu gostaria de colocá-lo em particular, apenas para que eu lembre-se que ele está lá. Mas se você não especificar que, que vai estar lá automaticamente. Assim então, eu tenho uma data que é um DateTimeField, e todos esses diferentes campos, se você olhar a documentação peewee, ele vai lhe dar uma lista dos diferentes tipos de campos que você pode usar. Para a maior parte, é análogo para o que você veria em SQL. Portanto, há uma CharField, um VarCharFields, TextFields, que são por muito tempo textos, como um post de blog potencialmente, DateTimeFields, DoubleFields, FloatFields, todas as coisas assim. E você pode passar em outros argumentos para ele, o que eu não especificou aqui. Digamos, por exemplo, você não quer permitir que duas mensagens de ter o mesmo título, você pode especificar algo como única = True, e isso é apenas um parâmetro extra para o campo que quando ele compila-lo para baixo para o SQL, que especificará que tem que ser único. Você também pode especificar algo como não nulo e todas as outras coisas você normalmente faz em SQL. Então, este é um bem simples modelo que tem a data. Observe aqui, dentro do DateTimeField, I especificado que o padrão é. I especificado que seja datetime.datetime.now, devido à forma que isso fica avaliada, que realmente avalia o datetime.now quando ele é inserido no banco de dados. Eu acho que, eu teria para verificar isso, mas se você fez algo parecido com isto, então seria realmente avaliar que uma vez, e, em seguida, o datetime seria sempre a mesma. Assim, apenas se você está fazendo algo com datetimes, verifique que está avaliando quando na verdade, é inserido, ou então você pode ser confundido. O título é apenas uma CharField, que há são mais argumentos você pode passar especificando exatamente quanto tempo você quer que seja, mas aqui, isso realmente não importa. E texto vai ser o texto de todo o post, e que vai ser um TextField só porque você quer para permitir que ele seja um tempo muito longo string. Então nós temos esta Meta subclasse que apenas especifica que queremos que o banco de dados onde isso está realmente aberto para a ser objeto db que nós temos aqui. Ea última coisa que temos aqui, é apenas esta função que vamos usar de nosso aplicativo principal para inicializar o banco de dados para se conectar ao -lo, e, em seguida, para criar a tabela Post. Agora, vamos olhar para o próprio aplicativo principal. Então, este é um bom pouco mais do que os que já vimos antes, mas espero que não muito ruim. Então, deixe-me estender isto. Ok. Então, observe o topo e eu importados um monte de outras coisas Garrafa de que não temos realmente visto antes. E, esperamos, podemos passar por cada um destes, um por um e falar um pouco mais sobre los, classificado por exemplo. Então, nós temos o Flask, e o render_template, que vimos antes, este objeto do pedido, que vai vir para cima quando nós olhamos como a forma que eu estava mostrando realmente funciona. Redirecionar, que permite redirecionar de volta do Criar Nova Mensagem regressar à homepage original, e em seguida, URL, que é algo que o deixa descobrir onde no o site de uma determinada página é. Assim então, o próximo coisa que eu faço, é a importação I todas as informações a partir dos modelos arquivos que estávamos apenas olhando. E, sim. Então, alguma coisa nova que vem até quando você está lidando com, especialmente bases de dados, é que você pode especificar uma função que é chamado antes cada pedido, e função que recebe chamado depois de cada pedido, usando essa pedido função decorador app.before. E para que isso irá obter executado sempre que esta função é. Isto não tem que ser chamado antes do pedido, mas geralmente isso é algo sensato para chamá-lo. Você pode especificar qualquer função você quer se chamado lá, então eu forneceu esta initialize_db função que tivemos de volta nos modelos arquivo, portanto, antes de cada solicitação, você deseja se conectar ao banco de dados. Existem dois diferentes maneiras que você pode fazer isso. Você pode fazerapp., I acredito que é after_request. E a diferença entre after_request e teardown_request, é que after_request só vai acontecer se o pedido era realmente válido. E assim, somente se o solicitação foi bem-sucedida, se nada desse errado, mas teardown_request acontece no caso de um bem sucedido pedido, ou no caso de um erro. Então, normalmente, você quer para usar teardown_request, a menos que você quer fazer alguma coisa, especialmente diferente no caso de um erro. Mas apenas para fechar o banco de dados, se ele for bem-sucedido ou se ele falhar, que quer desconectar a partir da base de dados. Então, ele é chamado, db.close no objecto db. Observe que o teardown_request leva em uma exceção. Assim, você pode verificar se houve realmente um erro quando ele estava fechando, mas aqui, espero, não não são um monte de erros, por isso estamos apenas uma espécie de ignorar isso. Ok, eo resto não é tão ruim. Então, quando vamos para o home page, que rendeu este modelo home.html que vai abrir. A passagem está em pós igual a, e que esta faz é, lembre-se que temos este post modelo, por isso, selecione todas as mensagens, e, em seguida, outra coisa que você pode fazer, você pode especificar a cláusula WHERE, você pode especificar um por ordem, e assim que nós tomamos todas as mensagens que obter selecionado e, em seguida nós requisitá-los pelo post.date.descending. E isso vai especificar, quando eles realmente sair, o mais recente será muito primeiro. E então, nós passar isso para o modelo home.html, então vamos realmente abrir Template que realmente rápido, e dar uma olhada em como isso está funcionando. E isso não é grande HTML, mas esperançosamente, podemos nos concentrar no Python. Portanto, há um link para o Add New Post, e por isso este especifica a via dentro da garrafa que nós definir, que é aqui mesmo. Esta é a nova rota post, e especificar que até aqui. E assim que é um link que irá, em seguida, ir para esse percurso dentro do servidor Flask. A coisa mais interessante é este loop for aqui. Por isso, especificar que este parâmetro post que foi passado para o função render_template, para cada post no post de objeto que é passado no. Queremos imprimir o título do post, em H1, e, em seguida, abaixo, queremos imprimir o texto dessa mensagem dentro de um parágrafo. E aqui, nós podemos, na verdade, chamar uma função Python, assim que nós podemos chamar strftime,-RF-time ST, e você pode passar na seqüência de formato que você deseja imprimir os dados no. Então está é muito bom que você puder realmente chamar esta função Python de dentro aqui. Você não tem que fazer a formatação em lado do controlador, porque realmente, formatar a data é algo que você quer tratar dentro do Vista. E tudo isso por cento as coisas não é super importante. Se você olhar a documentação para a função strftime em Python, ele especifica todos estes coisas, mas isso é como, quando estávamos à procura na home page aqui, formata isso com um bom data e especifica AM ou PM, mas normalmente, se nós não tinha isso aqui, você provavelmente vai ter algum lixo data que não parecia muito bom. E, então, especificar o post.text, e eu podia ter colocado um par de quebras de linha aqui, apenas para colocar alguns espaços entre cada post. Então, eu acho que o mais importante coisa neste exemplo, é que você pode usar isso para loop. E isto é análogo coisas que você pode fazer em PHP. É possível percorrer, tudo se passou em, e assim, em vez de ter que fazer copy / paste, copiar / colar todo o HTML, você apenas tem que escrever uma vez, e, em seguida, você pode iterar sobre todas as mensagens. E isso é algo comum que você quer fazer, quando você tem um monte de dados, é que para tudo em seus dados, você quer fazer uma coisa semelhante. E, em seguida, lembre-se, que quando você pretende imprimir algo explicitamente no HTML, você usa as chaves duplas aqui, mas depois quando você quiser especificar algumas informações sobre uma condição, ou cerca de um loop for, você utilizar o suporte por cento. Então, voltando para o Python código, de modo que explica o que está acontecendo no principal rota, quando vamos lá, ele só exibe todas as mensagens, mas, em seguida, a questão é, como é que vamos realmente começar mensagens no banco de dados, que é um pouco mais interessante. Então, quando você clica no New Link do post, o que vimos aqui, ele redireciona para este formulário. E isso é apenas uma simples chamada para o função render_template, que, em seguida, passa no novo cargo em formulário HTML. Então vamos dar uma olhada nisso. Então, esta é bastante simples. Tem um formulário HTML simples, que vai olhar um pouco familiarizado, com base nos formulários em CS50 Finanças. E assim, nós especificar aqui, a ação. E aqui, se você está trabalhando com PHP, normalmente, seria algo como: create.PHP, mas aqui nós realmente especificar uma rota dentro do servidor de garrafa. E assim, corresponde essa rota para criar a rota que temos aqui, que nós falaremos sobre em um segundo. E assim, nós especificar que é um método post, porque queremos enviar esses dados forma, e, geralmente, quando você está enviando dados de um formulário, você pode querer usar uma solicitação post, só assim você não acabar com este grande, pesado URL. Mas você também pode usar uma solicitação GET, e passá-lo em com roteamento variável, mas para formulários, é bom a uma solicitação post aqui. E então, assim como você faria com HTML e PHP, você pode especificar essas entradas de texto, e você pode especificar o nome deles, e esse é o nome que serão passados no objeto do pedido no prazo de Flask. E então temos uma Submeter botão que diz Post. E aqui, Post é o nome do botão, porque é um post de blog, mas aqui, post é o método de solicitação. Portanto, estas são a mesma palavra mas, na verdade, não relacionada. Sim Voltando ao código Python, quando chamado o método de criar, notar aqui que você pode na verdade especificar dentro do percurso os métodos de solicitação que pretende aceitar, e assim por aqui, eu especificar que eu só querem aceitar um método Post. Então, se eu realmente tentar visitar a página diretamente, que está usando um pedido GET, ele vai me dizer "Método não permitido." E assim, você tem páginas, tipo de como Nesta página criar, que eu só sou realmente usando como uma forma de a forma de se submeteu, você pode especificar que você não faz quero que as pessoas para ser capaz de ir para lá diretamente através de um pedido GET, ou se você não quer, por algum motivo, um pedido POST, você poderia apenas especificar chegar aqui, mas neste exemplo, nós apenas quer a solicitação POST para sair. Assim, quando create_post é chamado, quando nós visitamos que via o pedido Post, sempre que você vai a um determinado rota, há este objeto do pedido, e tivemos que importar solicitações no topo, mas há esta solicitação objeto que é passado em, e você pode acessar os dados do formulário, que será automaticamente preenchido quando você envia um pedido de um formulário. E então, o que eu penso é muito legal, é que o objeto de formulário para obter passado in, é apenas um dicionário Python que contém, se você access-- isso aqui, deixe- me puxar para cima o HTML ao lado dele, apenas assim você pode ter que como uma referência, sim, então os nomes que especificam aqui para os diferentes campos, de modo o título eo texto, então é só usar aqueles com mais aqui como índices para os dados do formulário. Então, isso é super conveniente. Então nós chamamos post.create, que irá criar e inserir automaticamente este novo cargo objeto no banco de dados. E eu acho que isso criar função aqui está um exemplo de como muito legal Flask é poderosa e trabalhar com isso, porque se você estivesse fazendo algo em PHP, você pode ter que fazer um monte de validação, você teria que, em seguida, estabelecer uma conexão de banco de dados, você teria que, em seguida, executar a consulta SQL, mas aqui só temos este bom post.create, que pode, então, apenas obter as informações do objeto do pedido, e, em seguida, passá-lo para um novo posto que estamos criando. E, em seguida, o último coisa que queremos fazer, é redirecionar o usuário de volta para a casa. E por isso usamos este Flask redirecionar função. E algo que não tínhamos visto antes, era esta função URL. Assim, o URL para a função permite você passa, na verdade, o nome de uma função no seu código Python, em vez da via particular que ele está. Então, eu poderia ter apenas como facilmente redirecionado um usuário para cortar, que iria enviá-lo de volta para casa, mas usando o URL para a função é o de Nice, porque se você mudar o local onde as coisas são, então vamos dizer que eu mudar o casa para estar em / home em vez disso, isso ainda, então, retornar / home, porque, na verdade, vai e olha para cima o nome da função, e ele vai lhe dar de volta o URL para isso. Assim, tipo de no pressuposto de que você é mais propensos a mudar onde as coisas são, do que os nomes das funções. Você pode usar isso realmente agradável URL para a função. E uma coisa que estar ciente de que é um pouco complicado, é que você acha que você poderia apenas chamar redirecionar a URL para, mas, na verdade, todas as rotas têm para retornar algum tipo de texto e HTML, assim que você realmente tem que retornar a chamada redirecionamento. Caso contrário, você terá algo inválido por não devolver uma cadeia, porque todos estes têm para retornar o HTML que você realmente deseja processar. E assim, quando você chamar o redirecionamento, ele redireciona para a página, mas, na verdade, retorna o HTML você precisa executar esse redirecionamento. Volte para a página inicial. Portanto, temos estes dois pontos de vista diferentes. Temos a visão de casa. Ou, eu acho que eu deveria dizer modelos. Temos esses dois modelos, o modelo de casa que exibe todos os nossos postos de trabalho, e então temos essa coisa de anúncio, e quando você clica no post, ele vai para uma nova rota dentro do balão, mas esse caminho não necessariamente tem um modelo correspondente. Você não tem que ver nada, mas você ainda pode ter este trabalho em curso nos bastidores. E então você redirecionado voltar para a página inicial. E, definitivamente, é fácil de trabalhar em alguns CSS mais agradável para o modelo e fazer este olhar muito mais agradável, mas toda a lógica principal está lá no Python. Qualquer dúvida sobre esse exemplo? Eu sei que há um monte de coisas diferentes acontecendo lá, um monte de coisas que não tinha visto antes, mas como qualquer coisa. Sim. AUDIÊNCIA 1: Você tem que fazer nada especial para esfregar os dados que é vindo do formulário? Eu percebi que você acabou de dizer "criar", EZRA Zigmond: Sim, o que é na verdade, isso é um ponto muito bom. Então, a pergunta era: você precisa verificar e certificar- que os dados são válidos, e fazer qualquer tipo de esfregar para se certificar de que é válido, porque como você pode ver aqui, Eu não estou fazendo isso. Então, vamos ver o que acontece se eu postar algo em branco. Então, ele vai realmente fazer apenas uma pós em branco e preencha o DateTime. Então, na realidade, você provavelmente quero fazer algo como: talvez especificar se o título é igual a a cadeia vazia, então não fazer isso. Ou, fazê-lo apenas se o título é não é igual a uma cadeia vazia. Então, ele realmente não automaticamente cuidar do que esfregar para você, então você ainda precisa fazer isso. Sim, boa pergunta. AUDIÊNCIA 2: Será que ela esfrega para injecção sequela? Você sabe? EZRA Zigmond: Felizmente, peewee faz isso. Eu acho que seria certamente uma bonita mau biblioteca, caso ele não fez isso. Eu não sei exatamente. Eu tenho que olhar para o consulta que gerou. Eu acho que, se eu digitei em um post de blog que tipo de olhei como um ataque de injeção SQL, algo como isto, se esta é como um campo de senha ou algo assim, você pode fazer algo como isto. Eu acho que vai ainda obter literalmente postado, mas eu acho que faz peewee algum tipo de lavagem dos dados antes que ele realmente executa. AUDIÊNCIA 1: Esse campo de texto é concebidos para ter texto simples, certo? EZRA Zigmond: Sim, ele é. Sim. Então eu acho que todo o, por isso esta é comportamento correto, que vai fazer isso, mas eu acho que peewee espero que não fazer algum tipo de proteção em sua extremidade. E se você queria verifique que, há são maneiras quando você gerar uma consulta. assim você não tem que executá-lo diretamente. Eu teria que tomar uma olhar para a documentação, mas você pode realmente ver o SQL que está gerando, e vejam o que, e fazer certeza de que ele está escapando coisas. Outra razão pela qual você pode quero olhar para o SQL peewee que está saindo, é se As coisas parecem estar indo muito devagar, você pode dar uma olhada e ver o que é realmente fazendo, porque é às vezes acidentalmente fácil adicionar em, a maneira como você escrevê-lo, você pode tê-lo acidentalmente selecionar todo o banco de dados em primeiro lugar, e, em seguida, fazer alguma operação de classificação em que, quando você realmente destina-se a seleccionar um subconjunto. E assim, se as coisas não são bastante indo para a direita, é bom dar uma olhada a pedido que está realmente ficando gerado. Sim. AUDIÊNCIA 2: Quando você começou, você colocar na porta como 5000. EZRA Zigmond: Yeah. AUDIÊNCIA 2: É o padrão com peewee, ou isso é algo que você pode mudar? EZRA Zigmond: Sim, assim que o porta é padrão com Flask. Se você executá-lo sem especificando nada, ele vai fazer isso automaticamente. Eu acredito, eu teria para verificar isso, mas você pode especificar que, no app.run, Eu acho que você pode fazer algo como: port = 8080. Vamos dar que tentar real rápido. Sim, então você pode apenas especificar port = 8080, e que irá executá-lo lá, que eu acho que, se você quiser executá-lo no IDE, eu não tentei isso, mas eu acho que se você ele correu na porta 8080, você provavelmente seria capaz para acessar o servidor, apenas como se você fosse para o site. Sim, mas é fácil para mudar isso se você ter qualquer tipo de como porta-forwarding coisas que você precisa fazer. Alguma outra pergunta? Sim? AUDIÊNCIA 1: Então, eu vi na sua modelos que, como você mencionou, você tem que especificar o banco de dados para cada objeto. Por acaso você sabe, faz que fazem realmente fácil se você tem um monte de bancos de dados SQLite que você deseja usar para um único aplicativo da web, que você pode apenas especificar um grupo de diferentes queridos em seu modelo? EZRA Zigmond: Sim, deixe-me abrir esse bem rápido. Então, você está dizendo que, se você quer ter um monte de diferentes alguma coisa, talvez gosta e os estudantes, para alguns razão, algo assim? Sim, então eu acho que você ainda, cada modelo teria que ainda tem apenas um banco de dados que lhe é atribuído, mas se você queria ter diferentes modelos que ter diferentes objetos de banco de dados atribuído para ele, você definitivamente poderia fazer isso. Então, se eu criei um novo, algo assim, e agora este é um estudante que parece estranhamente como um post de blog, Eu poderia especificar que o banco de dados é igual a db_2 aqui. Então, eu acho que é a principal forma você pode fazer isso. Frio. Alguma outra pergunta? Então, só para terminar um pouco bit, aqui estão alguns recursos, e esses slides serão publicadas on-line assim você pode realmente chegar a esses links. Os melhores recursos são realmente a documentação para Flask e peewee si. Eles estão muito bem escrito, eu acho. Assim, o site do Flask está aqui, e eles têm um tutorial de início rápido que irá percorrer semelhante as coisas para que eu andei através, mas se você quer qualquer tipo de avaliação das coisas que eu fui, ou você pensou que eu expliquei algo de uma forma confusa, eles terão exemplos semelhantes lá. Peewee tem documentação, e eles têm um tutorial de início rápido que vai sobre os principais parâmetros que você gostaria de usar. Então, as coisas que eu falei sobre com os padrões únicos, e especificando, os diferentes tipos de campos que você pode usar, aqueles que seriam todos lá. Além disso, se você tem perguntas sobre peewee, e você publicá-las em stackoverflow, o cara que fez realmente peewee continua e responde a essas vezes. Se você tem uma pergunta, espero que ele vai ser capaz de respondê-la, porque ele escreveu a coisa toda. Eu acho que é tudo Eu queria cobrir. Obrigado por terem vindo.