[Jouer de la musique] EZRA Zigmond: Salut, tout le monde. Merci d'être venus aujourd'hui. Ce séminaire est "Python Web Apps avec Flask ". Donc, je vais parler un peu pourquoi vous pourriez vouloir utiliser Flacon à faire applications web avec Python, par opposition à d'autres cadres, comme là-bas Django, qui est le plus connu. Le sous-titre est "et peewee, "qui est quelque chose nous allons parler de la façon d'interagir avec les bases de données SQL. Il rend vraiment agréable. Donc, voici juste un rapide aperçu de ce que je veux aller plus. Donc, d'abord, juste une diapositive que ça va être QuickStart, qui est de savoir comment obtenir tout mettre en place sur votre ordinateur. Je vais être la démonstration ce sur ma machine Mac local, juste parce que ce où je l'ai fait avant, je suis plus à l'aise avec elle, mais cela est certainement possible sur le CD50 IDE. Donc, après cela, je veux introduire ce flacon est, et vous convaincre pourquoi vous devriez l'utiliser en premier lieu. Ensuite, je vais vous donner un rapide exemple de ce que vous peut faire dans un ballon, un exemple rapide de ce que vous pouvez faire dans peewee, et puis je vais vous montrer plus exemple d'application complète que je mets ensemble que nous peut traverser ensemble. Et puis enfin, dans la dernière diapositive, je dois quelques ressources que vous regardez à en ligne pour plus d'informations. Ceci est un pas complet tutorial de comment utiliser Flask. Et je vais espère quitter un peu de temps pour les questions. Quiconque observe localement, juste comme, crier au milieu si vous avez des questions. Donc, des trucs d'installation rapide, si vous voulez suivre, ou si vous voulez obtenir ce sur votre propre machine, Je vais être en utilisant Python 2.7.10. Flacon fonctionne avec Python 3, mais je l'aime l'utilisation de Python 2, parce qu'il ya certains paquets Python qui ne fonctionnent pas avec 3 encore. Si vous avez installé PIP, qui est un gestionnaire de paquets Python, Je pense que si votre Python est supérieure ou égale à 2.7.9, vous avez déjà installé, il est super facile à installer ces paquets. Vous pouvez faire installer pip Flacon, PIP installer peewee, Habituellement, vous devez exécuter sudo juste afin que les autorisations fonctionné. Et, si vous utilisez un Super ancienne version de Python, Je vous recommande de mettre à jour votre Python, ou en utilisant EasyInstall installer pip. Donc, la prochaine question est, ce qui est Flask? Et je suppose, d'abord une question raisonnable, je me demandais pendant une longue période est, ce qui est une application web? Parce que ce un mot que je Think est jeté autour d'un lot que je ne sais pas vraiment. Et je pense que le meilleur exemple de ce qu'une application Web est, est vraiment CS50 Finances, où il est pas vraiment juste un site web, mais il est quelque chose que vous pourraient sorte d'interagir avec. Il ya des comptes d'utilisateurs et toutes sortes de choses différentes. Alors, où vous dessinez exactement le la ligne entre ce qui est un site web, et ce qui est une application web, est une sorte de arbitraire, mais je suppose que l'idée, il est quelque chose de plus qu'un site web et il est une application utile. Donc, Flask est un cadre pour faire des applications Web en utilisant Python. Et nous espérons que, d'ici la fin de cela, je vais vous convaincre que vous pouvez réellement écrire quelque chose comme CS50 Finance utilisant Python, que je comme beaucoup mieux que PHP, personnellement. Donc, Flask est, qu'ils appellent une microframework, par lequel, ils signifient qu'il est très simple, mais extensible. Ainsi, il a ce qu'il vous faut, mais si vous voulez plus de fonctionnalités, il est facile de les mettre en. Mais juste parce qu'il est un microframework, qui ne fonctionne pas signifie qu'il est seulement pour les petits projets. Je dois ici un lien qui dit que Obama a utilisé Flacon en 2012 pour sa campagne site, qui nous l'espérons, est quelque chose d'un avenant. Mais la chose que je vraiment à propos de Flasque est que, il ne fait pas vraiment toute sorte de décisions pour vous. Tout simplement parce que nous sommes parler des applications web, Je dois le comparer à Ruby on Rails et Django, qui tous deux sont de grands cadres, mais ils font tous deux hypothèses sur la façon dont vous voulez interagir avec des bases de données, comment vous voulez présenter votre vues, et ils ne sont certainement bons aspects. Par exemple, Ruby on Rails a ce système d'enregistrement actif, ce qui est une très belle moyen d'interagir avec les données, mais si vous souhaitez utiliser Ruby on Rails, vous êtes en quelque sorte liés à cela. Mais avec Flask, que je vais vous montrer avec peewee, vous pouvez utiliser quel qu'il soit de base de données que vous voulez, et vous pouvez simplement tirer que dans comme une extension dans le flacon. Voilà pourquoi je vraiment comme Flask, il est qu'il ne pas faire des hypothèses pour vous basé sur des choses que vous ne devez pas vraiment. Alors, pourquoi devriez-vous utiliser Flask? Les avantages sont, il vient a vraiment les caractéristiques de base construit en elle que vous avez besoin. Donc, vous ne devez pas vous inquiéter à propos de comprendre tout un tas de choses que vous ne pas vraiment besoin. Vous ne devez pas avoir à vous soucier sur la désactivation de fonctions que vous ne pas vraiment besoin. Et, comme je l'ai mentionné, il est super facile d'ajouter des extensions de choses que vous avez besoin. Certains d'entre eux, a Flask leur propre soutien pour elle. Donc, il ya quelque chose appelé Flask admin, qui reflète cet administrateur panneau qui fournit Django, qui vous donne une belle façon visuelle pour administrer votre site web. Mais encore une fois, si vous êtes faire quelque chose de simple, vous ne probablement pas besoin d'un grand administrateur panneau, donc je pense que ce super sympa. Les inconvénients sont que vous avez moins de pouvoir sortir de la boîte. Ainsi, lorsque vous ouvrez pour la première place Flask, et dans votre programme Python, vous tapez juste de Flask import *, ou que ce soit, vous ne recevez pas exactement tous les fonctionnalités que vous voudrez peut-être. Et vous devez donc plus explicitement la liste des caractéristiques que vous voulez. Voilà donc un inconvénient, mais je pense que pour la construction de petits web applications comme je vais être montrant vous, qui est pas vraiment un problème. Et ce qui est la dernière chose censé dire, ce qui est une faute de frappe, est qu'il ya moins standardisée conventions pour savoir comment utiliser Flask, simplement parce qu'il n'y a pas autant les gens qui utilisent professionnellement par rapport à Django. Donc, si vous regardez quelque chose comme, "comment je fais x" dans Django, vous trouverez sans doute. Il ya une bonne conception les modèles que vous pouvez utiliser, mais avec Flask, il est sorte de passer votre chemin, simplement parce qu'il est un jolie petite bibliothèque. Ce sont donc les inconvénients, mais je pense que qu'il est toujours une bonne bibliothèque à utiliser. Alors disons simplement sauter à droite dans le flacon. Ceci est sûrement pas d'être un tutoriel complet, mais il est de vous donner une idée de la façon de structurer les choses, et si vous vous sentez à l'aise d'aller hors et en regardant la documentation et de découvrir plus. Alors, permettez-moi d'ouvrir une vraiment exemple simple au premier abord, et vous montrer ce que ressemble, et puis nous allons décomposer un peu plus. Donc cela ici, permettez-moi de le faire fonctionner. Donc, je dois maintenant mon application en cours. Je vais ouvrir Safari, et il fonctionne sur mon hôte local. Donc je vais juste pour faire de ce grand. Mais localhost: 5000 Et donc, en ce moment, tout cela ne est, lorsque vous visitez le site, il affiche "Bonjour Flask," qui est pas super utile, mais je pense qu'il est cool que dans ce petit fichier ici, nous avons un serveur web qui tourne qui est l'impression de quelque chose. Alors, regardons effectivement le code pour une seconde, et de le décomposer un peu. Est la bonne taille pour tout le monde ici? Donc, je l'espère, vous êtes un peu l'aise en utilisant Python. Je suppose que nous pouvons regarder Python et lire à travers elle. Si vous avez des questions au sujet de quoi que ce soit, je peux aussi aller sur cela. Donc, la première ligne est, de Flask, nous importons, Flacon avec un capital "F" qui est une sorte de tous les principales caractéristiques que vous voulez. Chaque fois que vous écrivez un fichier et en utilisant Flask, vous allez vouloir importer que, simplement parce que cela a toutes les choses principales. La prochaine chose que nous faisons, est que nous appeler cette fonction Flask, juste pour créer un objet de l'application, et vous êtes allant toujours à vouloir le faire. Et puis, sautant à la fond rapidement, cette partie est ici, 'if_name _ == "_ main_"' qui est une sorte de convention de Python. Donc, cela ne fera que si vous exécutez exécuter ce fichier directement en utilisant Python. Ensuite, nous appeler app.run, qui sera fait démarrer l'application en cours. Donc, voilà la structure principale qui vous aurez dans toute application de Flask, est que vous aurez cette app = Flasque (_name_), puis app.run. Donc, les deux choses que je dois ici, sommes ce que nous appelons les routes. Donc, nous allons parler de l'acheminement d'un peu plus. Je vais revenir à la diapositive. Donc, le plus fondamental concept dans Flask est routage. Et il est l'idée que vous assigner des fonctions en Python à des adresses particulières sur votre page Web. Donc, chaque fois que vous voulez pour créer une nouvelle route, vous utilisez cette @ app.route fonction décorateur. Donc, si vous n'êtes pas familier avec décorateurs de fonction en Python, il est que ce concept vous permet de prendre une fonction et l'entourer avec autre chose. Alors, vraiment, ce que ce décorateur fait, est que cela prend la fonction dessous, et il ajoute plus d'informations à elle, mais ce qui fait Flask ne fait que cela se produise est pas super cruciale, mais ce qui est important, est que, avant la route, vous mettre ce @ app.route, puis l'adresse de la route, de sorte que la barre est ce que nous vu quand nous ouvrons juste en haut de la page Web. Voilà donc la page d'accueil. Il est juste la route de barre oblique. Et puis vous avez cette fonction. Le nom de la fonction peut être ce que vous voulez. Il ne doit pas nécessairement à avoir à faire avec la route. Et puis, quel que soit le retour de la fonction, la fonction doit renvoyer une chaîne. Et cette chaîne peut contenir du code HTML ou quoi que ce soit, et qui est en fait ce qui va arriver retourné à votre navigateur Web comme HTML, et il rendra ce. Voilà donc le même code qui était de l'exemple que je viens de courir, alors quand nous visitons slash, il appelle une fonction Bonjour tout le monde, ce qui juste renvoie une chaîne, Bonjour Flask, et que l'on imprime sur l'écran. Donc, il ya un autre exemple, qui est, quand vous visitez / bonjour, il imprime Bonjour Word, qui devrait en fait dire Bonjour tout le monde, mais supposons que ce était intentionnelle. Donc, nous allons tirer que jusqu'à très rapide. Donc, si vous allez à localhost / bonjour, il sera désormais imprimer quelque chose d'autre. Voilà donc juste un petit exemple de la façon dont vous pouvez créer deux voies différentes. Donc, autant que cela soit pas super utile, il n'y a pas beaucoup que vous pouvez faire, vous pourriez faire tout cela avec ayant différentes pages HTML, et lorsque vous visitez un particulier page, il charge simplement la page. Voyons donc un peu plus choses utiles que vous pouvez faire. Donc, une chose que vous pourriez avoir remarqué dans l'exemple que je tirai jusqu'à, est que je l'avais app.run (debug = True). Et donc, ce que cela l'argument de débogage fait, est que lorsque vous exécutez votre serveur Web, lorsque vous êtes dans votre application, si vous modifiez un fichier, il sera recharger automatiquement le serveur. Et si vous ne l'avez pas fait à redémarrage Python, ce qui est super utile. Je peux montrer cela. Permettez-moi de tirer vers le haut mon code avec la faute de frappe en elle, et prétendre que faute de frappe a été mis là intentionnellement à des fins instructives. Ajoutons donc cette avant. Alors maintenant, il dit Bonjour tout le monde. Je vais l'enregistrer. Et si nous nous retirons de sauvegarde le terminal, vous aurez dire qu'il est de redémarrer, parce qu'il a détecté une modification, et maintenant quand nous recharger cette page, il affichera la bonne chose. Donc débogage est super utile pour cela. Aussi, si vous avez une sorte d'un accident, de sorte permettez-moi de ce plantage de l'application en l'ayant pas retourné une chaîne. Donc, disons simplement avoir Aucun retour pour une raison quelconque. Et puis, quand je visite cette la page, il sera simplement planter, mais le serveur ne fait pas que planter, il vous donne en fait un retour super utile trace de tout ce qui a mal tourné. Et ce qui est vraiment agréable, est que à toute étape dans cette trace arrière, vous pourriez ouvrir un interactive débourser ici, et une sorte de imprimer ce variables que vous voulez prendre un coup d'oeil. Et si le débogage est vraiment utile pour déterminer ce qui se passe avec votre serveur, plutôt que de simplement voir quelque chose en PHP comme un 500 interne erreur de serveur, qui est super inutile. Une chose d'être conscient de, est que si vous mettez votre application en ligne il est donc visible pour le public, vous ne jamais vouloir quitter le mode de débogage sur, parce que les gens peuvent réellement utiliser cette console que je Vous avez montré à exécuter du code arbitraire. Ainsi, ils peuvent imprimer comme tout codes secrets que vous avez là, ils peuvent regarder exactement comment votre site fonctionne. Donc, il est vraiment utile pour les essais, mais toujours assurez-vous de le prendre avant vous publiez quelque chose en ligne. Alors, quand vous faites quelque chose comme PHP, il ya cette idée que vous pouvez passer informations entre les pages Web en mettant en fait les informations dans l'URL, ce qui est une demande GET, mais dans Flask, vous pouvez réellement faire quelque chose un peu comme ça, en ayant un parcours qui a une variable comme partie. Donc, si vous regardez ce par exemple sur l'écran ici, nous avons un itinéraire qui est ('/ bonjour /'), et donc, si vous visitez / bonjour / quelque chose, que quelque chose va effectivement se remplissent dans la variable nom. Et remarquez que la fonction qui vient avec cette route doit prendre dans le paramètre nommer, de sorte qu'il sera fait se passé dans la fonction. Et puis, une fois que vous êtes à l'intérieur de cette fonction, vous pouvez traiter que comme une variable python normale, Et alors, il sera imprimer Bonjour, et il remplira dans le nom à l'aide un formatage de chaîne. Donc, pour ajouter parties variables à un routage, vous utilisez le marquage équerre. Et éventuellement, vous pouvez utiliser ce qu'on appelle un convertisseur. Et donc, si vous mettez cette annotation avec le côlon, vous pouvez spécifier qu'il est un int ou un flotteur, ou le chemin, et il vous permet de convertir automatiquement. Vous pouvez également faire la conversion au sein de la fonction Python, en utilisant simplement un plâtre, mais parfois si vous voulez vous assurer qu'il est un int, vous pouvez mettre ce que règle de conversion là. Donc, nous allons tirer vers le haut un exemple de certaines règles variables. Donc, ici, cela a même base la structure avec le flacon de l'importation Flacon, l'app = flacon (_name_), puis elle est en marche à la fin. Nous avons ces deux différente itinéraires variables ici. Et la première, est celui que je montrais dans la diapositive, qui était celle il faut juste un nom de chaîne et il va imprimer Bonjour, Nom. Et ensuite, la seconde on utilise la conversion. Donc, ce sera automatiquement convertir à un int, puis doubler le int, et imprimer cela. Et, nous ne faisons pas toute sorte de conversion en son sein parce Flacon prend soin de cela. Alors soyons cette course. Lorsque vous avez un ballon l'application en cours, Vous pouvez contrôler-C hors de lui pour arrêter le serveur en marche. Et puis, je vais courir les variables. Allons donc à localhost / bonjour / Esdras et Espérons que ce sera de me dire bonjour. Il a donc fallu en mon nom, dans la variable la route, et il remplit ici. Donc, je vais aussi montrer une rapide exemple du doublement. Donc, si vous allez à / double / 3, il affichera 6. Donc, cela a pris soin de la conversion pour nous. Ainsi, vous pouvez aussi le faire avec flotteur, et quelque chose de spécial, si vous avez besoin de spécifier quelque chose comme un chemin, qui lui permet d'accepter des barres obliques, mais cela ne devrait pas être plus souvent un problème. Jusqu'à présent, nous, avons encore vient d'être de retour cordes, ce qui est pas très intéressant. Nous pourrions revenir chaîne HTML littérale. Donc, dans le code, nous pouvons insérer quelque chose comme le b-tag pour le mettre en gras, mais la plupart du temps vous ne veulent pas réellement être l'écriture de code HTML dans votre code Python. Cela devient vraiment salissant, et il est pas un bon moment. Flacon nous permet de séparer les HTML dans ce qu'on appelle le modèle, et si vous songez en termes de modèle MVC que vous êtes familier avec, je l'espère, de travailler avec CS50 Finances un peu, vous pouvez penser les fichiers Python comme étant plus du contrôleur, où ils interagissent avec ce que modèle de données que vous pourriez avoir. Et puis, ils crient à Vues et transmettre des informations à ce View à remplir dans l'information en HTML dont il a besoin. Et ce que nous appelons les Vues Modèles sont en classe. Donc Flacon utilise un autre Python module qui il sera automatiquement Installer lorsque vous installez PIP Flacon appelé Jinja, qui vous permet d'ajouter ces annotations à l'HTML que vous voyez sur l'écran, qui vous permet vous mettez dans des choses comme conditionnelles, et des boucles dans le code HTML. Donc, il semble un peu comme la façon dont vous pourrait utiliser PHP dans un fichier HTML, mais cela est juste quand le flacon serveur sert le fichier HTML, elle se déroulera ce moteur de templates et analyser à travers ce et de remplir les choses. Donc Flacon a une fonction de render_template que vous pouvez voir au bas ici. Et donc quand vous visitez cette page, il rendrait cette hello.html modèle, et puis de remplir cette page HTML. Alors disons simplement exécuter ce réel rapide, et de voir à quoi il ressemble, et puis je vais à travers un peu plus en détail. Donc, vos modèles vont aller dans un dossier de modèles. Il va automatiquement chercher dans le Modèles dossier pour ce modèle. Donc, nous allons ouvrir cette place. Donc, je vais courir l'exemple de Templating. Donc, si je vais à / bonjour / Ezra, il a cette horrible, balise marquee désagréable que je mets dans. Très belle, très dynamique. Je suis un grand fan. Mais qu'advient-il si Je viens d'aller à, / bonjour? Donc, il dit seulement Bonjour tout le monde. Je ne passais pas un nom, et il remplit automatiquement. Voyons donc comment il l'a fait, et comment nous pouvons nous débarrasser de ce chapiteau peut-être. Donc, ici, cette est une sorte de un exemple intéressant de, si vous êtes familier avec la façon interrupteur déclarations travaillent dans une langue. Dites ceci est un peu comme, ce genre de chute à travers, où vous réellement attaché à deux différentes voies à la même fonction. Donc, nous attachons la plus bonjour itinéraire et / le / bonjour / nom route vers Bonjour, et nous spécifions using-- Python vous permet de préciser la fonction arguments-- par défaut donc si il ya pas de nom, de sorte si nous allons juste / bonjour, il va filtrer automatiquement pour le nom est égal à Aucune. Alors, nous rendons la Modèle avec name = nom, donc il va passer dans le paramètre de nom égal à cette fonction de paramètre de nom, dans le modèle. Cela ne explique toujours pas comment est décider d'imprimer Bonjour tout le monde, ou imprimer mon nom. Alors regardons effectivement dans le modèle lui-même, et de voir où cela vient. Ainsi, dans ce modèle, nous avoir fait de la logique conditionnelle, que certaines personnes seraient argumenter, vous avez réellement ne devrait pas avoir beaucoup de conditionnel la logique au sein de votre modèle lui-même. Il devrait être plus au sein de la Contrôleur, mais pour cet exemple il est quelque chose d'assez petite. Donc, ici, nous vérifions, si le nom, de sorte Si le nom ne correspond pas à Aucun, si un nom est en fait passé dans, puis nous dire Bonjour, nom avec le tête et le chapiteau, tout cela HTML normale, sinon, nous allons imprimer Bonjour, monde juste normalement. Alors quelques choses à noter ici sur la façon dont vous formatez le gabarit, est que, toutes ces instructions conditionnelles, un peu comme la façon dont nous PHP quand vous voulez insérer un peu de PHP, vous utilisez le moins-que question marque, il est en quelque sorte analogue ici avec le {%. Donc, ici, nous avons notre code conditionnel. Et puis, quand vous voulez réellement évaluer littéralement quelque chose, et imprimer sortir à l'écran, vous utiliser les doubles accolades. Voici donc les doubles accolades, puis nous spécifions nom, donc dans ce cadre, il va évaluer le nom de la variable, qui a été adoptée depuis l' rendre la fonction de matrice, plutôt que de simplement l'impression sur, si nous sommes débarrassés de ceux-ci, il serait tout simplement imprimer le mot «nom». Donc, voilà quelque chose à surveiller. Donc, une autre chose à avis est que, lorsque nous vouloir utiliser le fonction render_template, nous avons fait d'importer explicitement du flacon. Et ceci est un exemple de la modularité de la Gourde, que vous ne devez pas importer choses que vous ne avez pas besoin. Vous pouvez simplement mettre dans le fonctions que vous avez réellement avez besoin, ce qui est parfois gentil, si vous ne faites pas avoir toutes ces fonctions assis autour que vous n'êtes pas en utilisant, mais aussi, si vous oubliez que vous besoin d'importer render_template, vous aurez probablement un avertissement qui vous permettra de savoir à ce sujet. Alors, qui est structurant. Donc, nous avons montré comment rendre les pages Web simples, et d'ajouter un peu plus logique il, en termes de routage variable. Il vous permet de faire des choses différentes sur la base ce que vous allez à l'URL, et puis aussi, donner le code HTML d'un peu plus de sens dans termes de la façon dont vous voulez rendre les choses. Vous ne devez pas mettre tous votre code HTML dans votre Python, mais pour à peu près chaque application Web, vous allez vouloir une sorte de modèle de données qui lui est associée. Et traditionnellement, ce serait être quelque chose comme une base de données SQL. Et vous ne pouvez interagir directement avec SQL. Python a, je pense qu'il est appelé. SQLite 3. Vous pouvez simplement importer SQLite 3 et exécuter directement des requêtes SQL, mais je ne sais pas pour vous, mais je ne l'aime pas vraiment, juste, écrire des requêtes SQL. Elle tend à devenir vraiment long et compliqué. Et donc, quelque chose qui Je tiens à utiliser est ce qui est connu comme un ORM, qui est un objet-relationnel cartographie. Et le point d'une mapping objet-relationnel, est qu'il ya deux différents façons dont vous pouvez penser à des bases de données. Alors que l'exemple Professeur Malan habituellement utilise en classe, est le tableau Excel, où vous avez ces lignes et ces colonnes, et ce est vraiment utile pour comment il est représenté dans SQL et comment vous interagissez avec lui, mais une autre façon qu'il est en fait utile de penser parfois, est en termes de classes et d'objets. Ainsi, au lieu de penser de chaque tableau comme ayant cette ligne qui a certaine informations, vous pouvez réellement penser à elle comme étant chaque tableau est une classe, puis chaque instance de la classe a certaines propriétés. Ainsi, dans cet exemple, les instances de la classe sont les lignes de la table, puis chaque propriété serait une colonne de la table. Donc, l'ORM que je l'aime à utiliser est appelé peewee. Il est vraiment petit, un peu comme Flask. Je pense qu'ils vont bien ensemble, mais il ya beaucoup d'autres ORM que vous pouvez utiliser. A l'un est plus populaire connu sous le nom SQLAlchemy, et je ne me souviens pas pourquoi je l'origine choisir peewee sur SQLAlchemy, ou je vous dire pourquoi je pense qu'il est le meilleur, mais nous allons simplement utiliser ce l'un parce que je sais comment l'utiliser. Donc, on question est, pourquoi devriez vous déranger l'aide d'un ORM, au lieu de simplement directement écriture de requêtes SQL? Et je pense que le meilleur des cas, est que vous ne pas réellement avoir à écrire des requêtes SQL. Il est beaucoup plus facile, comme je vais vous montrer, à faire des choses comme la sélection, insertion, suppression, en particulier la création de tables. Il est beaucoup plus facile de écrire une structure de classe, que de structurer une Créez Déclaration de la table, mais une chose à être au courant, est-ce l'ORM va essayer de son mieux de comprendre ce que le plus efficace requête SQL serait, mais parfois, il se trompe. Et surtout si vous êtes travailler avec une grande base de données, vous pouvez remarquer que une requête qui devrait être opérationnel rapidement, est réellement prendre plus de temps. Et si vous regardez sous le capot comment l'ORM interprète que dans SQL, il pourrait faire quelque chose vraiment ridicule, juste parce que ce genre de un geste vos intentions mal. Et, il ya eu des moments où Je ai eu l'écraser, et juste exécuter mes propres requêtes SQL, juste parce qu'il a été l'analyse d'une manière étrange. Donc, il ya une certaine tête, juste dans la manière qu'il compile votre déclarations bas dans SQL. Alors, regardons rapidement au super- un exemple simple d'un modèle de données que vous pourriez utiliser. Donc, cela est du code Python, et donc le première chose que vous voulez faire est de partir peewee import *. Ainsi, contrairement à Flask, où vous avez l'ensemble de ces modules individuels, et que vous voulez importer Flask, et écrire un modèle, et quelques autres que nous le verrons plus tard, de peewee, il vous suffit de tout importer, parce qu'il est une jolie petite bibliothèque. Donc, la première chose que vous voulez faire, est effectivement créer cet objet de base de données. Donc, vous avez db = SQLiteDatabase, puis le nom de votre base de données. Et ce sera effectivement créer un objet de base de données que vous pouvez interagir avec, avec peewee. Et puis, nous avons la réelle modèle que nous voulons créer. Donc la table nous voulons créer. Ainsi, au sein de peewee, chaque classe a sa propre table au sein de votre base de données. Ainsi, toutes les classes hériter du modèle de base, et le modèle M est capital quelque chose qui est défini dans peewee. Ainsi, l'ensemble de vos modèles devraient héritent comme leur plus haut superclasse, ils devraient hériter de la modèle, mais ce qui est vraiment cool, est que vous pouvez réellement avoir votre modèles héritent de l'autre. Et beaucoup de temps, votre les modèles de données ne sont pas nécessairement faire une hiérarchie d'héritage agréable, mais fois où ils le font, il est vraiment agréable, parce que vous avez le modèle inhérente de l'autre. Donc, nous avons défini cette classe «étudiant», qui hérite d'un modèle, et il a trois propriétés. Il dispose d'un ID, qui est un PrimaryKeyField, qui est quelque chose qui est prévu par peewee, le nom est un CharField, et une note est un IntegerField. Donc, il peut ou ne peut pas être comment CS50 stocke en fait tout les notes des élèves. Il est pas, mais voilà comment je le ferais. Et puis, il a, dans les cette classe, et cela est quelque chose que vous pouvez faire avec Python, vous pouvez avoir des classes imbriquées. Et ceci est quelque chose ce qui est exigé par peewee. Donc, ce Meta de classe, vous avez pour indiquer que la base de données est égal à l'objet que nous avons créé ci-dessus. Et cela dit ce fichier est ce tableau passe réellement à être contenue dans. Donc ceci est quelque chose que vous avez à faire au sein de l'ensemble de vos modèles. Vous avez juste à préciser au sein de cette classe Meta cette base de données est égal à db. Donc, ce que je fais d'habitude, si je dois un tas de différents modèles, est que je dois une base modèle, que je généralement il suffit d'appeler "modèle de base" qui a la classe Meta, et il définit la base de données égale à db. Et puis tous mes modèles ultérieurs va hériter de cette classe de base. Et puis, je ne dois pas vous inquiéter sur la définition du Meta classe. Donc, quand cela devient réalité compilé vers le bas dans une instruction SQL, il ressemble à cette chose méchante bas ici, "Créer la table d'étudiant entier, " peu importe. Et, je pense qu'il est plus courte, cette requête SQL ici, mais si vous regardez cette classe ici vous pouvez voir exactement ce qui se passe. Vous pouvez voir quelles sortes de domaines il ya, ce qu'ils sont appelés, et ainsi, je pense que en regardant ce code Python est beaucoup plus lisible que en essayant d'écrire cette requête SQL. Donc, afin de réellement utiliser la base de données, nous avons pour vous connecter à un délai Python. Donc, je l'habitude d'écrire une fonction appelée initialize_db qui fait deux choses. Il faut dans la base de données objet DB et il en communication avec elle, qui débouche juste jusqu'à la section de la base de données. Si vous êtes juste courir si site Web sur votre machine locale, il est pas un super grand-chose à craindre sur la connexion et la déconnexion, mais si vous utilisez sur un site Web, vous vouloir faire en sorte que, chaque fois qu'un utilisateur relie à elle, quand ils ferment sur le site, ils se déconnectent de sorte que vous ne pas avoir un tas de personnes connectées à votre base de données à la fois. Et puis, quand vous connecter à la base, vous voulez appeler db.create_tables, et la liste des modèles pour ce que vous voulez pour créer des tableaux. Donc ici, je veux juste créer pour cet étudiant. Et puis, ce qui est important, est de préciser sécurité = True la plupart du temps. Alors, que cette déclaration va faire, est qu'il crée des tables pour le modèle de l'élève, mais seulement si cette table n'a pas déjà été créé. Voilà ce que spécifie sûres. Donc, il ne va pas écraser votre table existante, il ne fera que créer un nouveau table si il n'y a pas un là. Donc, vous pourriez créer les tables une fois en utilisant SQL. Et alors que la base de données séance là, et puis se connecter à chaque fois, mais il est généralement agréable juste à mettre dans cette create_tables appel, de sorte que, si jamais vous supprimez votre base de données lorsque vous exécutez votre site Web application à nouveau, il va recréer. Donc, assurez-vous que sécuritaire est spécifié pour être vrai, ou vous trouverez vos données simplement se clobbered chaque fois. Et puis, vous pouvez simplement appeler initialize_db à établir une connexion, et de créer tableaux si nécessaire. Donc, la chose la plus commune que vous aurez envie de faire, ou l'une des choses les plus communes, est réellement insérer des choses dans votre base de données. Et si, plutôt que d'avoir pour écrire un insert dans déclaration avec tous Les valeurs spécifiées, vous pouvez réellement appeler fonction de la classe de l'élève. Donc, lorsque vous créez une classe qui hérite de modèle, il a cette méthode create. Donc, vous faites name.create de classe, et que vous spécifiez les paramètres que vous voulez passer. Donc, si je veux ajouter quelques étudiants à notre exemple CS50 de carnet de notes, Je vais mettre en David, qui a un très bonne qualité, il a un 95. Et moi-même, qui est de ne pas faire si bien dans CS50, je dois 50. Et donc, la bonne chose à propos ce que cette fonction fait de créer, est qu'il renvoie l'instance, ou le rangée, qu'il a créé au sein de la table, et alors vous stockez que dans un variable et travailler avec elle plus tard. Vous pouvez changer autour, qui Je vais vous montrer un exemple de. Remarquez que je ne l'ai pas avoir pour spécifier l'ID, car puisqu'il est le PrimaryKeyField, il sera automatiquement incrémenter si vous ne le spécifiez pas. Et, en fait, vous avez probablement ne devrait pas spécifier, parce que vous pourriez accidentellement tabasser ID de quelqu'un d'autre. Et vous voulez faire vous qu'il est unique. Donc, en fait, le plus chose commune que vous voulez faire, est probablement sélectionner sur de la base de données une fois que vous avoir beaucoup d'informations là-bas. Et donc, si vous voulez obtenir tout, donc l'équivalent de l'étoile sélectionnez à partir de la déclaration des étudiants, il serait juste student.select. Et qui va vous redonner un tableau avec l'ensemble de l'étudiant objets qu'il que vous itérer à travers vous voulez. Vous pouvez obtenir des choses hors de lui. Et la plupart du temps, vous ne veulent pas seulement faire de sélection, vous voulez réellement de préciser quelque chose. Et oui, vous pouvez enchaîner L'ensemble de ces appels de fonction, comme la façon dont vous le feriez chaîne ainsi que les déclarations en SQL. Donc vous pouvez faire student.select (). Où dans cet exemple. Et puis, vous pouvez préciser les conditions, simplement en utilisant Python normale Booléens pour vérifier les choses. Donc, dans ce cas, vous voulez limiter ce que vous choisissez à, où student.grade est égal à 50, et student.name est égal à Esdras, ce qui va juste me sortir de celui-ci. Et remarquez, on vraiment chose subtile ici que, si vous souhaitez spécifier une et / ou un ou et / ou, en Python, vous utiliseriez normalement, Je pense que le mot "et" effectivement, mais ici, vous utilisez le seul esperluette, qui est normalement un opérateur au niveau du bit, mais dans ce cas particulier, juste la façon dont peewee fait, vous utilisez la seule esperluette de préciser «et». Voilà quelque chose qui Je me mêle beaucoup, mais il ne vient pas beaucoup plus que dans la pratique. Et puis, une fois que vous avez tous les étudiants sur la base de données, une fois que vous avez fait vous êtes sélectionnez et votre usure ou autre, vous pouvez utiliser une boucle foreach, tout comme normale en Python, avec toute sorte de iterator ou avec toute sorte de tableau. Ainsi, vous pouvez le faire, pour s dans student.select (). whe re (Student.grade <75), et ainsi de cette volonté itérer sur chaque élève dans le tableau dont le grade est inférieur à 75, ce qui dans ce cas, est toujours juste moi. Et puis, vous pourriez faire quelque chose au sein de cette boucle, comme envoyer moi un email et me fait dire tourner dans mes séries de problèmes. Donc, une autre chose que vous pouvez faire, est-il est vraiment facile de mettre à jour les lignes dans la table. Alors, rappelez-vous de retour ici, votre quand je inséré, Je pris la valeur qui était retourné par student.create, et je affecté à nom appelé Ezra. Et maintenant, vous pouvez changer la les valeurs au sein de cette instance, tout comme vous le feriez un classe normale en Python. Donc, vous pouvez définir ezra.grade = 95 et qui mettra à jour la copie locale, mais si vous voulez vraiment engager ce changement de base de données, vous devez appeler ezra.save, de sorte que vous appeliez la méthode .save sur l'instance. Et maintenant, je l'ai changé avec succès ma propre qualité au sein de la base de données. Ainsi, alors disons que je me fais prendre changer ma note au sein de la base de données. Professeur Malan va probablement vouloir me supprimer de la classe, et ainsi vous pouvez appeler le .delete méthode d'instance simplement sur cette chose. Donc, si vous vouliez aller nouveau dans cette boucle ici, et en fait, au lieu l'envoi de courriels tous les des étudiants dont le grade est moins de 75, vous avez voulu les supprimer, au sein de cette boucle vous pouviez appeler exemple s.delete. Et la dernière chose que vous voulez faire, est à chaque fois que vous établissez une connexion, et vous avez terminé votre travail, vous voulez appeler db.close, où cette base de données est db objecter que nous avions avant. Et vous voulez vous assurer que tout est fermé sur. Cool. Alors maintenant, je dois un exemple d'application. Je l'ai sorte de pré-faites tout simplement de sorte qu'il n'y aura pas de codage en direct des erreurs, mais nous pouvons marcher à travers et voyez comment vous mettriez Flask et peewee ensemble, et de faire une application simple. Je l'appelle CS50 diatribe, et il est une sorte de plate-forme de blog simple. Donc, premièrement, je vais courir et montrer à quoi il ressemble, et alors nous pouvons regarder de plus dans le code. Bon, alors disons simplement exploités cela. Cool, je vais faire ce un peu plus petit. Il est pas très jolie, juste parce que Je ne fais beaucoup de CSS, mais ce qu'il fait est, il a Cette base de données de messages de blog, et il passe par toutes eux, et il les affichera sur la page dans l'ordre du plus récent. Et si ceux-ci ne sont que quelques postes que je l'avais enregistré dans la base de données. Donc, si nous voulons créer une nouvelle après, nous pouvons aller à ajouter un nouveau message, et nous pouvons entrer dans le titre de la poste, donc quelque chose comme, séminaire CS50. Wow, vraiment profiter de ce séminaire. Cool. Ensuite, vous presse d'après, et il sera vous rediriger vers la page d'accueil, et puis vous verrez que le dernier message a été ajouté. Et nous avons encore tous ceux là. Alors maintenant, nous allons étape à travers l'ensemble de la code et voir comment cela est mis en œuvre. Donc, je pense que la première chose que nous allons jetez un oeil à, est en fait les modèles. Une grande partie du temps, quand vous concevez quelque chose, vous voulez d'abord penser à la façon dont vous allez représenter vos données, puis de concevoir les choses autour de ce que, de telle sorte que tout a un sens. Et qui est en fait la façon dont je l'a fait quand je faisais cela, Je me suis assis et je pensais, ce que je veux dans un post. Donc, ici, nous avons la même structure que je disais plus tôt, où nous faisons db = SqlDatabase ('posts.db'). En réalité, vous ne voulez probablement pas coder en dur dans les bases de données de votre nom. Cela devrait probablement être un paramètre qui est stocké quelque part, peut-être dans un fichier de configuration, mais dans un petit exemple de ce genre, il est correct de coder en dur que. Alors maintenant, nous avons cette classe Post, qui hérite à partir du modèle de base. Et il a, à nouveau, la ID = PrimaryKeyField. En fait, si vous ne spécifiez pas, si je réellement me suis débarrassé de cette, Peewee puis nous allons prendre soin de créer automatiquement que champ ID, et il sera automatiquement faire un PrimaryKey, qui Je pense est vraiment très agréable, parce que d'habitude, qui est quelque chose que vous voulez avoir, mais je tiens à le mettre dans spécifiquement, juste pour que je me souviens qu'il est là. Mais si vous ne spécifiez pas que, que ce qu'il y aura automatiquement. Alors, je dois une date est un DateTimeField, et tout ces différents domaines, si vous regarder la documentation peewee, il vous donnera une liste des différents types de champs que vous pouvez utiliser. Pour la plupart, il est analogue à ce que vous verriez dans SQL. Donc, il ya un CharField, un VarCharFields, TextField, qui sont très longtemps textes, comme un article de blog potentiellement, DateTimeFields, DoubleFields, FloatFields, toutes choses comme ça. Et vous pouvez passer dans d'autres arguments à elle, que je ne précise ici. Disons, par exemple, vous ne voulez pas permettre à deux postes d'avoir le même titre, vous pouvez spécifier quelque chose comme uniques = True, et que est juste un paramètre supplémentaire à le domaine que quand il compile vers le bas dans le SQL, il précisera qu'il doit être unique. Vous pouvez également spécifier quelque chose comme pas nulle et toutes les autres choses vous le faites normalement dans SQL. Donc, ceci est un assez simple modèle qui a la date. Remarquez ici, au sein de la DateTimeField, Je spécifie ce que le défaut est. Je ai précisé qu'il soit datetime.datetime.now, en raison de la façon dont cela devient évaluée, il évalue réellement l'DateTime.Now quand il est inséré dans la base de données. Je pense que, je dois de doubler le vérifier, mais si vous avez fait quelque chose comme cela, alors il serait effectivement évaluer qu'une fois, puis l'DateTime serait toujours le même. Donc, juste si vous faites quelque chose avec datetimes, double vérification qu'il est quand évaluer obtient réellement insérée, ou bien vous pourriez être confondu. Le titre est juste un CharField, qui y sont d'autres arguments, vous pouvez passer en précisant exactement combien de temps vous veux que ce soit, mais ici, il n'a pas vraiment d'importance. Et le texte va être le texte de l'ensemble du poste, et que ça va être un TextField juste parce que vous voulez pour lui permettre d'être un peu longue chaîne. Ensuite, nous avons cette Meta la sous-classe qui vient spécifie que nous voulons que la base de données lorsque cela est effectivement ouvert en d'être l'objet de db que nous avons ici. Et dernière chose que nous avons ici, est simplement cette fonction que nous allons utiliser à partir de notre application principale pour initialiser la base pour se connecter à , puis pour créer la table Post. Maintenant, regardons l'application principale elle-même. Alors celui-ci est tout à fait une peu plus longtemps que ceux que nous avons vu auparavant, mais heureusement pas trop mal. Alors, permettez-moi d'exprimer cela. Bien. Donc, avis et le top Je importé tout un tas d'autres choses Flacon de que nous avons pas vraiment vu avant. Et nous espérons, nous pouvons passer par chacun de ceux-ci un par un et de parler un peu plus sur eux, triées par exemple. Donc, nous avons le flacon, et la render_template, que nous avons vu auparavant, cet objet de la demande, qui viendra lorsque nous regardons comment la forme que je montrais effectivement travaux. Redirection, ce qui vous permet de réacheminer Retour de la Créer un nouveau message retour à l'accueil d'origine, puis URL, ce qui est quelque chose qui vous permet de comprendre où sur le site web une page particulière est. Alors, la prochaine chose que je fais, je l'importation est toutes les informations à partir des modèles les fichiers que nous étions juste de regarder. Et, oui. Donc, autre nouveau quelque chose qui vient lorsque vous avez affaire, en particulier les bases de données, est que vous pouvez spécifier une fonction qui est appelée avant chaque demande, et la fonction qui obtient appelée après chaque requête, en utilisant cette la demande de la fonction décorateur. Et donc cela va se exécuté où cette fonction est. Cela ne doit pas être appelé avant que la demande, mais habituellement que quelque chose judicieux d'appeler. Vous pouvez spécifier quelle que soit la fonction vous voulez vous appelle là-bas, donc je précisé cette initialize_db fonction que nous avions en arrière dans les modèles fichier, donc avant chaque demande, vous souhaitez vous connecter à la base de données. Il existe deux différentes façons dont vous pouvez faire cela. Vous pouvez le faireapp., I crois qu'il est after_request. Et la différence entre after_request et teardown_request, est que after_request ne se produira si la demande était en fait valide. Et donc, que si le requête est réussie, Si tout va bien, mais teardown_request qui se passe dans le cas d'un succès demande, ou dans le cas d'une erreur. Donc, en général, vous voulez à utiliser teardown_request, sauf si vous voulez faire quelque chose, en particulier différent dans le cas d'une erreur. Mais juste pour la fermeture de la base de données, si elle réussit ou si elle échoue, Nous ne vous voulez déconnecter de la base de données. Donc, il est appelé, db.close sur l'objet de db. Notez que le teardown_request prend une exception. Ainsi, vous pouvez vérifier si il y avait effectivement une erreur quand il fermait, mais ici, nous l'espérons, il ne sont pas beaucoup d'erreurs, donc nous sommes juste une sorte d'ignorer cela. D'accord, et le reste est pas trop mal. Donc, quand nous allons à la page d'accueil, nous avons rendu ce modèle home.html qui va ouvrir. Le laissez-passer est en poste égal à, et ce que cela fait est, rappelez-vous que nous avons ce poste modèle, nous sélectionnons donc tous les postes, puis une autre chose que vous pouvez faire, vous pouvez spécifier la clause WHERE, vous pouvez spécifier une ORDER BY, et nous prenons donc tous les postes qui obtenir sélectionné, puis nous les commandons par la post.date.descending. Et qui va préciser, lors ils viennent effectivement sur, le plus récent sera très premier. Et puis, nous passons cela en le modèle de home.html, nous allons donc ouvrir effectivement en place ce modèle vraiment rapide, et jeter un oeil à la façon dont ça fonctionne. Et ce ne sont pas très HTML, mais je l'espère, nous pouvons nous concentrer sur le Python. Donc, il ya un lien vers le Ajouter New Post, et si cela spécifie la route l'intérieur de la fiole que l'on définir, qui est ici. Ceci est la nouvelle route de poste, et nous précisons que ici. Et ce qui est un lien qui va ensuite aller sur ce parcours au sein du serveur Flask. La chose la plus intéressante est-ce pour la boucle ici. Donc, nous précisons que cette paramètre poste qui a été adoptée dans le fonction render_template, pour chaque poste dans le poste de objet qui est passé dans. Nous voulons imprimer le titre du poste, au 1er semestre, puis ci-dessous, nous voulons imprimer le texte de poste au sein d'un paragraphe. Et ici, nous pouvons réellement appeler une fonction Python, afin que nous puissions appeler strftime, ST-RF-temps, et vous pouvez passer dans la chaîne de format que vous voulez imprimer les données dans. Donc, il est assez agréable est que vous pouvez fait appeler cette fonction Python à partir de là. Vous ne devez pas faire la mise en forme sur du côté du contrôleur, parce que vraiment, le formatage de la date est quelque chose qui vous voulez traiter dans la vue. Et tout cela pour cent les choses ne sont pas super important. Si vous regardez la documentation pour la fonction strftime en Python, il précise tous ces choses, mais que de comment, quand nous étions à la recherche à la page d'accueil ici, il formate ce avec une belle A ce jour, et il spécifie AM ou PM, mais normalement, si nous ne pas avoir cette ici, vous aurez probablement quelques ordures date qui n'a pas l'air très bien. Et puis nous spécifions le post.text, et je pouvais ont mis un couple de sauts de ligne ici, de mettre des espaces entre chaque poste. Donc, je pense que le plus important chose dans cet exemple, est que vous pouvez utiliser cette boucle. Et ceci est analogue à choses que vous pouvez faire en PHP. Vous pouvez parcourir, tout se passa, et ainsi, au lieu d'avoir à faire copier / coller, copier / coller tous les fichiers HTML, vous avez juste à écrire une fois, puis vous pouvez itérer sur tous les postes. Et ceci est quelque chose commune que vous voulez à faire, lorsque vous avez un grand nombre de données, est que pour tout dans vos données, vous voulez faire quelque chose de semblable. Et puis, souvenez-vous, que lorsque vous vouloir imprimer quelque chose explicitement dans le code HTML, vous utilisez les doubles accolades ici, mais alors quand vous voulez spécifier quelques informations sur une condition, ou sur une boucle, vous utiliser le support pour cent. Donc, pour revenir à l'Python code, donc qui explique ce qui se passe dans la principale la route, quand on y va, il affiche simplement tous les les messages, mais alors la question est, comment pouvons-nous réellement les messages dans la base de données, qui est un peu plus intéressant. Donc, lorsque vous cliquez sur le New Poster lien, que nous avons vu ici, il vous redirige vers cette forme. Et cela est juste un simple appel à la fonction render_template, qui a ensuite passe dans le nouveau poste sous forme HTML. Donc, nous allons jeter un coup d'oeil. Alors celui-ci est assez simple. Il dispose d'un simple formulaire HTML, qui va chercher un peu familier, basée sur les formulaires dans CS50 Finances. Et donc, nous précisons ici, l'action. Et ici, si vous travaillez avec PHP, normalement, il serait quelque chose comme, create.php, mais ici nous spécifions en fait un itinéraire Flasque au sein du serveur. Et donc, cet axe correspond à la voie de créer que nous avons ici, qui Nous en discuterons dans un second. Et donc, nous précisons que il est une méthode de poste, parce que nous voulons envoyer ces données de formulaire, et généralement quand vous êtes l'envoi de données à partir d'un formulaire, vous pourriez vouloir utiliser une demande de poste, juste pour que vous ne finissent pas Avec ce gros, URL difficile à manier. Mais vous pouvez également utiliser une requête GET, et de le transmettre avec routage variable mais pour les formulaires, il est agréable à une demande de poste ici. Et alors, tout comme vous ferait avec HTML et PHP, vous pouvez spécifier ces entrées de texte, et vous pouvez spécifier le nom d'entre eux, et voilà le nom qui sera passé dans l'objet de la demande au sein de flacon. Et puis nous avons un Proposez bouton qui dit poste. Et ici, Post est le nom de la bouton, parce qu'il est un billet de blog, mais ici, poste est la méthode de requête. Donc, ce sont le même mot mais en fait aucun rapport. Oui Pour en revenir au code Python, quand nous avons appelé la méthode Create, remarquer ici que vous pouvez fait préciser dans le trajet les méthodes de requêtes que vous voulez accepter, et voici donc, je précise que je ne veulent accepter une méthode Post. Donc, si je fait essaie de visiter la page directement, qui utilise une requête GET, il va me dire "Méthode non autorisée." Et oui, vous avez des pages, un peu comme cette page créer, qui je suis seulement vraiment en utilisant comme un moyen pour le formulaire pour obtenir soumis, vous pouvez spécifier que vous ne le faites pas voulons que les gens soient en mesure d'y aller directement par l'intermédiaire d'une requête GET, ou si vous ne voulez pas, pour une raison quelconque, une demande Post, vous pouvez simplement spécifier arriver ici, mais dans cet exemple, nous venons veulent la demande Envoyer à sortir. Donc, quand create_post est appelé, quand nous visitons que via la demande Post, chaque fois que vous allez à un particulier itinéraire, il ya cet objet de la demande, et nous avons dû importer demandes tout en haut, mais il ya cette demande objet qui est passé dans, et vous pouvez accéder aux données de formulaire, qui va automatiquement se remplir lorsque vous envoyez une demande à partir d'un formulaire. Et puis, ce que je pense est vraiment cool, est que l'objet de formulaire pour obtenir passé dans, est juste un dictionnaire Python contient, si vous access-- alors voici, laissez- me tirer vers le haut le code HTML à côté de lui, juste de sorte que vous pouvez avoir ce que comme une référence, oui, de sorte les noms que nous spécifions ici pour les différents domaines, de sorte le titre et le texte, nous alors utilisez simplement les personnes de plus ici comme indices dans les données de formulaire. Voilà donc super pratique. Alors que nous appelons post.create, qui créera et insérer automatiquement ce nouvel objet de poste dans la base de données. Et je pense que cette fonction de création Voici un exemple de la façon vraiment cool puissant ballon est et travaille avec cela, parce que si vous faisiez quelque chose en PHP, vous pourriez avoir à faire beaucoup de validation, vous auriez à ensuite établir une connexion de base de données, vous auriez à ensuite exécuter la requête SQL, mais ici nous avons juste ce joli post.create, que nous pouvons alors juste obtenir l'information de l'objet de la demande, puis le passer à une nouvelle Post que nous créons. Et puis, la dernière chose que nous voulons faire, est de rediriger le utilisateur retour à la maison. Et si nous utilisons cette Flacon rediriger fonction. Et quelque chose que nous avait pas vu avant, était cette fonction URL. Donc, l'URL pour fonction permet vous passez en fait le nom d'une fonction dans votre code Python, plutôt que de la voie particulière qu'il est. Donc, je pouvais avoir aussi facilement redirigé un utilisateur de réduire, qui renvoyer à la maison, mais en utilisant l'URL pour la fonction est agréable, parce que si vous changez le endroit où les choses sont, alors disons que je change le maison soit dans / home à la place, Ce serait alors revenir encore / home, parce passe réellement et lève les yeux le nom de la fonction, et ce vous donnera de sauvegarder l'URL pour cela. Donc, en quelque sorte sur la hypothèse que vous êtes plus susceptibles de changer où les choses sont, que les noms des fonctions. Vous pouvez utiliser ce vraiment belle URL pour la fonction. Et une chose d'être conscient de qui est un peu délicat, est que vous pensez que vous pourriez juste appeler rediriger sur l'URL, mais en fait, tous les itinéraires ont pour retourner une sorte de texte et HTML, si vous avez réellement à retourner l'appel de redirection. Sinon, vous obtiendrez quelque chose invalide de ne pas retourner une chaîne, parce que toutes ces activités ont pour revenir le code HTML que vous voulez vraiment rendre. Et donc, lorsque vous appelez la redirection, il vous redirige vers la page, mais en réalité il renvoie le code HTML vous devez exécuter cette redirection. Retournez à la page d'accueil. Nous avons donc ces deux points de vue différents. Nous avons la vue de la maison. Ou bien, je suppose que je devrais dire des modèles. Nous avons ces deux modèles, le modèle de la maison qui Affiche tous nos postes, et puis nous avons cette annonce chose, et lorsque vous cliquez sur le poste, il va à une nouvelle route dans le flacon, mais cette voie ne pas nécessairement un gabarit correspondant. Vous ne devez pas voir quoi que ce soit, mais vous pouvez toujours ont ce travail va dans les coulisses. Et puis vous êtes redirigé Retour à la page d'accueil. Et certainement, il est facile de travailler dans certains CSS plus agréable dans le modèle et de faire ce look beaucoup plus agréable, mais l'ensemble de la logique principal il est dans le Python. Une question sur cet exemple? Je sais qu'il ya beaucoup de différentes choses qui se passent là-bas, beaucoup de choses que nous avions pas vu avant, mais comme tout. Oui. AUDIENCE 1: Avez-vous de faire quelque chose spéciale pour nettoyer les données qui venant de la forme? Je remarquai vous venez de dire "créer" EZRA Zigmond: Ouais, donc voilà effectivement, ce est un très bon point. Donc la question est, avez-vous besoin de vérifier et assurez-vous que les données sont valides, et faire toute sorte d'épuration pour vous assurer qu'il est valide, parce que comme vous pouvez le voir ici, Je ne fais pas ça. Voyons donc ce qui se passe si je poste quelque chose vierge. Donc, il va en fait juste faire un après vierge et remplir le DateTime. Donc, en réalité, vous auriez probablement vouloir faire quelque chose comme, peut-être préciser si le titre est égal à la chaîne vide, alors ne fais pas ça. Ou, que faire si le titre est pas égale à la chaîne vide. Donc, il ne fait pas automatiquement prendre soin de cette épuration pour vous, si vous avez encore besoin de le faire. Ouais, bonne question. AUDIENCE 2: Est-ce qu'il gommage pour l'injection de suite? Savez-vous? EZRA Zigmond: Espérons, peewee fait cela. Je pense que ce serait certainement un joli mauvaise bibliothèque si elle n'a pas fait cela. Je ne sais pas exactement. Je dois regarder le requête qui a généré. Je pense que, si je tapais dans un blog ce genre de regardé comme une attaque par injection SQL, quelque chose comme cela, si ce est comme un champ de mot de passe ou quelque chose, vous pourriez faire quelque chose comme ça. Je pense que ce sera encore obtenir littéralement posté, mais je pense que peewee ne fait une sorte de lavage des données avant d'exécuter réellement. AUDIENCE 1: Ce champ de texte est conçu pour prendre le texte brut, non? EZRA Zigmond: Oui, il est. Oui. Donc, je pense que tout le, donc ce est comportement correct, qui va le faire, mais je pense que peewee ne espérons faire une sorte de protection sur leur fin. Et si vous vouliez vérifiez que, il des façons lorsque vous générez une requête. de sorte que vous ne devez pas l'exécuter directement. Je dois prendre un examiner la documentation, mais vous pouvez réellement voir le SQL qu'il génère, et jeter un oeil à ce que, et de faire vous qu'il est des choses échappe. Une autre raison pour laquelle vous pourriez vouloir regarder le SQL que peewee est délivrer, est si les choses semblent aller très lentement, vous pouvez jeter un oeil et voir ce qu'il est en train de faire, car il est parfois facile d'ajouter accidentellement dans, la façon dont vous l'écrivez, vous pouvez avoir accidentellement sélectionner toute la première base de données, puis effectuez une opération de tri à ce sujet, quand vous avez vraiment destiné à sélectionner un sous-ensemble. Et donc, si les choses ne sont pas tout à fait d'aller à droite, il est bon de jeter un oeil à la demande qui devient effectivement généré. Oui. AUDIENCE 2: Quand vous avez commencé, vous mettez dans le port 5000. EZRA Zigmond: Ouais. AUDIENCE 2: Est ce que le défaut avec peewee, ou est-ce quelque chose que vous pouvez changer? EZRA Zigmond: Oui, de sorte que le port par défaut est avec Flask. Si vous l'exécutez sans spécifiant rien, il le fera automatiquement. Je crois, je dois de doubler le vérifier, mais vous pouvez spécifier que dans le app.run, Je pense que vous pouvez faire quelque chose comme, port = 8080. Donnons qu'un Essayez Real rapide. Ouais, donc vous pouvez simplement spécifier port = 8080, et il sera capable de là, qui, je pense, si vous voulez l'exécuter sur l'IDE, je ne l'ai pas essayé cette solution, mais je pense que si vous il a couru sur le port 8080, vous seriez probablement en mesure pour accéder au serveur, comme si vous étiez pour le site. Ouais, mais il est facile à changer que si vous avoir un peu comme port-forwarding choses que vous devez faire. D'autres questions? Oui? AUDIENCE 1: Alors, je l'ai vu dans votre modèles qui, comme vous le mentionnez, vous devez spécifier le base de données pour chaque objet. Ne vous arrive de connaître, ne qui font qu'il est vraiment facile si vous avoir beaucoup de bases de données SQLite que vous souhaitez utiliser pour une application Web unique, que vous ne pouvez spécifier un tas de différentes celles de votre modèle? EZRA Zigmond: Oui, permettez-moi ouvrir que jusqu'à très rapide. Donc, vous dites, si vous voulez avoir un tas de autre chose, peut-être aimer et les étudiants, pour certains raison, quelque chose comme ça? Ouais, donc je pense que vous avez encore, chaque modèle devrait avoir encore juste une base de données qui lui est attribué, mais si vous voulez avoir différents modèles qui ont des objets de base de données différents assigné à elle, vous pourriez certainement le faire. Donc, si je créé une nouvelle, quelque chose comme ca, et maintenant cela est un étudiant qui ressemble étrangement à un billet de blog, Je pourrais préciser que le base de données est égal à db_2 ici. Donc, je pense que ce la principal moyen que vous pouvez faire cela. Cool. D'autres questions? Donc, juste pour finir un peu peu, voici quelques ressources, et ces diapositives seront affichés en ligne de sorte que vous pouvez réellement obtenir ces liens. Les meilleures ressources sont vraiment la documentation, Flacon et se peewee. Ils sont vraiment bien écrits, je pense. Ainsi, le site Flask est ici, et ils ont un tutoriel de démarrage rapide que va marcher à travers similaire les choses à ce que je traversais, mais si vous voulez toute sorte de révision des choses que je suis allé, ou si vous pensiez que je l'ai expliqué quelque chose d'une manière confuse, ils auront des exemples similaires il. Peewee dispose d'une documentation, et ils ont un tutoriel de démarrage rapide qui va sur les principaux paramètres que vous souhaitez utiliser. Donc, les choses que je parlé avec les uniques, et précisant les valeurs par défaut, les différents types de champs vous pouvez utiliser, ceux qui seraient tous là. Aussi, si vous avez questions sur peewee, et vous les afficher sur stackoverflow, le gars qui fait effectivement peewee passe et répond à ceux parfois. Si vous avez une question, je l'espère il sera en mesure d'y répondre, parce qu'il a écrit la chose entière. Je pense que ce tout Je voulais couvrir. Merci d'être venus.