Session du 03 juin 2025 à 21h00
Programmation Orientée Objet (POO)
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Découvrir Peewee et sécuriser ses mots de passe
On va parler d'un petit ORM (non non, pas de Django demain ^^), et voir comment hash les des mots de passe pour les utilisateurs en mode CLI
00:00:00 :Salut ! C'est l'heure Céd !Oui, salut !Bon, ce n'est pas une session pure TOSA, mais c'est juste que j'y pensais, là.Quelqu'un qui restait bloqué, en fait, à la question.
00:00:42 :En fait, l'idée, c'était de trouver un détecteur d'anagram.Est-ce que, comme ça, vous avez un truc qui vous vient en tête ?Comment faire ?
00:00:53 :Moi, je split tout, là, et je reconstruis une string à l'envers.Non.Alors, ce n'est pas un paladron.Un reverse, c'est égal.Ah oui, oui, pardon.
00:01:03 :Vous pourriez utiliser un reverse ?Alors, quoi que...Attends, c'est un anagram.Oui, ça veut dire qu'il peut être écrit...Ah oui, de différentes manières.
00:01:18 :Ce n'est pas juste... OK.Et alors, c'est ce que je disais à ceux qui m'ont déjà eu pour le l'appel du milieu, pour le TOSA.
00:01:27 :Pensez aux fonctions de base de Python.Ça se fait, ça, en très peu de lignes des codes.On pourrait faire ça avec des 7, et mettre les lettres dans les 7.
00:01:39 :7, j'éviterais, parce que le problème, c'est que si tu as un doublon, il faudrait qu'on le garde, du coup.Ah oui, parce qu'il faut exactement, en plus, le même nombre de lettres.
00:01:49 :Ce n'est pas juste...Non, un diagramme, c'est vraiment tout ce qu'il y a.Alors, il y a un truc, c'est qu'on peut vérifier une égalité sur une chaîne de caractères, en fait.
00:02:00 :On aurait pu faire comme ça.Ah, on les aurait... OK.On les trie, puis ensuite, on voit si c'est égal après avoir trié.OK.C'est forcément un anagramme, du coup, si elles sont égales.
00:02:17 :Oui, du coup, c'est ce que je disais, on sorte. OK.Ah, t'as dit sorte, j'ai compris reverse, excuse-moi.Euh, non.Désolé.Je pensais que tu voulais faire un... J'ai compris reverse, c'est que tu voulais faire un truc où...
00:02:33 :Après, je regardais si c'était vraiment un anagramme.OK, mais oui, on peut sortir comme ça.Voilà, c'est ce que je disais, qu'en gros, avec des fonctions de base de Python, on peut largement sortir sur les algos.
00:02:46 :Bon, on va commencer, on est combien, là ?On va commencer, entre guillemets.Bon, c'est pas mal, on est pas mal.Tout le monde connaît PeeWee ?
00:02:56 :Non, moi, je ne connais pas.Non, moi, c'est la première fois.C'est la première fois.Quelqu'un connaît, toi, non ? Je crois entendre que oui.
00:03:05 :Non, oui, oui, j'ai utilisé il y a quelques années en arrière, ouais.Ah, c'est pas drôle.Pourquoi ?Ouais, mais tu peux y aller, je ne me rappelle plus, moi.
00:03:15 :Moi, je l'ai utilisé vraiment à l'arrache, juste pour faire un peu du CLI comme ça, mais vraiment à l'arrache de chez l'arrache.Et comme je sais qu'il y en a qui font le projet du moment en CLI, je me suis dit, au moins, s'il y en a qui veulent le voir et qui vont voir le mentorat.
00:03:28 :Mais je me suis amusé avec à faire un petit truc marrant, c'est pour ça.Bon, du coup, PeeWee, c'est un ORM ? Tout le monde sait que c'est un ORM ?
00:03:37 :Ouais, oui.Ok.Cool.Moi, perso, quand je commençais Python, je ne savais pas ce que c'était.Mais il y en a qui, tout le monde, était à peu près avancé ici.
00:03:46 :Ouais, si, c'est normal.Donc, c'était un ORM, et en fait, le truc, c'est que j'ai cherché l'ORM le plus léger possible, mais qu'il soit sérieux.
00:04:03 :Et donc, oui, lui, il est hyper suivi, et je crois que c'est le plus léger que j'ai trouvé.Il n'y a pas énormément de lignes de code, c'est déjà beaucoup, c'est déjà énorme, mais c'est vraiment le plus léger.
00:04:13 :Perso, si je devais utiliser un en CLI, ce ne serait pas celui-là, ce serait celui-là.Pourquoi ? Parce qu'il est inspiré par Django.Voilà.Donc, j'ai regardé celui-là, comment il fonctionnait, je m'en sortirais, mais beaucoup mieux.
00:04:30 :C'est vraiment, ça ressemble énormément à Django.Donc, en fait, en CLI, si on me demandait de faire un projet comme ça, ou si on me disait, vas-y, fais du FastAPI, je prendrais ça, direct.
00:04:50 :Mais bon, celui-là en fait partie.Bon, sinon, on reste sur PeeWee.Sur PeeWee, vous pouvez aller voir la doc.On ne va pas être précisément sur la doc, mais bon, j'irai la revoir s'il y a des trucs qui me font galérer.
00:05:00 :Mais il vous explique un peu comment installer, rien de compliqué.Il y a un petit quick start ici, et il vous montre un peu comment faire, basiquement.
00:05:09 :Donc, nous, on va suivre à peu près là ce qu'ils font.Parce qu'honnêtement, j'ai dû faire une requête pour m'entraîner, mais ce n'est pas les requêtes qui m'intéressent en ce moment-ci, c'était un peu voir ce qu'on pouvait faire avec.
00:05:19 :Les requêtes, oui, j'ai pu faire à peu près ce qu'on voulait, mais je vais vous montrer d'autres choses que j'ai fait avec, en fait.Il y en a qui connaissent ce process ?
00:05:29 :Ça ressemble beaucoup à Django, au modèle Django, ça.Ouais, ça ressemble un peu quand même, ouais, je suis d'accord.Je suis d'accord.En fait, du coup, ce que je vais vous montrer, c'est que je me suis amusé un peu à le Djangoifier.
00:05:42 :Sur quoi je suis parti ?En fait, je suis parti sur quoi ?Alors, je me suis écrit des notes, je m'étais fait un mail, mais il n'y a quasiment rien dedans.
00:05:53 :Je vais aller le rechercher après mon mail.Pour l'instant, il n'y a rien dedans, en fait.Je dois avoir juste un...Je vais peut-être activer pour l'instant mon... Ouais, on connaît peu de temps.
00:06:04 :Maintenant, je ne vais pas commencer par importer et utiliser mon username.Je vais commencer par...Quel fichier j'avais fait ?Bon, allez-y.On va peut-être d'abord importer le modèle.
00:06:21 :On le fera après.Je vais prévoir les espaces.Allez, c'est parti.Alors, je ne sais pas pourquoi il me prévoit du...Il est en colère.
00:06:32 :On va faire ça pour l'instant.Maintenant, ce que je vais faire, c'est que je vais prévoir un fichier.On va prendre settings.py.Il va y avoir que...
00:06:44 :Comment dire ?Deux lignes de code dedans, mais ce n'est pas grave.Pour le principe, il faut avoir un settings.py, c'est tout.Parce que j'ai envie d'avoir ça.
00:06:53 :Donc, déjà...pip installet cpuiet je ne sais plus...Est-ce qu'il faut... Non, on peut l'installer directement.Il y a 100 arguments.Oui, oui.
00:07:09 :C'est bien deux à chaque fois.Oui, c'est ça.Alors.OK.Je vais faire comme dans la doc.Ils sont un peu énervés, ils importent carrément tout dans la doc.
00:07:22 :Oui, ce qui n'est pas trop conseillé.Oui, la doc, c'est ça.Je vais arrêter ça, ça me saoule.Je peux poser une question qui n'a rien à voir avec ça,mais du coup, sur les imports.
00:07:36 :Si tu importes tout, est-ce que ton...ton application sera plus lente que si tu importes les modules dont tu as besoin ?Alors...Pas forcément.
00:07:47 :Pas forcément, mais...j'ai déjà entendu dire que ça pouvait jouer sur la...l'efficacité du programme, mais je ne m'en suis jamais rendu compte.OK.Je ne sais pas si quelqu'un l'a déjà ressenti.
00:08:02 :Mais moi, perso, je ne l'ai jamais ressenti.OK.Après, je n'ai jamais importé tout, c'est pour ça que je dis ça.En fait, ça ne va pas ralentir vraiment.
00:08:17 :Il peut y avoir des comportements inattendus, quand même.Si jamais on crée, par exemple, un module qui porte un nomqui est celui d'un autre module qui existe dedans,ça peut nous faire des trucs bizarres.
00:08:28 :C'est ça qui peut être embêtant,c'est que tu vas polluer ton espace de nom.C'est le seul truc qui peut être le bordel.Du coup, le fait d'importer tout, ça occupe plus de mémoireque si on importe que le minimum ?
00:08:42 :Ouais, s'il y a des gros modules, oui, ça peut consommer un peu plus de mémoire.Moi, je le vois comme ça.Après, que ça ralentisse, je ne suis pas sûr.
00:08:47 :Mais par contre, faire...envahir la mémoire, je pense que...Je n'ai jamais vu à quel point ça pouvait ralentir.Ça occupe plus de mémoire dans tous les cas,et ça peut être le bazar dans tout ton espace de nom,ça peut être compliqué après.
00:09:03 :Là, je vais suivre la doc, bêtement.Pour ce qu'on va faire ce soir, ce n'est pas très important.Je vais rester assez basique.Puisqu'en plus, je ne le connais pas vraiment,c'est juste pour vous montrer un peu ce qu'on peut faire avec les ORM.
00:09:15 :Est-ce que du coup, je...Comment j'ai un peu de Django ici ?Est-ce qu'il y en a qui ont déjà fait du hash de password ou pas ici ?
00:09:23 :Oui.Vous allez utiliser quoi ?Il faut que je retourne sur mon projet, parce que je m'en suis enflammé.Je vais déjà mettre en route la base de données.
00:09:39 :On va prendre du coup une SQLite.On va l'appeler db.db.On va rester original.C'est bcrypt que je vais utiliser.D'accord.Ça tombe bien, je vais mettre autre chose ce soir.
00:09:51 :Ici, dans le setting.py, je vais initialiser l'ADB.Ensuite, je me crée un fichier que je vais appeler models.py.Je ne vais pas faire un truc trop avancé,c'est juste pour montrer comment je l'ai utilisé.
00:10:11 :Ensuite, je me crée un fichier models.py.Qu'est-ce qu'on va faire dans celui-là ?J'ai importé quoi ?Bonsoir.Du coup, j'en étais où ?Je voulais importer, comme tout à l'heure.
00:10:42 :J'importe tout.Et je vais importer aussi la base donnée.Là, c'est parti.Je vais commencer à créer mes modèles.C'est vrai que ça ressemble beaucoup à Django.
00:11:07 :On va faire du classe user pour faire des utilisateurs modèle.On hérite de modèle.Là, par exemple, on va définir un nom.On va prendre un carfield.
00:11:21 :Je ne connais pas tous les paramètres ici,mais il y a un max length par défaut, normalement.255.On peut définir s'il y a un champ,et on veut qu'il soit unique ou pas, ou qu'il soit nul.
00:11:35 :Par exemple, si on fait email,si on fait email,j'ai un carfield.Du coup, on peut très bien dire unique ou pas.Et on peut se définir un petit mot de passe.
00:11:50 :Là, c'est vraiment basique.Il faut qu'on précise le modèle.J'ai l'impression que ça marchait sans,mais je ne peux pas le confirmer.Il faut lui préciser la database.
00:12:03 :Je suis la doc.Moi, je vais utiliser ce qu'il dit,pour préciser la base de données qu'on utilise.Comme ça, c'est plus clair.Maintenant, pour les emails,par défaut, il n'y a pas de validation.
00:12:16 :Je ne l'ai pas trop vu sur la doc.J'ai mal fait attention.Après, je n'ai pas extrêmement fouillé non plus,même sur Internet.On peut redéfinir la méthode size ici.
00:12:26 :Il faut penser ici,en tout cas, chez moi,je vais réussir à le faire comme ça,aux quarks.Ce que j'ai fait,déjà, on va faire un retour.
00:12:41 :J'ai désactivé copilot,parce que ça pollue.C'est plein de trucs de n'importe quoi.Vu qu'il ne sait pas être hyper connu,il va faire des trucs de ouf.
00:12:54 :J'ai mis ma validation d'email ici.Peut-être qu'il y en a qui veulent se lanceraprès avec cet ORM,et qui vont trouver une façon plus proprede le faire.
00:13:06 :Je l'ai fait dans Save.À la base,j'avais écrit une regex.Je l'ai fait avec une regex.Je ne connais pas par cœur les regex,donc vous m'excuserez.
00:13:17 :Mais sinon,j'avais trouvé...C'est un peu fainéant pour ce qu'on a à faire,j'avoue.C'était Validate.Que je retrouve,ce n'était pas Validate.Python, Validate, Email, je crois.
00:13:32 :Ce n'est pas celui-là, je crois.Email, alors si c'est ça.Ici, ce qu'il est assez récent, c'est bon.Vous pouvez installer ça.Là, c'est vraiment pour ce qu'on a.
00:13:45 :Email Validator.Est-ce qu'il est possible de le faire avec ça ?C'est pour vous montrer l'intéressant.Si, c'est intéressant.Bravo aux mecs qui ont fait ça,ce qu'ils le maintiennent.
00:13:58 :On va apporter...Ils ont une fonction Validate Email.Et...Une...C'est ça.Et une exception.Toutes faites pour ça.Il y a Sylla qui arrive.
00:14:11 :Ce qui permet de gérer la gestion des exceptionspar rapport aux mails.Oui, exactement.Salut Sylla.Salut Gab.Salut, salut.Après, tu pourras très bien te faire une exception personnaliséecomme j'ai fait la semaine dernière.
00:14:26 :Là, c'est juste histoire de montrer une librairie supplémentaire en ce moment.J'aime bien regarder un peu ce qu'il se fait dans l'écosystème.J'ai trouvé ça.
00:14:34 :Et du coup, comment j'utilisais ?Je le faisais avec un try except.Si, pas de connerie.Je faisais un try comme ça.Ici, j'envoyais Validate Email.
00:14:44 :Hop.Ça, il faut un email d'utilité.Et en fait, je faisais un except.Email Validator, ici.J'utilisais mon exception.Voilà, je fais un alias.Et en dessous, ce que je fais,ça me permet de dire, je ne sais plus, faire un print.
00:15:03 :J'ai fait un print et j'ai mis Error.Et puis là, tu mettais l'exception qui est validée.Et puis, votre message, voilà.Et ici, du coup, je faisais un retour de false, tout simplement.
00:15:20 :Voilà.Je pourrais très bien faire ça.Ça marche.Donc, voilà.Donc, ça, c'est pour vraiment la gestion de l'email.À la fin, je ferai les migrations, entre guillemets,mais pour l'instant, je vais continuer.
00:15:35 :Au pire, s'il y a des bugs, je débuggerai.Et si vraiment, je galère à débugger, on a qu'au pilote avec nous.Ce n'est pas très grave, on verra bien.
00:15:42 :Ensuite, pour le mot de passe.Alors, ça, c'est pour le mot de passe.Du coup, ce que j'ai fait, c'est que j'ai utilisé...Avant de...
00:15:53 :Voilà.C'est celui-là, oui.C'est le plus récent.La dernière version, il y a 12 heures, vous voyez.Donc, lui, moi, j'aime beaucoup.Il est considéré comme hyper performant et hyper...
00:16:05 :Enfin, dernier écrit, quoi.Donc, j'utilise ça.La doc, elle vous dit tout ce que...Pour le...Tout ce qui est...Pour le hash, et après, pour faire, entre guillemets, le login,tout est écrit.
00:16:17 :C'est vraiment facile, vous allez voir.Donc, j'utilise ça.J'ai déjà fait un projet en CLI, j'utilisais ça avant.Et puis, je l'ai bien aimé, je le réutilise.
00:16:26 :Et il est vraiment...Enfin, je n'en ai mis que du bien.Je ne suis pas expert de la sécurité, mais je n'en ai mis que du bien.
00:16:32 :Et là, on va aller se dire...Un, deux, ici.Voilà.Je crois que c'est PasswordHasher.C'est pas un truc comme ça.PasswordHasher.Voilà.J'ai utilisé ça.
00:16:43 :Alors, c'est là, en fait, où je me suis fait un peu un...Un truc, on va dire, à la Django.Pour le mot de passe, c'est ce que j'ai fait.
00:16:53 :Je me suis fait une méthode.Donc, moi, je l'ai fait en mode privé.Une méthode 7 passwords, en fait.Hop.Tac.Donc, je vais avoir le mot de passe ici en argument.
00:17:05 :Et c'est parti, donc.Ce que je fais...Bon, je vais décomposer un peu.Donc là, j'utilise le password hasher, ici.Donc là, on va suivre un peu ce qu'ils font, eux.
00:17:16 :Et après, ils vous montrent comment on récupère ce qu'on va hasher.Voilà.Donc, c'est pas très, très compliqué.Ça vous fait tout, en fait, pour vous.
00:17:24 :Donc, j'ai mon password hasher.On va faire comme la doc.On va se dire ph.h.Hop.Et on va envoyer, du coup, dedans le password.
00:17:36 :Hop.Et on va...Alors, si on va faire comme ça, je pense que c'est mieux, oui.J'ai une petite question, Gabriel.C'est à quel moment que tu définis l'algorithme de hasherque tu utilises ?
00:17:49 :Ou alors, ils l'utilisent par défaut ?C'est du Bcrypt ?C'est du...Quand ils hashent le password Argon2, là ?C'est du MD5 ou S...
00:18:02 :SHA.T'as dit quoi ?Argon2, peut-être, c'est vraiment...Ils ont leur propre truc à eux.C'est pas du SHA.Parce que, généralement, avec les bibliothèques,t'as la possibilité de définir l'algorithme que tu veux.
00:18:22 :Mais je sais pas si, avec Argon2, il faudrait voir la doc.Je regarderais, sinon, au pire.Alors, pour moi, Argon2...Je vais revenir sur le programme.
00:18:32 :C'est pas du...Enfin, ils sont...C'est différent des connus qu'on s'appelle.Il y a SHA et donc Bcrypt.Ils sont différents.Et...Je sais plus.
00:18:45 :Alors, Bcrypt fait les différents.Mais c'est vraiment à part, en fait.C'est pas du tout du SHA ou du Bcrypt.C'est vraiment à part.Donc, là, en fait, quand tu utilises Argon2,t'auras pas de Bcrypt que SHA.
00:18:58 :D'accord.Le Argon2 a été...Je crois qu'ils appellent ça le Argon2-ID.C'était le plus sécurisé.Et Bcrypt vient derrière, je crois.Après, je connais pas trop l'ordre,mais en gros, c'est un truc comme ça.
00:19:15 :D'accord.Donc là, c'est vraiment, on utilise Argon2.Ok.Ils ont leur algorithme particulier, quoi.Oui, c'est comme ça que je l'ai compris.Après, je suis pas un prof dans le domaine,mais quand je l'avais utilisé la première fois,c'est comme ça que je l'avais compris.
00:19:29 :Je m'étais renseigné,et en fait, il est vraiment à part des autres.Et je crois même que...Je sais plus.Et est-ce que c'est écrit...
00:19:46 :On peut voir les passeurs d'achat.Tiens, ils vous le disent là.Concours du gagnant, passeurs d'achat.C'est ça.Ouais, c'est simple.On va avoir plusieurs passeurs d'achat avec Django.
00:20:05 :Bon, voilà.Et donc, oui, voilà.Donc, ils ont vraiment...Eux, ils sont réputés pour être balèzes.Donc là, du coup, ce que je fais,non, c'est le password ici.
00:20:16 :Eh bien, je vais dire que c'est le hash que j'ai là.Alors, je ne sais pas pour ceux qui font du Django,si vous vous souvenez bien,si vous faites un user.object.create
00:20:28 :et que vous créez votre utilisateur comme ça,votre mot de passe ne va pas être hashé.Je ne sais pas si ça vous dit quelque chose.
00:20:34 :Parce qu'il faut passer par la méthode createUser.Je ne sais pas si ça vous dit quelque chose, ça.Donc, moi, ce que je fais ici,je ne veux pas que l'instance soit instantiée...
00:20:47 :Enfin, je ne veux pas que ça soit créé dans la base donnéenormalement par un create.Du coup, moi, je me fais une classe méthode.
00:20:52 :Et comme Django, je me fais un createUser ici.Voilà.Donc, je prends la classe en premier argument ici.Je prends le name, l'email et le mot de passe.
00:21:04 :Donc, je vais rester très simple.Je vais prendre ces arguments-là.Je n'ai pas d'arguments supplémentaires à recevoir.Et là, c'est parti.Donc, je vais créer ma classe.
00:21:15 :Name, c'est mon instance, je veux dire.Name, ça va être le name.Email, l'email.Le mot de passe, pour l'instant, on va se le mettre de côté.
00:21:26 :Je ne sais pas s'il y a JC,il y a qui fait du Django actuellement.Moi aussi, je fais du Django.Je me suis lancé sur la partie Django.
00:21:35 :OK.Je ne sais pas si vous faites un manager personnalisé,vous verrez souvent le setPassword de Django.Là, en fait, j'ai refait,beaucoup plus simplifié,mais je me suis refait un setPassword à la Djangoet je me suis fait une méthode de classe createUser.
00:21:52 :En gros, ici, ça me permet de créer un utilisateur.Je me souviens comme ça.De créer un utilisateur avec un mot de passe haché ici.
00:22:03 :Donc, j'ai une méthode privée.Je l'appelle là et comme ça, ça va hacher le mot de passe.Ça va l'attribuer au champ.Et après, je sauvegarde.
00:22:10 :Donc là, c'est tout à fait le genre de casoù une méthode privée, en fait,c'est utile de découper les choses.On aurait pu tout faire dans la même méthode,mais là, c'est vraiment le momentoù on peut vraiment dire qu'on peut découper les choses.
00:22:23 :Je dis ça parce que quand j'étais étudiant,j'étais du genre à trop, trop, trop découperet à la fin, j'avais des méthodes partout.Je me suis calmé,mais là, c'est justifié.
00:22:32 :Alors, comment on pourrait définir un login ?Après, je vais m'accélérer un peuparce que je passe beaucoup de temps.On pourrait définir un login comme ça.
00:22:42 :Ici, on va prendre notre instance.On va envoyer un mot de passe dans notre méthode.C'est parti.Je sais qu'il y a eu un momentoù il y a eu un projetoù j'utilisais plusieurs fois PasswordHasher.
00:22:59 :Je me faisais carrément un attribut PasswordHasher,mais bon, on va le laisser comme ça.PasswordHasher, ici.Et on va se faire un Verify.Donc, c'est le ph.
00:23:12 :On instantie ici un Verify.Et ici, vous faites self.passwordet le mot de passe que vous allez rentrerpour vous connecter, entre guillemets.Ici, on va retourneret accepte l'exception.
00:23:30 :Pourquoi tu n'as pas utilisé un Bscriptà la place d'Argon2 ?Un quoi ?Pourquoi tu n'as pas utilisé un Bscript,la fonction Bscript,à la place d'un Argon2 ?
00:23:43 :J'ai pris Bscript parce que j'ai pris Argon2puisque je l'ai utilisé,que j'en étais contentet que c'est considéré un peu comme le meilleur.Donc, je suis resté sur Argon2.
00:23:54 :Après, oui, c'était vraiment un peu aléatoire.Je me suis dit,c'est juste que j'ai déjà utiliséet qu'il est assez simple.Moi, j'utilise du Bscript.
00:24:03 :Ouais ?J'utilise du Bscript.Oui, pour créer les mots de passedans les sites web.Ouais ?Ok.J'avoue que j'aime bien prendre Argon2quand je fais ce genre de petits projets.
00:24:16 :Ok.Donc là, on a tout prévu pour...Bon, là, je vais en accepter un peuqu'il y a très peu de choses.Donc, là, on a tout prévu pour...
00:24:24 :Donc, là, on a tout prévu pour...Bon, là, je vais en accepter un peuqu'il y a très peu de tout,mais ce n'est pas génial.
00:24:29 :Mais bon, c'est pour l'exemple.Pour l'instant, on va rester comme ça.Donc, on va essayer de continuer la suite.Maintenant, on va partir sur une autre classepour vous montrer un peules relations qu'on peut avoir.
00:24:44 :Même si on ne va pas...Je ne pense pas qu'on a instantané des instances,mais c'est...Juste pour l'exemple.Donc là, en modèle, par exemple,on pourrait très bien avoir en messageun titre.
00:24:57 :Donc là, on va repartir sur le carfield.On peut avoir aussi...On peut avoir un message...Oui, on va le mettre même,même si on ne va pas en faire.
00:25:05 :On va rester sur le carfield, ici.Et ensuite, on pourrait très bien direcreated at.Ça m'a l'impression de faire ça sur Django.Et je vais utiliser, donc...
00:25:15 :Je vais le mettre en premier.C'est un slavery standard.Slavery standard.On va mettre time,vidéo,import,datetime.Donc là, j'ai utilisé datetime.Donc, ce qu'on peut faire, ici...
00:25:33 :On va utiliser...C'est un datetimefield.Et on pourrait très bien dire, en fait,en défaut, en valeur par défaut.Comme ça, on pourrait toucher.On envoie datetime.no.
00:25:46 :Je vais y arriver.Donc, .no.Comme ça, ici, on aura automatiquement la dateoù le message est créé.On aura automatiquement la date à laquelle il est fait.
00:25:56 :Et on peut très bien aussi définir, ici,une foreign key.Voilà.Donc, qu'est-ce qu'on veut ?L'utilisateur.Et juste pour vous montrer, avec...Oui, on peut définir une backref.
00:26:10 :Donc, avec Django, c'est le relatedName.En fait, c'est la relation inverse.Donc, ça va être, ici, messages.Donc, en fait, je n'ai pas utilisé dans mon projetparce que c'est un petit projet de démo.
00:26:21 :Mais, en gros, logiquement, vous pourriez faire...Vous pourriez récupérer tous les messagesd'un utilisateur, en fait,en passant, ici, par votre relation inverse.Ah oui, d'accord.
00:26:35 :On va respecter la doc, ici, parce que...Ça ajoutera les bugs si j'ai un problème.Database, ça va être égal à la base donnée qu'on a définie.
00:26:47 :Voilà.Et là, on a les modèles.Il manque juste un database.Merci.Hop, merci.Ça m'évitera un bug.De toute façon, on verra si j'ai des erreurs.
00:27:02 :On verra après.Donc, on a un fichier de settings tout bidonoù on a une base donnée.On a les modèles.Et, maintenant...Je ne sais même plus comment on fait un...
00:27:17 :Avec PeeWee, je ne sais même plus comment on fait un migrate.Alors, exemple app.Parce qu'en fait, je trouve un autre moyen de faire un migrate.
00:27:25 :Je ne sais même plus comment faire un migrate, de base.Je l'avais fait à la base...Je ne sais plus.Je l'avais testé la dernière fois avec...
00:27:39 :Ouais, il y a du create table.Voilà, database create table.OK, on peut créer des tables comme ça.Alors...En fait, je me suis amusé, du coup, encore une fois...
00:27:47 :à djangoiser un peu le truc.Ici, qu'est-ce que j'ai fait ?Je me suis créé une année de pointail.Alors, c'est parti.Donc, là...Là, j'utilise plusieurs choses.
00:28:01 :J'utilise plusieurs choses.J'ai trouvé une librairie qui s'appelle...Là, c'est peeweemigrate.Hop là, on est à l'inverse de disponible.Voilà.Donc, on appuie migrate.Je vais l'installer.
00:28:17 :Vous allez voir à quoi me servir.Et j'utilise aussi...Je ne sais pas si vous connaissez...le typer.Est-ce que ça vous dit quelque chose, le typer ?
00:28:31 :Si, dans la formation de...de TyVault.C'est vrai.C'est avec typer.Oui, oui, oui, c'est vrai.OK, bon.Pour ceux qui ne connaissent pas,on va l'installer.
00:28:45 :On va voir à quoi il ressemble.Hop.Je m'en suis déjà servi, moi,pour un projet de forum en ligne de commande.Donc, on a typer.
00:28:53 :Est-ce que je pense à autre chose ?Non, ça devrait aller.Alors...Donc là, on va utiliser...peeweemigrate.Donc, le but, en fait,ça va être de créer des fichiers de migration,comme avec Django,pour aller créer nos tables.
00:29:06 :Et d'avoir un suivi de ce qu'on a créé, en fait.C'est vrai que j'aime bien les fichiers de migration.Donc là, on va importer le routeur de peeweemigrate.
00:29:14 :On va importer...typer qu'on vient d'installer.On va...Alors, on va importer une librairie standard.Je vais la mettre en haut.J'aime bien savoir si c'est en standard.
00:29:27 :Vous avez déjà utilisé ce process ici, ou pas ?Non.Non, pas du tout.OK.C'est une librairie standard.Donc, pour ceux qui passaient aux A,il faut savoir que ce process,ça vous permet, en fait,d'exécuter des scripts et des applications externes.
00:29:46 :Vous allez voir ce que...En gros,ça vous permet d'aller exécuter des scriptsdirectement dans ce que vous aurez fait dans la console.Vous le faites en Python, par exemple.
00:29:55 :C'est un exemple.Donc là, je vais vous montrer pourquoi je fais ça.Parce qu'avec peeweemigrate, en fait...Oui, c'est ça, peeweemigrate.Il est où ?
00:30:05 :Non, je l'ai enlevé.Peeweemigrate.Hop.Il est là.Avec peeweemigrate,il vous explique un petit peu comment faire.Alors, j'ai compris.J'ai compris.Les migrations,mais les migrations,elles sont assez longues à faire,avec toutes les options et tout,pour bien le faire.
00:30:26 :Donc, j'ai trouvé ça long à écrire à chaque fois.Sauf qu'après, si on dit,vous pouvez le faire en Python.Sauf qu'en Python,je n'ai pas réussi.
00:30:34 :Il n'y a pas trop d'explications, je trouve.Alors, du coup, en fait,je ne l'ai pas fait ici,vraiment,je l'ai fait en Python,mais j'ai utilisé ici,j'ai utilisé ça,et je l'ai combiné à subprocess.
00:30:46 :Voilà, j'ai trouvé un des petits détournements, en fait.Je l'ai un peu détourné.Alors, comment je l'ai fait ?Déjà,je pense que je vais me créer un fichier,un dossier,pour après,que je vais appeler migration.
00:31:01 :Comme ça, je l'aurai déjà.Je ne sais pas si je vais le créer tout seul.Donc, c'est parti.Qu'est-ce que j'ai fait ?Je vais allerme créerune fonction.
00:31:11 :Donc, def,je vais l'appeler make.Je prends des risques là,parce que j'ai fait pas mal de trucs sans tester depuis tout à l'heure.Def make migration, c'est ça.
00:31:20 :Pour taper,ce qui est mieux, c'est de typer.On va vouloir envoyer un nom de migration, ici.Le nom va apporter, fait, notre fiche de migration.
00:31:29 :Et ici, on va utiliser subprocess.Subprocess.En fait, on va lancerune commande.Moi, j'ai toujours vu utiliser en liste.Je ne sais pas si on peut le faire autrement,mais à mon avis,ça ne me dit rien.
00:31:46 :Qu'est-ce que j'ai fait ?Mon écran est un peu zoomé,du coup, j'en ai partout.C'est parti.On va lancer le processqu'on avait,qu'on avait ici.
00:32:05 :La commande, on va l'écrire ici, dans une liste.Chaque partie de la commande.Donc, on va...Ouais, si on va faire comme ça.On va utiliser une...
00:32:14 :Ouais, si on va faire comme ça.Allez, c'est parti.P, oui.C'est pw.Migrate.Ensuite, on a quoi ?Dans les options, on avaitcreate.
00:32:30 :On avait ensuiteauto.Auto.Je ne sais même plus à quoi servent exactementtoutes les options.Je l'avais tout utilisé, ça fonctionnait bien avec.Je l'avais lu.
00:32:47 :Ça va chercher automatiquement dans les fichiers normalement.On va déjà le faire.Autosource.Donc, on va dire qu'on va aller chercherdans notre fichiermodelqu'on a créé.
00:32:57 :On va dire aussiqu'on va utiliserdatamask.Donc là,que la database,on va prendre notre base de donnéesqu'on avait.Avec un A, ça marchera mieux.
00:33:12 :Comme tout à l'heure.Merci.SQLite, du coup.Notre base.Etla classe syntaxe, c'est ça.db.dbOuais, c'est ça.Ensuite,on va spécifierle dossieroù va être crééela migration.
00:33:33 :Donc, le dossier.Et ça va être dansmigration.Voilà.Et là, normalement, on n'est pas mal.Et le nom de notre migration, du coup,ça va êtrele nom qu'on lui a donné.
00:33:46 :Ici.Voilà.Je trouve que je n'ai pas fait de connerie.Donc là, on a bien fait un run.Et maintenant,on va s'arrêter là.On va faire unemaintenant la commande migrate.
00:33:58 :Ici, on va faire un date.Migrate.Deux espaces.Migrate.Et migrate.Comment on va l'utiliser ?Donc là, en fait, c'est pastrès compliqué.J'ai utilisé lele router.
00:34:14 :En fait, on peut se faire un router per run.Et pour utiliser le router,on va d'abord l'instancier.Donc là, je fais un router.C'est égal àtac, router.
00:34:24 :Ici, ma base de données.Ici, ma base de données.Et en fait, quand vous faites unrouter per run,comme ça, ça va aller appliquertoutes les migrationsqu'on peut appliquer encore.
00:34:32 :Et maintenant, en fait,on va utiliser du coup,typer.Donc pour utiliser typer,il vous faut avant lel'instancier.Donc je vais faire comme dans la docde typer.
00:34:45 :Hop.Et typer, on l'a.C'est typer.typer, je crois.C'est ça, parce quet'as fait juste l'import detyper.Il faut que tu le préfixes.J'ai bouillé.
00:34:59 :Non, j'ai pas fait avec monfram.Non, j'ai mon typer.Voilà.Ensuite, quand vous utilisezça,donc il faut utiliser votreapp.Donc vous pouvez l'utiliseren commande.
00:35:10 :Ici, voilà.Alors l'idéal,c'est d'avoir une docstringquand même.Ici.Mais là, par rapport àson affaire, on ne va pas lamettre.Ici, c'est pareil.
00:35:20 :Ça, pour le coup,ça fait penser àun peu.Ah, quand tu...avec ton décorateur.Ouais, ouais.Tac.App.commande.Ouais.Dans tout ça, c'est quet'as le décorateur surtoutes tes fonctions.
00:35:36 :Ouais.Alors, ce que vous pouvezfaire aussi avec typer,du coup, c'est que vouspouvez dire ici...C'est pour ça quej'importe clairement lemodule.
00:35:44 :On peut faire untyper.echo.Et on peut dire...C'est original.OK.Voilà.Et là, pareil,on va se direon va prendre l'écho.Hop.C'est OK.
00:35:55 :Bon, alors là, franchement,si on n'a pas de bugquand je lance le script,c'est bravo parce queavec tout ce que j'ai faittout à l'heure sans tester,il est fort possiblequ'il y ait une erreurqui soit glissée quelque part.
00:36:05 :Et ensuite, on va...Alors oui, bien sûr.Excusez-moi,j'avais oublié.Il faut bien préciser quequand vous faites çaavec typer,il faut penser ici à...
00:36:16 :Hop là.À l'appeler en baspour attraper là.Voilà.Bon.Je pense qu'on est pas trop mal.Je pense qu'il va être le momentde tester.
00:36:30 :Je vais réfléchirà ce que j'aurais pu faire.Euh...OK.OK.Bon.On va essayer quelque chose.Est-ce que je peux faire...Je veux voir si je peux faireun help directement comme çaavec Python.
00:36:43 :Ah, c'est ça.Donc voilà, je peux avoirici des help.Alors là,j'ai pas de docstring.On recommence.On recommence.On recommence.Pour avoir l'exemple.
00:36:53 :Je sais pas,ici on va mettre lancer...Une idée,lancer...Voilà.On va le mettre en français.Créer les...Migrations.Hop.Effectuer les migrations.Ça, c'est bien dit, ça.
00:37:08 :Effectuer les migrations.Hop.Effectuer...Effectuer les...Migrations.Alors, on recommence.Alors, on recommence.Hop.Donc là, vous avez du coupla doc qui m'a coté.
00:37:23 :J'ai bien envie de tester,du coup,je sens que le bug va arriver.Donc,Christiane,alors...Allez, c'est pour se lancer.Donc là, on lancele nom de notre fonction.
00:37:36 :Et on avait dit qu'on avait...Ici, on a un argument name.Il me semblaitqu'il mettait l'argument à côté.Je sais plus s'il faut le préciser,mais...
00:37:44 :Pourtant, je l'ai typé.Oh, je l'ai plus en têtede comment je faisais.C'est pas grave.Donc là,on va l'appeler comment ?Initials.Et on va avoir un joli bug.
00:37:53 :Et non.Et non.Donc là, j'ai bien mon message OK.Mon typer.eco.Et si je regarde,là,j'ai un fil migration.Ouais, cool, ça a marché.
00:38:06 :Putain, je suis content.J'ai un fil migrationici avec ma classe Useret ma classe Message.Alors, pourquoi j'ai utilisécomme ça pwimmigrate ?Parce que sans pwimmigrate,alors, ils ont un modulequi s'appelait Playhouse,mais j'ai pas l'impressionqu'on le puisse faire comme ça.
00:38:22 :En tout cas, avec pwimmigrate,on peut faire comme çaassez facilement des fichiersde migration.Voilà.Donc, je trouvais ça très pratique.Moi, qu'il y a de l'ango,au moins, avec ça,je me fais mes migrationsde cette manière-là.
00:38:34 :Donc, j'ai combiné, du coup.Comme je vous ai dit tout à l'heure,j'ai combiné, je sais plus,ici,avec ce process,puisque je n'ai pas réussià le faire en pur.
00:38:45 :Putain, il y a un microqui doit être ouvert, ça résonne.Je ne sais pas qui c'est.Ça faisait bizarre.Ça ne fait plus.Ouais, donc voilà.
00:38:56 :Donc, ce process,il y a sûrement un moyenpeut-être plus simple de le faire,mais au moins, ça fonctionnait.J'en avais marre de chercherde me prendre la tête.
00:39:03 :Il était 1h du matin,j'avais envie de dormir.Et donc, je sais qu'avec ce process,ça ajoute beaucoup de problèmes.Donc, voilà.Donc, ça a fonctionné.
00:39:11 :Maintenant, on a oublié.Alors, si je regardela base de données,voilà, on a une tablequi s'est faite automatiquementavec Migrate History.Donc, à la Django,encore une fois,vous pouvez avoir du coupl'historique de vos migrations.
00:39:24 :Maintenant, c'est parti.On a fait un Migrate.Hop, et là, j'ai un OK.Donc, normalement,si je recharge,j'ai bien la table message,la table user.
00:39:34 :Ça a l'air propre,en tout cas, pour l'instant.Ça marche bien.J'étais étonné.Je n'étais pas sûr de moiquand je commençais à direallez, ça processe et tout.
00:39:43 :Je me disais, bon,on va tester ça quand même.Je ne suis pas sûr.Donc, voilà.Avec Typer, en tout cas,je fais tout en ligne de commande,machin.
00:39:53 :C'est trop bien.Ensuite, je me suis dit,est-ce que ça prend bien en charge,quand même, si j'arriveet que je fais, genre,mon modèle ici.
00:40:03 :Ici, par exemple,si je viens là et que je fais,je ne sais pas,genre, on va l'appeler test,mais en fait, je n'ai pas d'idée.
00:40:10 :Je n'en sais rien.Voilà.On va mettre un carfield.Hop.Et qu'on va mettre,je crois qu'on peut définir un dépôt.Il me semble.Ouais, je crois.
00:40:20 :Bon, on va bien voirsi ça marche ou pas.Donc, là, c'est parti.On recommence.Si je faisun make migrations,on va mettre,je ne sais pas,on va l'appeler testparce qu'on ajoute test.
00:40:35 :Test field.Ah, test field,on pourrait dire,c'est pas grave.Ouais, c'est bien.Bon, allez, test field.Hop.Et donc, là,si je viens là,qu'est-ce qu'il me dit ?
00:40:47 :Et vous allez voir que ça marche.Dans le modèle message,il a bien été me trouver icimon test field,mon champ de test,avec comme par défaut,ici, la valeur testet un carfield.
00:40:59 :Donc, c'est pareil.Si je recommence.Hop.C'est vraiment du fait maison,ce soir.Je suis,voilà,je ne dis pas qu'il faut fairetout ce que j'ai fait,mais c'est un peu à la débrouilleque j'ai fait ça.
00:41:14 :Et donc, si je retourne dedans,normalement,dans mon message,j'ai le champ testqui est là.Voilà.Excellent.Ouais, mais c'est biende nous faire ça,malgré tout,même si c'est maison,parce que ça nous permetquand mêmede voir un peuce que peut êtrel'anatomie intérieured'un ORM, quoi.
00:41:32 :Bah, ouais.C'est pas de requête,mais c'était vraimentpour montrer ce genrede choses-là.En tout cas,content que ça vous plaise.Pour ORM.Oui.
00:41:44 :Alors.Juste, je vais faire un truc.Je vais faire un truc vite fait,parce queje ne peux pas partirsans vous montrer ça,quand même.
00:41:56 :Le message,on s'en fiche.On va se faire un truccomme ça.Comment je peux le créer ?Ouais, on va faire ça.Non, je ne vais pas faire ça.
00:42:10 :Excusez-moi.Non.Voilà.Je vais y arriver.Donc là, tout à l'heure,j'avais créé une méthode.Si vous vous souvenez,une méthode deune méthode depass.
00:42:20 :CreateUser, ici.Qui me permet de lâchermonmot de passe.Je trouve plus les mots.Donc là, on peut allercréer un utilisateurdirectement avec ma méthode.
00:42:31 :Donc, par exemple,si je faisnameégal...J'avais quoi ?Un email comme champ aussi,j'avais dit.Donc là, par contre,je ne sais pas exactementcomment marche tropcette...
00:42:48 :Elle est où ?Cette librairie,ValidateEmail,là, Validateur,parce que j'ai misun genreunGabriel Trouve5ou je ne sais plus,j'ai mis quoi ?
00:42:58 :Genre Gabarrobasequelquechose.comC'est pour valider les emails.Ouais.C'est une regex, non ?Et bien,c'est plus que çaça réussit à détecterque c'était ici,que ce n'était pasun domaineconnu, entre guillemets.
00:43:11 :D'accord.Si vous écrivez votre email,comment l'autrepeut l'écrire ?Ou bien tu lui donnesun exemple ?C'est-à-dire ?Ça veut diresi l'utilisateurveut rentrerson email.
00:43:24 :Oui.Mais vous l'avezdéjà écritdans le code.Ah, bah après,non, là, c'est vraimenten exemple.Ouais, là,je vais l'écrire comme çaà l'arrache.
00:43:35 :Comme faire,par exemple,avec Typer,ça peut être sympa aussicomme je l'ai fait tout à l'heure,où vous lancez votre scriptet puis vous avez vos commandeset vous pouvez dire,je ne sais pas,créer une fonctionqui va allercréer un utilisateur.
00:43:48 :Mais dynamiquement,en fait,vous rentrez,vous,dans le script,votre nom,votre emailet votre mot de passe.Ce que tu voulais dire,Gabriel,c'était qu'en fait,la fonction validateEmailque tu as importé,elle a une sériede domaines mailqu'elle connaît.
00:44:04 :Ouais, ouais,je ne sais pas,j'ai mis quoi,genre,tu vois,des fois,il y a des testssur les caractèresd'email.Tu peux testerdes trucs comme ça ?
00:44:15 :Ouais, ouais.Attends,on va le faire.Je suis fou,mais on va le faire.Peut-être qu'après,il fait un pingsur le nom de domaine,c'est possible aussi.
00:44:24 :C'est fort possible.Il n'y a pas de réponse.Là,je n'ai pas eu le tempsde creuser parce quej'ai fait hier soiret il était tard.
00:44:31 :Mais là,par exemple,voilà.Ouais.Ouais,c'est dur.C'est bizarre ça,comme domaine.J'étais sur le cul,je me disais,putain,mais en fait,je l'ai bien faitde ne pas faire une rejectparce que c'est cool ce truc.
00:44:47 :Mais j'espère que du coup,il connaît bientous les domainesqui existent,tu vois ce que je veux dire ?Ouais,parce que s'il y en aqui existentet que lui ne reconnaît pas,ben...
00:44:57 :Ou qui est récent,je ne sais rien.Bon,alors forcément,du coup,j'ai faitFRANEL,F-R-A-N-E-L.Encore.Ça marche.Génial.Donc voilà,merci.Ça m'a permis de tester.
00:45:16 :OK.Il doit faire un pingou un truc comme ça,alors il doit...Il y a un petit laps de temps,en fait,comme j'ai remarquéquand tu le lances,en fait.
00:45:25 :En général,c'est rapideet là,je trouve qu'il y aune petite latence,donc je pense que oui.Voilà.Et vous voyez,le mot de passe ici,c'est bien du Argon2.
00:45:36 :Ah oui.Il a enregistrédans la base d'Argon2.Est-ce que le codepeut donner à l'utilisateurpour créer leur mot de passe ?T'as dit quoi ?
00:45:52 :L'utilisateur,il peut créer son mot de passe ?Ben là,on pourrait,oui,en fait,on pourrait très biense créer une fonction.Donc,pur script,ben ouais,tu fais une fonctionoù tu demandes à l'utilisateuravec un input,ben,quel est votre nom,quel est votre emailet quel est votre mot de passe.
00:46:10 :Et ça s'enregistre.Ouais,ouais,ouais.Là,en fait,je l'ai fait,j'ai fait ça,sauf que ce n'est pas dynamique.C'est que je l'ai fait directementdans le lire,comme ça,dans le script.
00:46:23 :Mais on pourrait très bienle faire avec des inputs.Je ne sais pas,là,par exemple,on pourrait faire ça.Je ne sais plus à quoi je pensais.
00:46:31 :Du coup,Argon2,c'est une méthode de hashing.Allo,Gab ?Ouais,ça coupe un petit peu,vas-y.Allo ?Ouais.Je demandais,Argon2,c'est une méthode de hashingou Argon2 ?
00:46:45 :Ouais,ouais,c'est ça.C'est un système de hashingqui est,en fait,pourtant,ce n'est pas le plus connu.J'ai l'impression que tout le mondeparle de,de SHA ou…Non,parce que c'est le plus récent.
00:46:58 :Oui,c'est le plus récent de tout à l'heure.Mais,il y a même eu un concours de hashingqu'il a remportépar rapport aux autres.
00:47:04 :Ouais.Et,c'est assez,c'est assez flagrant,en fait.Il est,il est vraiment très performant,pour le coup.Il y a aussi le Bcrypt.Un peu moins performant.
00:47:14 :A priori,il est même plus performant que Bcrypt.Oui,oui,normalement,oui.J'ai vérifié,je crois qu'il y avait un podiumet Bcrypt,qui est d'ailleurs,peut-être trois placesou quatre places en dessous,je crois.
00:47:27 :Donc,voilà.Après,bon,si vous faites du,donc là,on a créé ça dans la base données.Et après,juste les,les,qu'on s'appelle,vous pouvez faire après des,mince,des requêtes.
00:47:42 :Je ne voulais pas montrer,on va,je ne vais pas,ce n'était pas le but de soir,de montrer des requêtes,mais on peut très bien les direet on pourra,je vais faire une requête.
00:47:50 :On va faire son modèle,un get.Alors,la syntaxe,elle est un peu bizarre.C'est user.name,j'ai appelé comment,le bonhomme Gab,je crois,dans l'histoire.
00:48:01 :Tac,et là,on peut aller faire un print.Gab,hop,ça me retourne un,parce qu'il y a un élément,mais on peut très bien dire,allez hop,Gab,name,c'était,non,modèle sont,c'était name,ouais.
00:48:18 :Et normalement,je peux récupérer le nom comme ça,voilà.Ici,c'est Gab.Après,bon,vous pouvez aller,je ne sais pas dire,après,un Gab,point,je crois que c'est,delete instance,un truc dans le genre,voilà,comme un ORM,un ORM,simplement.
00:48:37 :Hop,voilà,là,normalement,je ne suis plus dans la base.Non,je ne suis plus dans la base.Donc,voilà,c'était juste pour vous faire un,c'est un mentorat un peu spécial,un peu bizarre,peut-être,mais,voilà,c'était vraiment,je fais des petits trucs maison,et après,je me suis un peu Djangoéché,
00:48:56 :tout ça,avec mes 7 passwords,mes create user en classe méthode,euh,euh,mon manette,surtout ici,je me suis vraiment fait un petit truc à la Django,quoi.
00:49:06 :Ah,bah,c'est cool.Voilà,bah,merci.Bah,j'espère que ça vous a plu.Ouais,totalement.Oui.Ouais,super,c'était top.Bah,merci,et puis,merci.
00:49:24 :Merci.Voilà.Ouais,merci.Euh,bah,merci à vous,du coup,bah,pour ceux qui sont là,je dis,je sais pas s'il y a des questions,ou pas.
00:49:37 :Non,c'était très clair.La preuve,c'est que,tout a tourné sans erreur,donc,euh.Ouais,j'ai eu peur,j'ai eu peur,j'ai eu peur.Est-ce qu'on peut le remplacer,euh,genre,on peut utiliser Django,le système de,de,de.
00:49:55 :Oui,côté Django,ce qui est possible.Euh.En fait,est-ce qu'on peut choisir un autre ORM,quoi ?Le,le ORM natif de Django ?
00:50:04 :Oui,ouais.Euh,je pense qu'il y a toujours moyen de ça,bah,après,oui,mais je,bon,moi,j'y verrais pas trop d'intérêt,parce qu'il est vraiment génial,mais,euh,je pense qu'il y aurait quelques petits,ouais,faudrait s'adapter des,après,bon,il est tellement bien celui de Django,
00:50:25 :j'aurais du mal,mais,euh,d'accord,il y a,ok,ok,il faut,il faut un peu voir,parce que,ouais,après refaire tes modèles,voir pour les migrations et tout,je sais pas,ouais,ça serait un peu le,bon,je pense pas qu'il y aurait beaucoup d'intérêt de changer,
00:50:43 :quoi,je,ça doit être possible,mais,est-ce qu'il y a pas,attends,on va regarder quelque chose,ça existe ça,ou pas,euh,SQL Chemie for Django,non,non,y a pas de truc comme ça,non,j'ai pas l'impression qu'ils aient prévu ça,mais,mais faut voir,si ça peut se,
00:51:04 :qu'est-ce qu'ils ont,ah,c'est ce que j'utilise pour,pour Flask,ouais,ouais,ouais,ouais,avec Flask,c'est vachement utilisé,euh,to ease the pain of using,SQL Chemie with Django,bon,ben,ok,et ben,et donc,ah,c'est un,un rappeur,quand Django s'inscrit,database,et puis,ils font leur modèle comme ça,
Aucune occurrence trouvée pour « ».
00:00:16
Exercice TOSA anagramme
00:02:59
Présentation rapide de Peewee
00:06:41
settings pour la BDD
00:10:06
Les modèles
00:12:33
Validation du champ email
00:15:47
Méthode utilisateur à la django
00:27:57
Manager à la django avec peewee migrate et typer pour les migrations de la base de données
00:44:36
Discussion autour de la librairie email-validator