Session du 25 mai 2023 à 20h00
Développement Web & Frameworks
Fichiers & Système
Librairie Standard & Modules
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
Corriger l’ouverture d’un fichier JSON
-
Résolution du problème d'un étudiant avec la lecture d'un fichier JSON.
-
Présentation du projet Django de Gabriel.
-
Exemples et explications à propos des ReGex.
00:00:00 :Ok, donc là j'ai lancé l'enregistrement et puiset puis je vais partager mon écran.Ok, donc là vous devriez voir normalement le VS Code.J'utilise de moins en moins VS Code, maintenant j'utilise PyCharm.
00:00:36 :On va créer un dossier, on va le mettre sur le bureau.Ok, et donc là Benigno je vais te laisser un peu me guider pour me dire c'est quoi le problème que tu as.
00:00:55 :Est-ce que c'est vraiment lié aux settings de VS Code ou c'est plutôt un problème de j'arrive pas à lire un fichier JSON?C'est plutôt lié à un setting je pense.
00:01:08 :Je peux peut-être partager mon écran mais je ne sais pas si...Ouais, ouais, tu peux, vas-y.Attends, du coup j'enlève moi mon partage.En fait, t'as en bas, tu sais, t'as plusieurs boutons là, t'as le micro, machin, et c'est le quatrième en partant de la droite normalement.
00:01:26 :C'est présenté maintenant, c'est ça?Ouais, c'est ça, et là il va te demander quel écran tu veux présenter.Oui, d'accord. Du coup, d'accord.Ok, ça marche, ça arrive. Ça marche, ok.
00:01:53 :Est-ce que tu peux zoomer un peu? T'es sur Windows ou sur Mac?Sur Windows, c'est CTRL, molette, c'est ça?Ouais, CTRL, molette pour zoomer.Du coup, non, ça marche pas.
00:02:06 :Sinon, tu peux aller dans... attends.Tu dois voir dans les settings, en haut, tu sais, dans les views, tu peux zoomer.Quand tu vas dans view, tu dois pouvoir faire...
00:02:27 :Sinon, ouais, si tu fais zoom, quelque part là-dedans, à ta table, zoom.Ouais, donc zoom in, si tu fais, en dessous la view, zoom in, t'as tout en bas, l'avant dernier, juste au-dessus.
00:02:44 :Là, il te propose un... CTRL plus égal, c'est ça?Vas-y, essaye.Voilà, est-ce que ça zoom? Vas-y, encore un peu.CTRL égal.Ouais, bon, c'est bon là.
00:03:02 :Ok, donc là, t'es dans un script qui s'appelle app1.py et t'as un fichier settings JSON qui est dans le même dossier.J'ai dû le créer dans le même dossier, oui.
00:03:17 :Parce qu'avant, il était par défaut ailleurs.Donc j'ai juste copié celui-là.Bon, voilà, j'ai juste repris l'exercice, font size, et j'ai plein d'erreurs.Ok, donc en fait, déjà, tu vois sur ton with open, pour ouvrir la guillemette de ton nom de fichier,t'as mis une simple quote et tu l'as terminé par un double quote.
00:03:49 :Ah oui, ça, j'ai essayé.Ok, déjà, c'est un peu mieux.Et c'est quoi? Va sur l'erreur là qui te montre...Ah oui, mais attends, vu que t'es en Windows, les chemins de dossiers, si tu mets un backslash comme t'as mis là,il va pas aimer.
00:04:10 :Il faut soit que tu mettes un R devant le premier guillemet, avant le premier...Non, non, non, non, non, non.Avant le string, c'est ça.
00:04:22 :Ça, ça veut lui dire que c'est une raw string, donc il va comprendre que c'est du Windows.Et pourquoi t'as toujours... Va avec ta souris sur la petite vaguelette rouge là.
00:04:36 :Ah, voilà, c'est ça, piling syntax error.Ok, vas-y, enlève.Fichier, settings.json.Donc là, c'est bon.Là, normalement, si tu lances, ça devrait fonctionner.Alors, fais dans ta commande là, dans la terminale tout en bas, reste devant, fais un ls.
00:05:13 :Ah oui, en fait, non, non, c'est à cause de la manière dont t'as lancé ton VSCode.En fait, là, il comprend pas que t'es dans le même dossier.
00:05:24 :Donc en fait, le fichier settings.json, il le trouve pas.Parce que tu vois là, sur la gauche, t'es pas dans le même dossier.Ah, ok.
00:05:34 :En fait, j'ai l'impression, parce que ton terminal, il doit pas être dans le bon...Mais après, c'est la seule erreur qui reste.Donc, le fichier settings, il est dedans. Tiens, je vais reprendre la main, je vais te montrer.
00:05:49 :Hum.Hum, attends, je vérifie ici.Ok, là, vous voyez bien mon écran.Oui.Ok, donc là, en fait, tu vois, moi j'ai créé un dossier, je l'ai appelé test benigno.
00:06:14 :Et donc là, si je mets settings.json, et que là, je mets mon app.Et tu vois ici, en fait, quand j'ai mon VSCode, j'ai bien ici, tout est dans le même dossier.
00:06:32 :Il faut bien que... parce qu'en fait, tu vois, lorsque t'as écrit import json,ton fichier, il s'appelle settings.json.En fait, ça, ça s'appelle un import relatif, parce que tu vois, tu pourrais juste, tu peux mettre comme ça.
00:06:49 :C'est un import relatif, parce qu'en gros, il va aller chercher le nom du fichier au même endroit.Tu vois, si tu ne justifies pas le pass, il va aller chercher localement là où il est ton script.
00:07:04 :D'accord.Donc, tu vas comprendre maintenant. Si tu fais with open, ben là, du coup, on va mettre fichier,on le dit en read as f, et tu fais data égale json point load f, il me semble que c'était ça,et on va dire print data, par contre dans mon fichier settings.json, il est vide.
00:07:42 :Test, hello, tu vois là, ça fonctionne.Mais ça fonctionne parce que j'ai tout qui est bien au bon endroit.Et en fait, pour ça, c'est que quand tu crées ton, quand tu vas ouvrir VS Code,au lieu de, il ne faut pas juste ouvrir VS, tu vois, par exemple, si je vais dans testbinio et que je fais apy
00:08:05 :et que je fais ouvrir avec VS Code, ben en fait, tu vois, dans l'explorateur de fichiers, il n'y a rien.Et si j'ouvre un terminal ici, ben il va m'ouvrir un terminal vraiment à la racine de tout ce que j'ai.
00:08:17 :Il ne va pas ouvrir le terminal dans le folder que je lui ai dit.Quand tu ouvres VS Code, il faut vraiment que tu ouvres le dossier entier de là où il y a ton script.
00:08:27 :Tu vois, tu fais open folder, tu vas chercher dans ton bureau, testbinio,et là, en fait, il va te créer vraiment un environnement où tout est ensemble.
00:08:34 :Et quand tu veux ouvrir un terminal, tu vois, là, il est bien dans testbinio.Et là, si je fais ls, j'ai bien mon ap et mon settings.json.
00:08:41 :D'accord, donc ce que je dois faire, c'est open folder, c'est ça de mon tenir?En fait, si tu as Windows, quand tu as ton folder avec ton fichier.py et ton settings.json,
00:08:56 :tu fais clic droit et tu vas avoir un truc qui s'appelle ouvrir avec VS Code.Donc ça, c'est la première solution.Et si jamais tu ne l'as pas, ce n'est pas grave.
00:09:05 :Tu ouvres juste VS Code, mais en mode vraiment vierge.Tu ouvres juste le logiciel.Et là, vu que tu as juste ouvert le logiciel sans l'ouvrir dans un dossier, tu vas avoir ça, open folder.
00:09:17 :Et là, tu vas chercher ton folder où il y a ton application et ton fichier.json.Et là, tu vas bien avoir ça.D'accord, ok, je vais essayer alors.
00:09:29 :Essaye ça et puis si tu as un problème, tu me reposes la question.Mais en fait, je ne comprenais pas trop ta question si c'était plutôt sur comment manipuler.json
00:09:37 :ou si c'était un problème de VS Code.Mais du coup, là, je comprends que je pense que c'est parce que l'environnement VS Code n'est pas bien configuré.
00:09:46 :C'est-à-dire que tu n'as pas ouvert tout en même temps.Et tu n'es pas au bon endroit ton fichier.D'accord, ok, je vais faire ça.Je vais voir si ça marche alors.
00:09:58 :Oui, puis n'hésite pas.Après, si tu veux, on pourra refaire un truc juste nous deux.Si jamais tu es toujours bloqué, tu peux venir.Oui, ça marche.
00:10:07 :Ok, c'est bien gentil.Je t'en prie avec plaisir.Merci.Pas de soucis.Passer dans le code.Ok, du coup, je pense que je vais laisser la main à Gabriel pour qu'il nous présente un peu son projet.
00:10:33 :Comme ça, d'une part pour Gabriel, c'est bien, il peut montrer son projet.Et pour les autres, ça fait un exemple.Et puis, n'hésitez pas à faire des retours critiques et à poser des questions.
00:10:43 :Donc, vas-y Gabriel, c'est à toi.Ok, ok, on va partager l'écran.Vas-y.L'écran de...Je vois quelques nouvelles personnes dans le mentorat, ou en tout cas des personnes que je n'ai peut-être pas l'habitude de voir.
00:11:02 :Donc, c'est cool de voir des nouveaux noms.Benigno, je l'avais vu, et Jean-Baptiste aussi.Mais Benigno, je crois qu'il était déjà là depuis quelques temps.
00:11:10 :C'est ça, Benigno? Mais tu as changé de pseudo en cours de rôle, j'ai l'impression.Non, j'ai toujours gardé le même.C'est la première fois que j'assiste à un mentorat, en fait, parce qu'au début, j'avais pas mal de problèmes.
00:11:25 :Je pense que...Allô?Allô?Benigno, je crois que tu as un problème de micro.Ah.Tac.Bon ben, Benigno, fais-nous signe quand tu es de retour.
00:11:56 :Allô?Alors, tu me dis quand je commence.Vas-y, tu peux y aller.Bon, du coup, en gros, si c'est un collègue qui veut une application, je vais trouver ça assez bizarre, sur le coup, mais pourquoi pas.
00:12:17 :Des idées de quoi? Sur n'importe quoi?Ben, ça peut être... Ouais, il y aura plusieurs catégories.Donc, ça, faut que je voie avec lui, là, pour l'instant, j'en ai fait une.
00:12:26 :Mais il y aura plusieurs catégories, sinon que lui, ça sera vraiment, je pense, entreprise, etc.C'est une idée, genre, pour, je sais pas, quelqu'un qui cherche une idée pour lancer une startup ou un projet ou des choses comme ça?
00:12:40 :Voilà.Ce genre de choses.Du coup, ben, alors, j'ai commencé, moi, je préfère faire ça, c'est que je commence toujours par la partie gestion des utilisateurs.
00:12:49 :Ouais.Donc, justement, le modèle utilisateur, donc...Est-ce que tu peux zoomer un peu, s'il te plaît?Ben, après, on va pas regarder en détail le code, je pense, mais on va regarder les trucs intéressants.
00:13:01 :Voilà, je l'ai fait assez basique, c'est juste que quand tu fais un utilisateur, je le mets toujours par défaut en false.Je veux pas qu'il soit actif.
00:13:08 :Ouais, et attends, juste, je sais pas ce que t'en penses, mais c'est peut-être mieux si tu fais une démo avant, le visuel.Oui, ben, oui, oui, carrément.
00:13:15 :Et après, tu montes ce qu'il y a dessous.Attends.Bon, en gros, je l'ai appelé au nom du mec, le nom du mec, parce que je sais pas quand il va l'appeler.
00:13:25 :OK.C'est des zombies, donc il y a... Voilà.Ouais.En gros, t'arrives, vous arrivez ici, donc moi, j'ai fait un petit côté responsif avec...Ouais, c'est chouette.
00:13:34 :Voilà.Du coup, donc là, quand on arrive comme ça, c'est que j'ai... En fait, il y a deux co-resets.Il y en a un à gauche, un à droite. C'est ceux qui ont des idées et ceux qui sont à la recherche d'idées.
00:13:48 :Donc j'ai eu des trucs bidons, mais c'est juste pour tester.Et je vous laisse sur la page d'accueil, en fait, là, donc je vais vous montrer après, ça m'affiche que les 5 derniers éléments du co-reset.
00:13:59 :OK.Il va falloir que j'arrive à l'inverse, je crois que c'est les 5 premiers, alors je sais plus.Non, c'était bien les 5 derniers, mais... Non, c'est bon, c'est bien les 5 derniers que ça m'affiche, voilà.
00:14:08 :Donc, on peut s'inscrire.OK.J'ai donc la connexion et hier, j'ai... Alors ça, c'est fait maison, c'est un fameux l'air de contact.Alors, je n'ai pas suivi de pétot, j'ai fait vraiment avec ce que je savais sur Django et je l'ai fait de A à Z tout seul.
00:14:26 :Donc je vous montrerai, mais je suis prêt à avoir les critiques parce que ce n'est peut-être pas parfait.Et puis ici, il y aura déposé une idée, ça ne se peut pas encore faire, rechercher ne se peut pas encore faire, mais en gros, là, il y a tout le co-reset de chaque...
00:14:40 :D'accord. Donc à gauche, une idée publiée et après, tu vas moquer dans les modèles, les liens et tout ça.Voilà, c'est ça. Parce que là, en gros, ici, en fait, le mec veut que quand quelqu'un tape un mot-clé, que ça match entre les deux modèles.
00:14:57 :Donc genre là, par exemple, sur le code Django, on sort à gauche et à droite ce qui est dit sur Django.Donc dernière idée publiée, dernière demande d'idée publiée.
00:15:07 :Donc là, par exemple, j'essaie de comprendre le fonctionnement du truc.C'est, tu as un peu des acheteurs et des vendeurs.Tu en as qui viennent avec des idées, ils disent, je ne sais pas, il y a un gars qui arrive, il dit, moi, j'ai une idée de développer une application Django.
00:15:25 :Et tu essaies de faire matcher cette idée-là avec quelqu'un qui dit, hé les gars, j'ai plan d'une application Django.Ouais, voilà, c'est ce genre de choses-là. Donc lui, il va peut-être le faire avec l'industrie, il aura plusieurs catégories.
00:15:41 :Donc c'est pour ça que là, j'affiche la date, l'utilisateur, le titre et un summary, une description.Mais j'afficherai d'autres choses par la suite.Donc voilà, donc un petit moteur de recherche qui est implémenté ici. Et tu m'as dit un truc, tu as l'air pêché.
00:16:02 :Ah oui, quand on se connecte, le menu échange, voilà, ici on passe en déconnexion, on a une vue de son profil.Et quand on veut se contacter, ça met automatiquement l'email ici.
00:16:19 :Ah très bien.Que si là, ça ne s'est pas, tu vois.Donc c'est des petits cas que je n'ai pas forcément vu tout ça en formation.
00:16:28 :Mais après, quand on travaille avec Django, il y a plein de trucs qu'on...En reprenant ce qu'on a vu avec les vidéos de Thibaut, les bases, ce que tu m'as appris, à force, il y a plein de choses qui deviennent logiques.
00:16:41 :Ouais, bah ouais, super.Ouais, l'inspection, on verra plus.Ouais, donc ce que tu dis, c'est que tu crées ton... Enfin, c'est aussi pour les débutants que je dis ça, ou même les gens qui ne connaissent pas Django.
00:16:58 :Donc en gros, tu crées ton projet, et ta première application dans ton projet, c'est Account.Ouais, voilà, ouais.Excusez-moi, je ne vais pas préciser, mais oui, en gros, quand je crée mon projet, je commence toujours par l'utilisateur.
00:17:11 :Là, je leur donne des petits noms qui sont en rapport avec le projet.Donc là, t'es quoi, c'est ton nom?Ah oui, le thinker.Le thinker, voilà.
00:17:21 :Ok.Le username, par exemple, je n'ai pas mis, tu l'auras peut-être vu pour être plus explicite, mais vu que j'hérite de la classe abstract user...
00:17:29 :Hop là, merde, je pensais que je voulais le faire.Je suis où?Oui, donc en gros, tu as utilisé la classe user built-in de Django, et puis tu l'as sur Django IDE, je crois que je t'ai expliqué.
00:17:43 :Ouais, le username, je ne l'ai pas mis parce qu'il est déjà dans la classe dont j'hérite.Et j'avais pas envie de retaper tout ça, tu vois, et c'est bien pratique, les petits help text, les sessions de validation, tout ça.
00:17:54 :Oui, non, mais t'as raison, de toute façon, il faut utiliser...Donc voilà, ce qui peut être intéressant à voir dans ces cas ici, c'est que je vais aussi créer un espèce de mini modulequi fait que quand un utilisateur va rentrer son mur de téléphone, en fonction du pays, ça va mettre le bon indicatif.
00:18:13 :Ouais, vas-y, zoom dessus.Euh... ouais, t'as que le tout en bas, excuse-moi, voilà.Celui d'avant, ouais, re-zoom sur le code d'avant.Voilà.Ça là, ouais, vas-y, zoom.
00:18:27 :Encore, ok.Tu me dis stop, c'est bon là ou pas?Euh... c'est encore un peu petit. Vas-y, c'est bon, c'est bon.Ok.Voilà, donc en gros, je me suis trouvé un JSON avec pas mal d'infos.
00:18:45 :Ouais, je l'ai vu poster sur le computer.Tous les pays du monde avec le code, je crois, il y a deux lettres là, et le dial code justement pour le mur de téléphone.
00:18:55 :Ok.Et donc je suis créé des petites compréhensions de listes par rapport à ce JSON ici.Ok.Et du coup, ça, je l'importe ici.Tu l'as stocké où ça, ton country found list?
00:19:10 :Je l'ai à la racine en sous-source ici, directement dans la source.Et pourquoi t'as mis un fichier.py et pas simplement un fichier.json?Parce que... ouais, parce que j'ai utilisé du Python ici à cet endroit-là, alors que oui, j'aurais pu peut-être le faire dans Python.
00:19:30 :Moi, ce que je te conseille, c'est de séparer tout ce qui est input, etc. dans des JSON et la logique Python ailleurs.Faut vraiment séparer.
00:19:41 :Donc ce que t'aurais pu faire, c'est juste faire un JSON qui contient tous les codes,et le country et le dial, tu le faisais dans ta fonction dans le modèle, en format flan-nober.
00:19:51 :Ouais, c'est vrai.C'est vrai, j'ai pas fait comme ça du coup.Non, non, c'est pas grave, mais c'est juste, tu vois, comme ça t'as pas un fichier.py qui est en fait un input.
00:20:02 :C'est juste pour hiérarchiser au mieux le code.Ouais, ok.Ok.Et du coup, voilà, donc si le numéro de téléphone, il ne commence pas avec un petit plus quelque chose,du coup je vais le formater.
00:20:19 :Bon, déjà, je vais enlever le zéro.Et ensuite je vais faire en sorte que selon le pays qui l'ait choisi, ça matche avec le bon dial en fait.
00:20:28 :Ok.Le bon indicatif.Voilà.Et si ça fonctionne, j'ai essayé.Bah oui, j'imagine.Ok, bon, c'est pas mal déjà.C'est pas mal.Bon, ensuite il y a une classe modérateur.
00:20:44 :Et là ici, c'est juste un... c'est pas relié du tout pour l'instant aux utilisateurs.C'est une classe modérateur qui a pas où on met juste un email, un pseudo et c'est tout.
00:20:54 :D'accord, ok.Vous allez voir pourquoi par la suite.Bon, le BaseManager, pour le moment, il n'a pas besoin de... je ne sais pas.Et du coup, j'étais où?
00:21:04 :Account, la vue, tacle.Alors, donc là...Oui, il y en a.L'inscription du coup d'utilisateur se passe par un...Il y en a.Par un...
00:21:19 :Une forme.Une forme, voilà.Ok.Basique.Donc j'utilise ici, sauf que...Vous devez faire un form.save.Ah non, non, non, pas maintenant.Comme dans la Dagger Django, ici, en fait, j'utilise le module sendzérificationemail.
00:21:37 :Ok.C'est le module là.Et en fait, ça me permet de...Alors la date est très bien faite.Ça me permet de faire en sorte qu'il y a un mail qui soit envoyé à l'adresse mail.
00:21:52 :Si je veux s'inscrire, il faut activer ton compte.Voilà.Ok.La doc, elle est super bien faite.J'ai tout fait avec la doc, perso.Et donc, en fait, ça, par contre, t'as configuré dans tes environnements ton serveur SMTP, etc.
00:22:08 :Pour pouvoir envoyer un mail.Ouais, c'est ça, c'est ça, c'est ça.Tac.Donc ici, je me suis configuré un SMTP avec Yahoo.Ok.Et alors avec Yahoo, ce qui est marrant, c'est qu'il faut bien préciser ça.
00:22:24 :Le défaut from email qu'avec Google, il n'y a pas besoin.C'est le test.En bref, c'est pas important.Avec moi, j'ai déjà fait, par exemple, sur WordPress, quand tu veux configurer un envoi de formulaire automatique avec ton adresse mail,c'est pas le SMTP comme ça qu'il faut configurer.
00:22:42 :En fait, il faut configurer une application Google API dans le workspace développement.C'est un peu différent.Je sais pas si jamais un jour tu fais du WordPress, tu verras.
00:22:52 :C'est un peu différent.D'accord.Du coup, j'ai mis dans les app, les arrêt d'environnement,les mots de passe, c'est pas les mots de passe de ton compte.
00:23:04 :Ah ouais, c'est les nouveaux qui sont générés, ouais.C'est ça, ouais, c'est des mots de passe d'application.Du coup, là, il y a la création du utilisateur.
00:23:17 :Donc, ça envoie un mail, voilà.Pour activer, et qu'est-ce que je voulais dire?OK, ça c'est bon, ça c'est le config activé.Le login, c'est assez basique.
00:23:31 :J'ai surfé l'email, le passeport.Ouais, il fait.Voilà, basique.La fonction logout, je crois que c'est la plus simple de l'ongo.Ouais.Alors là, j'ai fait une vue du profil, celle que je vous ai montrée.
00:23:48 :Donc, justement, ici, c'est le profil, en fait, c'est un formulaire.Il y aura toutes les données initiales, en fait, ça sera les données du utilisateur.
00:23:59 :En nickel, en fait, j'ai passé le...J'ai fait un modèle public et je l'ai passé au formulaire.Et du coup, toutes les données d'utilisateur restent directement préregistrées.
00:24:10 :D'accord.Voilà, donc, puis après, je récupère après les...J'ai fait la personne rentre dans le formulaire pour modifier les données.Et est-ce que tu peux montrer tes modèles un peu pour qu'on voit les liens de Forenquet, etc., s'il y en a?
00:24:29 :L'utilisateur?Je ne sais pas, par exemple, dans les idées ou les ids, j'imagine que tu as des...Tu dois avoir des Forenquet quelque part.Tac.
00:24:44 :Écoute, je passe directement à ce moment-là sur l'application id.Vas-y.Juste pour les utilisateurs, j'ai fait un système de reset email par mail aussi.Ça ne fait que le dérêtage.
00:24:58 :Voilà.Du coup...Du coup, du coup, elle dit ça, elle compte, on va aller...Attends juste un second.Tac.Et tu m'as dit id, ici, voilà, le modèle.
00:25:13 :Souvent, c'est un des trucs intéressants dans un projet Django, c'est...Ouais.Le modèle.Donc, il y aura justement les catégories.Ok.Ça, c'est assez basique.
00:25:26 :Je regarde que le swag, swagify, ça, je le sais quasiment à chaque fois que j'ai un swag.Ok.Donc, ça, c'est le propre.Ensuite, voilà, donc là, les ids.
00:25:40 :Ok, donc, tu as que des...Ok, donc là, c'est des champs d'entrée, etc.Moi, ce qui m'intéresse un peu, pour que les gens y voient aussi, c'est les Forenquis.
00:25:51 :Dans la catégorie, et le spiker, c'est l'utilisateur.Est-ce que tu peux montrer, si tu es d'accord, dans ton interface administrateur,comment ça se traduit, ça, les Forenquis, pour que les étudiants voient?
00:26:04 :Ouais, ouais, oui.Je vais vous montrer.Je suis sur...Attends, je vais faire un petit...J'ai une mail, là.Le j'ai, c'est dans...Ça va dans id, et va, par exemple, quand tu vas créer une nouvelle id, voilà.
00:26:31 :T'as la catégorie, l'utilisateur.Ouais, c'est ça.Et donc, juste...En fait, vous voyez, là, en fait, Gabriel, il a créé un champ catégorie dans son modèle id.
00:26:43 :Et en fait, le fait qu'il ait défini que ce soit une Forenqui, ça veut dire que c'est une clé étrangère,et bien, en fait, si tu vas sur recatégorie pour montrer que ça fait une liste déroulante.
00:26:53 :Il y en a qu'une.Il y en a qu'une.Ouais, bah...Mais c'est pas grave.C'est juste pour montrer que, en fait, vous pouvez lier les différentes...
00:27:05 :En fait, ce qu'il faut...Vous voyez, sur la gauche, là, on a...C'est un peu...Vous pouvez voir ça comme des tables, en fait.En fait, vous pouvez lier des tables entre elles grâce, justement, aux Forenqui.
00:27:18 :Donc là, le fait...On peut rentrer indépendamment les liaisons entre elles.Donc, par exemple, Gabriel, il aurait pu créer catégorie informatique, paysagiste ou j'en sais rien.
00:27:30 :Et après, ça laisse le choix de, quand on crée une idée, de pouvoir aller sélectionner la catégorie qu'on veut.Et ça, ça permet d'avoir une application qui est très flexible.
00:27:38 :Parce qu'en fait, parfois, on fonce un peu tête baissée et on essaye de...En fait, Gabriel, il aurait très bien pu créer directement des attributs...
00:27:51 :Un attribut pour chaque catégorie.Donc, par exemple, je sais pas, directement informatique, paysagiste, etc.Mais ça, ça aurait été, entre guillemets, hard-coded dans l'application.Et après, il n'y a plus du tout de flexibilité.
00:28:05 :On n'a plus le choix d'ajouter d'autres catégories.Alors que faire des forensics comme ça, avec des clés étrangères,ça permet justement de pouvoir faire vivre l'application et ajouter des catégories après, à postériori, si on veut.
00:28:18 :Tu vas clairement passer par le petit plus ici, en plus.Ouais, tu peux directement le créer.Donc là, vraiment, quand vous voyez dans un modèle forensic, c'est ça que ça permet de faire.
00:28:33 :C'est de pouvoir sélectionner une clé dans une autre table à celle sur laquelle on est en train de travailler.Ce que je peux montrer qui peut être intéressant, c'est par rapport au publié ici.
00:28:45 :Ça joue beaucoup sur la suite du projet parce que, déjà, il y a le modèle Request ID, c'est le pendant.C'est l'autre côté, en gros. Mais c'est la même chose, plus ou moins.
00:29:01 :Ouais, d'accord.Par exemple, si j'ai fait une méthode email to admin, si jamais il y a un utilisateur qui a eu une idée,ça va envoyer un mail aux administrateurs. Ce que j'ai fait, c'est que j'ai utilisé la fonction sendEmail.
00:29:20 :Et pour récupérer la liste d'emails de modérateurs, j'ai importé ici le modèle modérateur.Et j'ai fait une compréhension de liste par rapport à ça.Je récupère les emails, comme ça il n'y a pas besoin de les rajouter à la main.
00:29:34 :Super, ouais.Voilà, et puis dans Save, j'envoie un mail.Quand je sauvegarde mon idée, boum, ça envoie l'email.Ouais, ça c'est une bonne idée.Et ça, retenez-le aussi, quand parfois, il n'y a pas longtemps, j'ai travaillé sur une application,c'était pour un club de foot, où on a besoin de créer des joueurs et des qualités associées aux joueurs.
00:30:07 :Par exemple, imaginons qu'on créait avant dans une table, qualités, je ne sais pas, marque des buts et défend bien.Après, ce que vous voulez, c'est que quand vous créez un joueur, vous voulez que automatiquement,vous associez toutes les qualités aux joueurs.
00:30:28 :Et après, vous affectez les notations des qualités.Par exemple, le joueur sait défendre, et vous pouvez lui dire bien, pas bien, très bien, etc.Et en fait, grâce à ce qu'a fait par exemple Gabriel, il a surchargé la méthode Save.
00:30:41 :Donc ça veut dire qu'on peut contrôler, quand on crée un joueur par exemple,je veux qu'au moment où je crée un joueur, je veux que tu me crées automatiquementtoutes les qualités associées disponibles.
00:30:52 :Donc en fait, vraiment, la surcharge de méthode, comme c'est fait Save,ça permet de créer des actions au moment où on crée un joueur.Donc là, en l'occurrence, quand il va créer une idée,il va forcément sauvegarder cette idée parce que c'est la méthode Save du modèle,mais il va en plus faire des actions automatiques qui sont de créer les emails,
00:31:26 :enfin de faire un email et l'envoyer.Voilà, c'est bien ça Gabriel, c'est ce que tu as fait?Oui, excuse-moi.Je voulais dire que j'ai eu un problème en fait.
00:31:41 :C'est qu'à chaque fois, par exemple, que l'administrateur, du coup, il coche le publié,et bien ça me renvoyait un mail.Si tu voulais modifier l'instance, ça me renvoyait encore un autre mail.
00:31:54 :D'accord, c'est un boulet, hein, que tu as mis pour le...Ouais, pour le publié, ouais, donc je t'ai bombardé le mail.Du coup, ce que j'ai fait, c'est que j'ai vérifié que l'instance,que l'instance ne soit pas déjà dans le Core i7, en fait, si tu vois.
00:32:11 :D'accord.Core i7 ici, je vérifie que ce ne soit pas déjà dedans,et si c'est déjà dedans, du coup, ça m'envoie pas un mail.Ah oui, d'accord, ok.
00:32:17 :Sinon, j'étais un peu bombardé.Bon, c'est la même chose pour la suite, voilà.Bon, après, rien d'exceptionnel.Bah, si, si, c'est super.C'est plus sur les vues après que ça...
00:32:31 :que c'est intéressant, quoi.Ouais, ouais, bah déjà, c'est déjà un super beau projet, je pense qu'il est bien structuré.Et il y avait une question tout à l'heure de... c'était Seb, je crois, qui disait
00:32:41 :« Est-ce qu'on peut styliser une page Django avec du CSS? »Donc, avant de répondre, Seb, dis-moi si je comprends bien la question,c'est comment on fait pour avoir une belle page HTML avec une application Django?
00:32:56 :C'est ça ta question?On peut styliser.Bah, du coup, là, ça fait une bonne transition pour...Il faut définir, en fait, des feuilles de style, donc style CSS,comme le montre Gabriel à l'écran.
00:33:08 :Et grâce à ça, tu peux appliquer un style à ta page.Je ne sais pas, Gabriel, si tu peux montrer un exemple, par exemple, de...
00:33:17 :dire comment tu as fait pour que la page, le background, il soit bleu,tu sais, le bleu turquoise.Un body, background, j'ai fait un gradient ici.
00:33:29 :Voilà. Vous voyez, en fait, vous définissez le body.Donc ça, en fait, le body, ça va identifier la balise HTML qui va dire...Bah, vas-y, Gabriel, je te laisse expliquer, en fait.
00:33:41 :Ouais.Je ne suis vraiment pas bon du tout, en France.Pour moi, c'est Bootstrap qui fait tout le boulot, quasiment.Je ne sais pas si on peut dire surchargé, mais j'ai rajouté des petites chosesen plus pour mes marges et du coup, pour la couleur du background.
00:33:57 :Bah si, c'est ça, c'est une surcharge, parce que le body, il existe déjà sur Bootstrap.Donc là, tu le rajoutes avec quelque chose.Ouais, dans mon template de base que j'éteins, ouais, donc...
00:34:08 :Donc ça, le body, il est où, mon body? Il est là.Donc en gros, ça me fait justement se dégrader.Ouais.Et...Et après, sur chaque page, c'est Bootstrap, en fait.
00:34:24 :Je crois, un exemple, template, c'est...Attends, je vais te faire ça, je crois que j'ai besoin.Voilà, template.L'index.Voilà, donc là, c'est Bootstrap, c'est les conteneurs, en fait, de Bootstrap.
00:34:37 :Ouais, c'est ça.Oui, oui.Du coup, moi, Seb, ça répond à ta question, comment...En fait, après, comment on fait pour que Django, il reconnaisse la feuille de style, etc.
00:34:51 :C'est ce que montrait Gabriel, c'est en lui indiquant la destination des fichiers statiquesgrâce aux URL et aux static routes.Il me semble, ouais, tu vois, le static route, ça lui dit...
00:35:08 :Le static URL, pardon, ça lui indique où est-ce que sont les fichiers statiques.Et le static route, c'est plus pour les fichiers statiques qui sont...
00:35:25 :Genre des images, je pense.Voilà, les images et tout ça du site.C'est pas pour le CSS, etc.En fait, tout ce qui va être vraiment images statiques qui vont pas bouger, genre le logo et tout ça,on va les foutre dans le static.
00:35:40 :Et après, tout ce qui va être images qu'on va uploader ou des choses comme ça,ça va être du média ou du static route.Et donc, c'est l'URL qui va être rajoutée justement à la fonction statique.
00:35:52 :Ouais.Voilà, en gros...Bah, super.Voilà, c'est basique, hein, j'ai mis le détail.Non, c'est pas si basique, franchement, c'est propre.J'ai ajouté pas mal de petites fonctions perso pour la vérification d'email, etc.
00:36:10 :Ouais, et puis dans les views aussi, tu vois, genre les...Ah, c'est parce que les derniers, j'ai le lent, tu vois.Ouais.Le détail view, je passe par les classes parce que c'est moins le bordel, je trouve.
00:36:22 :Oui, je trouve aussi.Et puis après, quand tu doubles les curvées, c'est justement là que je fais mon hauteur de recherche, Léa.Ok.Et donc ça... Ouais, d'accord.
00:36:38 :Et est-ce que... Peut-être que tu sais déjà comment on fait.Tu sais que tu peux mettre ça dans ton fichier admin.En fait, tu peux surcharger ta classe admin pour que cette recherche, elle apparaisse aussi dans ton interface administrateur.
00:36:56 :Tu sais, quand t'es dans l'interface admin de Django, si tu veux avoir un champ recherche,tu peux mettre un search field dans... Voilà, c'est ça. Dans ID admin, tu l'as déjà fait.
00:37:07 :Je l'ai fait... J'ai même, par exemple, ce qui peut être bien, c'est quand t'as des listes, genre des catégories,où t'as des boulets, là, je les fais des...
00:37:15 :Ouais, tu peux les filtrer.Voilà, c'est ça. Statistique catégorie. Publier, non publier, par exemple.C'est ça.Et voilà. Et hier, j'ai bossé sur la fermierie de contact.
00:37:25 :Ok.C'est la dernière chose. C'est ça, c'est ce qu'il y a fait hier soir.Donc, en gros, t'arrives... Soit t'es connecté, et du coup, t'as ton formulaire avec tes données initiales, pour le contact.
00:37:38 :Sinon, t'as un formulaire vierge. Et puis après, tu récupères les données et t'envoies un mail à toi-même,en gros, en récupérant quand même l'adresse mail de la personne. C'est ça qui répond après.
00:37:52 :Ok. Bah écoute, c'est super. Bravo. Franchement, en plus, j'ai l'impression que ça fait pas trop longtemps que t'as commencé ce projet.Ouais, alors je sais que... Je boule en même temps, donc c'est chaud.
00:38:07 :Mais j'ai commencé la semaine dernière, je crois, il y a une semaine, une semaine et demie.Voilà. Bah ouais, franchement, c'est déjà un beau progrès.
00:38:18 :C'est pas parfait. Je n'hésite pas. J'ai commencé depuis le mi-janvier de l'angoisne,donc il y a plein de choses peut-être à redire ou des choses encore, mais j'essaie.
00:38:29 :Non, bah super. Franchement, félicitations.Merci.Bah ouais, les autres, si jamais vous avez des retours ou des critiques, n'hésitez pas, c'est fait pour.N'hésitez pas, de toute façon, il est... Gabriel, il est dispo... Je me permets de dire ça, mais Gabriel, il est sur la communauté.
00:38:58 :Je veux dire, il est sur la commune, etc. Donc profitez-en si vous voulez discuter du projet, poser des questions,ou si vous faites un projet que vous voulez échanger.
00:39:09 :C'est... Ouais.Non, je disais que j'y suis en moyenne tous les soirs, sauf le samedi, dimanche...On dit samedi, mais en moyenne, tous les soirs, j'y suis de 21h à 1h du matin.
00:39:22 :OK. Ouais, bah...On est des fans de... Je pars avec Moïse il y a pas longtemps, on a fait un petit...C'est des petits chats libres, là.
00:39:31 :Ah oui, d'accord. Et ça, ça marche. Enfin, je veux dire, ça vous fait bien avancer, ça?Ouais, bon, on bosse chacun de notre côté sur un... Lui, il est assez court, parce qu'il a encore l'étoile Jidon, par exemple.
00:39:42 :D'accord.Donc je vais lui réexpliquer des choses. Pourtant, le Jidon, c'est pas trop mon truc, mais je vais lui réexpliquer ce que je savais,ce que c'était vraiment, les bases.
00:39:50 :Ouais.Du coup, après, c'est bon, il a vu la compréhension, et puis il me demandait par rapport à Django, justement, des choses.Du coup, j'ai partagé un peu ce que je faisais en même temps, et puis...
00:39:58 :Ouais, c'est bien aussi d'essayer d'expliquer des choses aux gens.Ça permet aussi de mieux comprendre, en fait, quand on essaye d'expliquer.Est-ce que ça vous dit... Ça va être short, mais je vais essayer.
00:40:16 :En 15 minutes, qu'on essaye de se faire une petite application Streamlit, et puis qu'on la mette à dispo sur Internet avec les tunnels Cloudflare.Dites-moi si ça vous intéresse, sinon... J'avais eu pour idée de reparler des regex, mais c'est peut-être un petit peu moins fun.
00:40:32 :Donc ça va pas être pure Python, ça va être un peu DevOps Network, là, ce qu'on va faire.Dites-moi si ça vous intéresse.Parce qu'en fait, regex, j'en ai déjà parlé dans des mentoras, mais...
00:41:03 :On va peut-être faire ça, regex, et puis la prochaine fois, je vous ferai la démo Cloudflare, parce que c'est un petit peu moins Python.Donc là, je suis un peu en freestyle sur les regex.
00:41:52 :Hum...Donc là, je lui demande de générer un texte avec CloudGPT, un texte fake.Je lui ai demandé de me générer dans le texte des numéros de téléphone, des adresses mail, bidon, et en gros, notre petit jeu, ça va être de les récupérer automatiquement grâce à leur format.
00:42:49 :Parce que, je vais lui dire aussi, remix...Je vais lui dire aussi de me rajouter des nombres, comme ça, ça peut porter à confusion avec les numéros de téléphone, et comme ça on va s'amuser à essayer de ne pas les retenir.
00:43:21 :Donc là, je lui laisse générer le texte.Ça peut être marrant de voir ce qu'il a écrit quand même.Ok, donc là on a notre texte.
00:44:23 :Dites-moi, c'est toujours intéressant de savoir un peu le niveau de chacun.Dites-moi juste si c'est votre premier mentorat, et aussi si vous êtes débutant, avancé, ou si vous faites du Python depuis longtemps. Comme ça, c'est intéressant de savoir.
00:44:52 :Alors, si jamais vous voulez importer du texte dans un fichier externe, vous pouvez le faire comme ça.Vous dites, with open, là vous mettez le nom de votre fichier, donc moi il s'appelle data.txt.
00:45:06 :Vous dites R pour dire que vous voulez en mode read, as F, et là vous dites data égale F.readlines.Donc là, si je fais OK, je vais lancer mon terminal.
00:45:46 :Donc là j'ai récupéré mes datas par ligne, je vais plutôt les récupérer en un seul string.Donc là j'ai bien récupéré mon texte, si je fais print data, j'ai bien mon texte avec quelques sauts de lignes.
00:46:23 :Imaginez que vous avez un texte et que quelqu'un vous dit, j'aimerais bien récupérer tous les numéros de téléphone qui sont dans le texte.Donc naïvement vous pourriez vous dire, mes numéros de téléphone, ça veut être, on pourrait faire un data types, parcourir et dire si j'ai un integer, etc.
00:46:53 :Je récupère mon numéro de téléphone, mais c'est un peu foireux, parce que c'est pour ça que je vais demander de mélanger un peu.Par exemple là 24, si je parcours et que je fais data types int, il va me le trouver 24, mais 24 ce n'est pas un numéro de téléphone.
00:47:07 :En fait, on va utiliser une regex, on va dire que la regex permet de récupérer un format très particulier d'une chaîne de caractère.Donc qu'est-ce que c'est un numéro de téléphone? On va l'appeler comme ça, reg égal, il faut la définir comme ça et là on va définir le format dans lequel doit être notre regex.
00:47:44 :Ça me donne mal au crâne ces regex, la vache.Ouais, moi aussi. Alors, c'est du, attend il y a combien? Un numéro c'est 1, 2, 3, 4, 5, 5 groupes. Donc, en fait on va commencer comme ça et après je vais vous montrer petit à petit comment on fait pour aller plus loin.
00:48:32 :Donc, maintenant si je lance run main, ok, et que je fais numéro, ok super il n'a pas trouvé.Voilà, donc déjà, findall, pourquoi il ne m'a trouvé que ça?
00:49:05 :Je vais aller directement dans regex 101 qui permet de s'entraîner sur les regex justement, donc là je vais mettre mon texte.Si jamais un jour vous avez des regex à faire, je vous conseille d'utiliser ce site là qui est très bien.
00:50:00 :En gros je lui ai dit, trouve moi, je vais enlever celui là pour vous montrer, ici là quand je dis entrecrocher 09, c'est que je lui distrouve moi n'importe quel entier qui se situe entre 0 et 9. En gros quand vous voulez chercher un entier, c'est comme ça qu'il faut le faire.
00:50:24 :Mais c'est pas suffisant parce qu'en gros si je lui dis trouve moi tous les entiers 09, vous voyez ici comme vous allez voir dans les matchs,là en fait un match ça veut dire qu'il a trouvé quelque chose, il vous les indique tous, tu vois. Donc là il dit 0, 7, 1, 2, il les a trouvés un par un.
00:50:47 :Mais moi c'est pas ça qui m'intéresse, parce que si par exemple, moi je n'étais intéressé que par les numéros de téléphone,ben là 24, quand il dit je réponds généralement dans les 24 heures, ben il me l'a trouvé aussi parce que c'est bien un entier, 2 et 4, c'est bien des entiers qu'on prie entre 0 et 9.
00:51:54 :ça ne m'intéresse pas. Moi je veux uniquement les formats comme ça, donc c'est 2 chiffres, 1 espace, 2 chiffres, 1 espace, etc.Donc ce que vous dites c'est je cherche les groupes de 2 chiffres qui se suivent avec ensuite un espace, donc ça c'est comme ça qu'on définit un espace
00:52:08 :dans une réglexe et après on continue. C'est peut-être un grand S.Alors l'espace c'est bien un petit S normalement.Non c'est pas ça que je voulais. Je voudrais juste être sûr que là par exemple est-ce qu'il me trouve bien les 2.
00:53:16 :Excusez-moi. Est-ce que ce serait pas un backslash plutôt. Ok c'est à cause du backslash.Donc là vous voyez je lui ai dit trouve moi les groupes qui correspondent à cette description, donc c'est à dire juste 2 chiffres,donc là ici 2 chiffres qui s'enchaînent, donc n'importe quoi entre eux. Parce qu'en fait ça le 0 et 9 c'est intéressant parce que moi je ne sais pas
00:54:10 :donc c'est 2 chiffres, un espace et 2 chiffres. Et après encore un autre pattern qui m'a trouvé. Donc si je continue à rajouter ici,vous voyez là son premier match c'est bien le groupement de 2 chiffres. Donc moi si je veux un numéro de téléphone, il me suffit de le faire comme ça.
00:54:37 :un numéro de téléphone en particulier. Et si jamais par exemple vous voulez extraire en fait plutôt un email, je l'avais vu passer quelque part,il suffit d'aller trouver une réglette qui permette d'aller chercher des caractères qui sont entourés par un arrow base. Donc là par exemple si je faisais,
00:55:00 :donc là pour les caractères c'est un peu pareil que les chiffres, il suffit de dire a à z, donc là c'est n'importe quel caractère.Ensuite on peut lui dire l'astérisque pour dire n'importe quel caractère, donc je l'écris et après je vous explique. Et après on continue avec du a à z.
00:55:21 :On veut le point et on veut par exemple toutes les emails en.com. Donc là il devrait nous trouver, attendez je vais déjà sélectionner ça.Si j'en veux au moins un, je dois lui mettre comme ça, a z plus arrow base et là plus et je vous l'explique après, pas de soucis.
00:56:06 :Et en fait, si on veut du plus, là vous voyez il m'a trouvé exactement une seule, parce que si j'avais mis, je sais pas moi, juste un,l'arrow base, il aurait pu me trouver autre chose, si par exemple, je sais pas vous pouvez me joindre, vous savez des fois on dit at, je sais pas si là vous mettez un pseudo,
00:56:39 :et que j'avais pas mis tout ce format là, il me l'aurait trouvé, et moi je veux pas, ça c'est pas une adresse mail, donc il faut bien que je lui spécifieque j'ai un groupement de lettres avant mon arrow base et après. Et donc en gros là ce que je lui ai dit, c'est que tu me trouves un enchaînement de lettres,
00:57:18 :donc en fait celui là, celui là j'aurais dû l'échapper, voilà, donc j'ai pas du tout vocation ici à vous, qu'à la fin du mentorat vous sachiez faire des reggex tout seul,c'est juste pour vous expliquer un peu le concept. En gros l'idée c'est de se dire, faut que je trouve des formats pour faire des matchs, pour trouver après des correspondances.
00:58:05 :En fait dès que vous rentrez dans un champ, un email, si vous rentrez pas ce format là, lui il compare comme ça et il dit bah non non c'est pas un email, c'est pas un bon format d'emailparce que j'ai pas un enchaînement de lettres, un arrobas, un enchaînement de lettres, un point et un point com, un point awl ou j'en sais rien.
00:59:11 :après il faut aller voir en fonction de ce que vous voulez vous chercher, mais si par exemple on voulait tous les mots qui sont au pluriel, donc on pourrait dire az ou même,je crois qu'il y a un truc qui dit qu'il termine par un s, mais bon moi je vais pas le faire comme ça, je vais dire juste, avec ensuite un espace.
00:59:58 :C'est juste quelques exemples de reggex que vous pouvez faire et comprenez bien que c'est vraiment pour trouver un pattern et puis vous pouvez extraire pas mal d'informationssuivant un format que vous définissez à l'avance. Qu'est-ce que je pourrais dire, je crois que si vous voulez dire tout ce qui commence par une majuscule au lieu d'écrire comme je l'ai fait,
01:00:23 :je vais dire, et après, ouais désolé c'est pas très fun les reggex, en fait quand on litune reggex c'est franchement impossible à comprendre, il faut la faire soi-même pour comprendre ce qu'elle fait je pense.
01:02:41 :tout fait en Python qui existent par exemple pour l'email, merci pour vos retours par exemple pour l'email, je pense même que si tu demandes à chatgpt tu dis fais moi une reggex python pour récupérerles adresses mail. Voilà la reggex pour récupérer les adresses mail, je vais la tester, c'est bon depuis c'est là dessus, ça a l'air de bien marcher tu vois, il a bien récupéré
01:03:39 :où il n'y a pas trop libre imagination tu vois, c'est vraiment un truc précis que tu lui demandes, ça en fait lui il va vraiment aller chercher dans tout l'historique d'internetetc, donc il n'y a pas trop de doute sur ce genre de truc avec chatgpt, parce qu'en fait si tu vas chercher sur internet tu vas un peu galérer, ça va pas tout le temps être à peu près
01:04:14 :Ouais franchement moi j'ai aucun souci à utiliser chatgpt pour ce genre de truc, je trouve qu'il est bien adapté pour ça.Bon bah voilà on va s'arrêter là, je vois qu'il y a des nouveaux pseudo là dans le chat, n'hésitez pas à me dire comment vous avez trouvé le mentora,
01:04:56 :Mais normalement le jeu d'histoire c'est un mentora plutôt débutant, là faut pas considérer que c'était débutant, c'était un petit peu plus avancé,parce que Django j'allais dire, Gabriel nous a montré son projet Django qui était déjà bien élaboré, et puis après la reggex c'est pas un truc de débutant,
01:05:23 :La prochaine fois on fera des choses plus débutantes.Thibaut il va peut-être mettre en place sur le mentora un truc où vous pouvez remplir un formulaire avec des questions ou des choses que vous aimeriez voir en mentora,mais pour ceux qui n'ont pas l'habitude sachez que le jeu d'histoire c'est un mentora débutant et on est là pour avoir des bases aussi.
Aucune occurrence trouvée pour « ».
00:00:00
Question de Beninio sur la lecture d'un fichier JSON
00:10:34
Présentation du projet de Gabriel
00:32:41
Question de Sébastien : est-ce qu'on peut styliser une page Django avec du CSS ?
00:41:08
Présentation des ReGex et exemple
00:49:25
Demo de regex101