Session du 09 janvier 2025 à 21h00
Développement Web & Frameworks
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
Session de mentorat Django : commande custom par manage.py
Session de mentorat Django : commande custom par manage.py
00:00:00 :Bienvenue à tout le monde, ce soir on va voir comment se crée une commande custom à Django.Vous avez déjà été habitué au Python, Manage.py, RunServer et ainsi de suite.
00:00:16 :MakeMigration et ainsi de suite.Et là le but c'est de faire une commande custom.Donc Python Manage.py et on va faire une commande qui va déclencher quelque chose.
00:00:26 :Est-ce que ça va pour tout le monde du coup ?Est-ce que vous savez déjà tout ce que l'on fait ou pas forcément ?Ou c'est un peu nouveau ?
00:00:36 :Pour le custom non, mais Manage.py oui, ça va.Ok, alors...Est-ce qu'on voit bien mon écran ?Ouais, c'est top.Ok.Bon du coup ce qu'on va faire déjà, j'aurais pu le faire avant, on va le faire maintenant.
00:01:06 :On va activer l'environnement virtuel et on va installer Django.Ah bah j'avais déjà installé, tant mieux.Et du coup on va faire un Django Admin.
00:01:18 :Admin start project.Et on va l'appeler project, pourquoi pas.Et voilà, et maintenant on va se faire un Python Manage.On va créer une application qu'on va appeler Data.
00:01:37 :Le but en gros là c'est qu'on va...Comme vous pouvez le voir je prépare un CSV.On va dire que c'est des informations clients que j'ai volées d'une entreprise.
00:01:48 :Et le but cette fois c'est de les rentrer dans une base de données.Et ça, le faire en une seule commande avec le Python Manage.
00:01:59 :Ce qui veut dire qu'on va sûrement aussi avoir besoin du module CSV.Du coup, là j'ai créé une application Data.Ce qui veut dire qu'ici dans les settings,pour ceux qui sont habitués, je dois aller la renseigner.
00:02:17 :Sinon elle ne sera pas prise en compte, elle ne sera pas trouvée par Django.Donc là j'ai une application Data, elle sera reconnue par mon application Django.
00:02:33 :Et maintenant le but c'est d'aller créer ici dans Data un modèle.Donc imaginons qu'on sait qu'il y a une entreprise qui l'intéresse.Et on veut ses données.
00:02:45 :Donc au niveau des données, on va avoir son numéro de client.First name, last name, email, phone.Jusque là ça va, il n'y a pas de problème.
00:02:57 :Oui, on reste dans le thème d'hier, c'est parfait.Et pour ceux qui veulent, je crois que j'ai installé un module qui s'appelle Rainbow CSV.Une extension sur mon VSCode,qui me permet d'avoir les CSV dans un peu de couleur pour m'y retrouver.
00:03:16 :C'est assez pratique.Et voilà.Je vais revenir ici.Et donc on va déjà s'intéresser au modèle qui nous intéresse.Pour pouvoir populer la base de données, il faut qu'on ait un modèle qui correspond.
00:03:38 :D'ailleurs, on pourra voir une fois, j'y pense,on essaiera de créer une base de données.On verra qu'avec Django, on peut très bien récupérer une base de données qui existe,ne pas avoir de modèle ni rien,et essayer de générer des modèles à l'envers.
00:03:58 :On croise ça, putain.On pensait à ça.Donc là, je vais créer des modèles.Un modèle qui correspond aux clients qui sont là.Et comme ça, on va pouvoir copier toutes les informations des clientsqu'on a récupérées dans la base de données.
00:04:13 :Pour ça, on va se créer Prospect.On pourra appeler plus tard avec toutes les informations qu'on a.Et donc, là, qu'est-ce que j'ai par exemple ?
00:04:31 :Ici, on voit que j'ai le numéro de client, first name, last name, email, phone.Donc c'est parti.Alors, c'est customer member.On va dire que c'est un Carfield.
00:04:49 :Simplement, on ne va pas s'embêter.On va faire un max-length ici à 255.Là, ce n'est pas le plus important.On va vraiment partir sur comment faire la commande.
00:05:00 :Mais on va d'abord voir qu'il faut vraiment avoir un modèle qui correspond à ça pour l'importer.Ensuite, on avait dit qu'on avait le first name.
00:05:11 :Ici, il va être un Carfield.Là, c'est pareil, je ne vais pas m'embêter.On va le mettre à 255.Ensuite, on va avoir le last name.
00:05:27 :Le Carfield.J'ai dit quoi ?On avait aussi à la suite l'email, si je ne dis pas de bêtises.On va partir sur un email field.
00:05:39 :Et je crois qu'après, on n'avait que phone, il me semble.Et phone, c'est ça.Et on va créer le phone ici.Pour ceux qui font du Django, quasiment tout le monde,on pourra en mettre un peu moins.
00:06:02 :Ici, il existe une extension qui s'appelle Django Phone Number Field.Django Phone Number qui vous permet d'avoir des champs plus normés au niveau du téléphone.
00:06:17 :Je ne sais pas si j'ai un deuxième navigateur pour l'instant.Je vous le montrerai plus tard.Ce n'est pas le but pour l'instant.Sinon, pour un modèle qui peut être intéressant à faire aussi.
00:06:29 :Je ne sais pas si vous l'avez déjà utilisé.On peut faire un createDate.Et on peut faire ici, par exemple, un dateTimeField.Et en faisant un auto...
00:06:39 :Attendez, je confonds toujours.Autonome, add.Add through, ici.C'est du coup que quand vous le créez, ça va vous mettre automatiquement la date de créationdans votre modèle une fois qu'il est créé.
00:06:53 :Ici, on fait un updateAt.Là, c'est pareil.On fait un dateTimeField.Et là, on fait un auto-no.Add through.Ce qui veut dire qu'à chaque fois qu'on va faire un save,pas que à la création, mais un save de notre instance,ici, ça va se traduire tout seul.
00:07:16 :C'est juste pour le seul.Et maintenant, ici, on va aller enregistrer le modèle.Site.register.Et on a...On avait appuyé comment déjà?Prospect, je crois.
00:07:32 :On part.Oui, prospect.Prospect, merci.Tac.Prospect.Hop, hop.Je ne sais pas si j'ai oublié quelque chose,mais normalement, on peut faire un makeMigration.
00:07:45 :C'est bon.Et on migre ça.Voilà.OK.Donc là, la base, elle est ici.Elle est créée.Et pour un coup, du coup, encore,je me suis amusé.
00:08:01 :Est-ce qu'il y a LiveViewer ici?Donc, si je clique, hop, ça me le propose.Et donc, je peux aller voir ma base de données.Voilà.
00:08:11 :Alors, on va essayer de rejoindre.Hop là.Top.Au passage, est-ce que tu sais s'il y a l'équivalent sur PyCharm?Je...Normalement, il y a des extensions sur PyCharm.
00:08:24 :Alors, sur la version payante de PyCharm,pour ceux qui l'ont confirmé,vous pouvez...Sans y installer, vous pouvez le faire.D'accord.Il me semble.Je suis extrêmement sûr.
00:08:35 :Et par contre, sur...Ouais, je confirme.Ouais, bon, voilà.Sur la version payante.Après, la version gratuite, je ne sais pas.Pour le coup, je ne me rappelle plus.
00:08:42 :Ouais, et puis j'avoue que...Je suis très VS Code, moi, maintenant.Alors, j'ai fait du PyCharm, mais...Bon.Je ne sais plus sur la version gratuite, ici.
00:08:51 :J'ai un doute.Là, je...Faut regarder s'il n'y a pas d'extension.Il y a quand même des...Bon, OK.Je regarderai.Donc, peut-être.Peut-être.Donc là, on a créé...
00:09:00 :Du coup, je n'ai pas vérifié.On a bien...Donc là, vous allez voir, on a bien établi iciavec nos prospects qui sont là.Ouais, c'est un peu...
00:09:08 :Tac.OK.Donc on a...First name, last name, email, phone...OK.C'est bon.OK.Donc, le but, c'est que tout ça,ça rentre dans la base.
00:09:18 :Donc, je n'ai pas fait de fautes sur les noms de champs.Customer number, first name, last name...Customer number, last name, email, phone...Email...OK.
00:09:28 :Maintenant.On va essayer d'amuser.Donc, quand vous voulez créer une custom commande,comme ça,je vous mettrai...Je vous mettrai, maintenant,sur Haddock, il y a un lien.
00:09:40 :Je vous l'envoyerai tout de suite.Comme ça.Je n'oublierai pas.Voilà.Il y a Haddock qui est bien fait.Bon, après, c'est une note,ça reste minimaliste,mais il n'y a pas tout.
00:09:53 :Enfin, il y a tout,mais c'est mieux pratiqué pour voir ce qu'on peut faire.Du coup, alors...Mon modèle est créé.C'est bon.Ce qu'on va faire,c'est que dans notre application, ici,Data,il faut...
00:10:09 :Alors, ça, il faut bien le respecter.On va créer un dossier qu'on va appelerManagement.OK.Dans Management,on va créer ce qu'on appelle un fichier init.
00:10:21 :Donc, en fait, on va créer un package.Et dans Management,en fait, il faut encore penser à créer un dossierqu'on appelle commandes.Et commandes, ici,on va créer un fichier.
00:10:37 :Ça va être init.py.Encore. Voilà.Donc, on a nos packages.J'espère que je n'ai pas fait de bêtises.On a le init.Le init.Et voilà.
00:10:47 :Et ensuite, en fait,le nom de votre commande,ça va être le nom du fichier Pythonque vous allez rajouter ici.Par exemple,là, je vais mettre un DataScraper.py.
00:11:03 :Voilà.Donc, là, ça, je l'ai rajouté.Et après, du coup,on va s'amuser à utiliser, en fait,les classes de Django, en fait,qui sont prévues pour ça.
00:11:14 :Donc, dans Core,c'est PointManagement.base.Ici, on va importer la classe qui nous intéressequi s'appelle BaseCommand.On va essayer de mettre aussi des tests en placeà importer notre commande.
00:11:35 :Si on a le temps, ça devrait aller.Ensuite, ce qu'on va faire,c'est qu'on va importer, du coup, notre modèle.Donc, Data.models.import.prospect.Et pour l'instant, c'est pas mal.
00:11:53 :Donc, c'est parti.On va commencer avec notre classe.Donc, on va l'appeler donc Command,qui hérite de BaseCommand.Donc, en gros, c'est ça qui va gérer le plus gros.
00:12:04 :Là, vous avez fait le plus gros.Et ensuite, c'est à vous de surcharger,en fait, de faire ce que vous avez besoin.Donc, est-ce que je vous m'annule maintenant ?
00:12:16 :Ouais, allez.Il y a notre début qui s'appelle Help.Vous allez voir à quoi il sert.Donc, là, on va mettreSkypeDataFromCSVFile.Ah, j'ai vu.
00:12:31 :Intégrer dans PaintShop.Pas intégrer dans PaintShop.Ouais, je m'en doute un petit peu.Ça ne m'étonne pas.OK, merci.Merci, David.Et on s'est parti.
00:12:46 :Du coup, là, ce qu'on va faire,c'est que j'ai mon fichier CSV qui est là,qui est dans mon dossier.C'est qu'on va créer la méthode principale,un par un commande, Handle.
00:12:56 :Donc, c'est une méthode ici,donc c'est pour notre instance.Et ce qu'on va faire,on va utiliser Args.Et on va utiliser les termes de la documentation option.
00:13:12 :On va bien respecter, comme ça,on est sûr qu'il n'y a pas de problème.Et ensuite, est-ce que je vais passer des...Est-ce que je le passe comme ça ?
00:13:23 :On va d'abord faire un truc assez basique.On va faire un try.Et là, c'est parti.On va faire un withOpen.OK.Normalement, si on est au paix avec les signatures,ça devrait aller.
00:13:39 :Donc, on va prendre notre data.csv.OK.Et on va dire quoi ?File.Allez, hop.Et je crois qu'il y a un message qui a arrivé.
00:13:57 :Un étudiant.C'est pas pour toi, c'est pour les enfants.Ah, ouais.Pas de problème.Et du coup, je disais...Donc là, on va ouvrir, en fait, notre fichier.
00:14:11 :Et pour ça, c'est que là, c'est un fichier...C'est du CSV.Du coup, pour faire sûr de ce que vous avez fait, Stéphane,il y a deux jours,on va utiliser le module CSV.
00:14:25 :Ça va être beaucoup plus pratique comme ça.Il existe d'autres modules, mais le module de base,je trouve qu'il est super pratique pour le matière CSV.
00:14:33 :Parce qu'on va utiliser une classe qui est super bien.Donc là, on va faire ça.Reader est égal à CSV.Est-ce que vous l'avez vu, Stéphane, cette classe-là ou pas ?
00:14:45 :Ouais, on l'a vu.On a vu le decoder et le reader.OK. Alors, cette classe, elle est géniale, je trouve.On va prendre le délimiteur.
00:14:54 :Et vous allez voir que moi, ici, je suis délimité par du point virgule.OK.Et donc, maintenant, ce qu'on va faire,c'est qu'on va boucler.
00:15:09 :Corro in reader ici.Ce qu'on peut faire, c'est aller créerles instances de prospectspour chaque ligne, en fait.Je vais chercher mon nom.Donc, on va faire un create.
00:15:27 :Et ici, du coup,j'avais le customer number,si je ne dis pas de bêtises.Et ici, on va utiliser row.Et on va prendre le...
00:15:45 :Vous allez voir, je vais vous montrer,pour ceux qui ont suivi les bons temps, Stéphane.Avec this reader, en fait, on va récupérer ici comme clél'entête ici.
00:15:55 :Donc, customer number, first name, last name, email, phone.Donc là, ça veut dire que pour chaque ligne, du coup,je vais aller récupérer avec l'entêtetous les éléments en bouclant sur chaque ligne.
00:16:06 :C'est pour ça que j'aime bien cette classique reader,elle est hyper pratique.Parce que comme ça, grâce à mes entêtes,j'ai mon CSV avec mes entêtes.
00:16:14 :Et après, j'ai pu aller envoyer le nom de mes colonnes,tout simplement.Et puis, j'utilise comme ça.Donc là, j'ai mon customer number ici.J'avais quoi aussi ?
00:16:28 :First name, last name, je ne sais plus.Donc, first name.First name est égal à row.OK.Et donc là, j'avais first name.Ainsi de suite.
00:16:47 :Donc là, en fait, si je continue comme ça,on va créer à chaque fois les instances.Seul problème.En plus, vous voyez que customer number,j'ai mis un unique égal slope.
00:16:59 :Mais imaginez si vous voulez les récupérer,en fait, vos instances,et que si elles existent déjà,en fait, vous ne voulez pas les recréer.Ce serait bête.
00:17:09 :Vous voulez juste récupérer que les nouvelles instances.Et à la limite, pourquoi pas,mettre à jour les instances que vous récupérez,mais qui existent déjà, en fait.
00:17:19 :Donc, en fait, vous pouvez passer au Create.Et ici, vous pouvez utiliser ce qui s'appelle Update or Create.OK.Donc, vous avez Update or Create.
00:17:33 :Donc, ça porte bien son nom.Vous allez soit mettre à jour, soit créer.OK.Donc, ici, comme élément unique,on sait qu'on a le customer number.
00:17:43 :Donc, on l'a bien ici.Et on va se baser sur ce champ ici,qui est censé être unique,pour pouvoir créer ou mettre à jour les autres champs.
00:17:54 :Donc, ici, on va faire Defaults.Et comme ça, c'est un dictionnaire.Et là, on va récupérer la suite de nos champs.Donc, on a FirstName, OK,qui va être égal à Rao,qui va correspondre à Rao.
00:18:18 :Et on avait dit FirstName.Et ainsi de suite.On va continuer avec nos champs.Donc, on avait le...J'ai dû oublier ma virgule.On va utiliser le LastName.
00:18:35 :Rao.Tac.Et on a LastName.De toute façon, on verra bien si j'ai fait une erreur à la fin.Ensuite, on a après le LastName, on a l'Email.
00:18:47 :Rao.Ici, on récupère l'Email.Et il nous en restait un, je crois.C'était le téléphone.Phone.Rao.Et...Si j'oublie la virgule, ça ne va pas le faire.
00:19:03 :Tac.Phone.Et donc, voilà.Donc là, on a récupéré tous nos champs du modèle.C'est pas de bêtise.On a l'extérieur number.OK.Email, Phone.
00:19:13 :Ça, ça se met à jour automatiquement.Donc, voilà.Donc là, on va aller récupérer tous les éléments dont on a besoin.Donc, on aurait pu faire un Create.
00:19:22 :À ce moment-là, on aurait mis tous nos champs à la suite.Sauf que là, le but, c'est comme je disais,c'est vraiment mettre à jour ou créer.
00:19:29 :Est-ce que pour ça, ça va ou il y a des questions ?Dans le WithOpen, il ne te manque pas le mode...Tu n'as pas la lecture ou l'écriture ?
00:19:41 :Je ne l'ai pas mis.On peut le mettre en...Je crois que par défaut, d'ailleurs, je me demande.Je crois que par défaut, il doit se mettre en lecture.
00:19:48 :Je ne l'ai pas renseigné.En défaut, il me semble effectivement qu'il se met par lecture.Mais c'est vrai qu'après, comme je vous l'ai montré autrefois,c'est plutôt une bonne pratique de le mettre chaque fois.
00:19:57 :Oui, oui, oui.Par défaut, il se met en mode lecture.Ah, du coup, je ne savais pas qu'il y avait un autre défaut, tu vois.
00:20:02 :Si, si, oui.C'est vrai que quand je le mets en lecture, des fois, je ne le mets pas forcément.Mais oui, c'est mieux de le mettre.
00:20:08 :Comme ça, au moins, c'est évident d'être perdu.Et puis des fois, après, si quelqu'un lire votre code,il ne sait pas s'il lire en écriture, en lecture, en R+,donc c'est plutôt bien de le mettre.
00:20:19 :Donc voilà.Et ici, quand...Allô ?Oui, oui, oui, dis-moi.En fait, je...Bon, je ne sais pas pourquoi tu as mis le custom number under the default.
00:20:35 :Ah, alors, parce qu'en fait,ici, quand tu vas...En fait, quand tu fais un create,tu ne t'embêterais pas à faire ça, tu mettrais tous les champs,customer, first name, last name, email.
00:20:48 :Là, le but ici, ce n'est pas d'aller créer à chaque foistoutes nos instances,parce que le but, c'est qu'elles pourraient déjà existeren base de données, les instances.
00:20:59 :Du coup, pour l'exemple, je me suis dit,il y aurait un identifiant unique,qui serait le numéro de client.Donc en fait, ça va se baser sur ce numéro de client, ici,et ça ne va pas recréer les clients existants,mais ça va les mettre à jour ces champs-là.
00:21:21 :En fait, ça va les faire un update de ces champs-là.Si jamais il y avait un nouveau numéro de client,par contre, ça va les créer le client.
00:21:28 :OK, donc si le custom number n'existe pas, il le crée.Ouais.Au cas où il existe, il met à jour le default.C'est ça, ouais.
00:21:36 :Après, pour ceux qui ne disent pas encore que vous avez là,je ne sais quoi, un get or create,vous pouvez faire, par exemple, du get or create.
00:21:48 :Ça peut être très, très utile aussi.Donc soit vous récupérez, soit vous créez.Et quand vous faites, par exemple, un outlet pour un get or create,donc ça, ça existe,et bien, en fait, vous pouvez avoir, je ne sais pas, votre valeur.
00:22:05 :Je ne sais pas si c'est un client.Vous faites client, virgule, created, hop.Et donc là, vous avez votre machin point object,object point get or create.
00:22:18 :Et en fait, vous pouvez récupérer l'instance,et comme ça, vous pouvez savoir si elle est créée ou pas,si vous faites un get or create.
00:22:25 :OK, d'accord.Ça, c'est une petite parenthèse.Et du coup, là, si on a fini de tout créer,on peut faire une sortie, en fait, pour le terminal,et dire, on write.
00:22:42 :Et là, on va dire, en gros, self.style,c'est le petit cesse qu'il y a, voilà.Et vous pouvez dire, en gros, je ne sais pas, data,data, scrap, voilà.
00:22:59 :Genre, c'est pas mal.Et sinon, si on fait un except,donc là, s'il ne trouve pas le cliché,on a le file not found error, ici.
00:23:10 :C'est un mauvaise intente.Ouais, merci.C'est sûr ?Attends.Non, c'est bon.Ah, c'est bon.OK.Du coup, ici, en sortie,on peut faire un self, pareil, standout,standout.write,
00:23:32 :et ici, on va faire un self.style,7.style,et on va se mettre en erreur, voilà.Et là, on va dire, file not found.Donc, voilà.
00:23:48 :Donc là, en fait, ici, on a bien une commandequi nous permet d'aller chercher notre CSVet d'aller créer ou mettre à jour les instances.
00:24:00 :On va la tester.Et sauf quand j'ai fait une faute,il va falloir que je trouve où.On va lancer ça.Donc, python manage,et je l'ai appelé data scraper.
00:24:13 :Et là, je stresse.Est-ce que j'ai rien oublié ?Il y a une erreur.J'ai mis un custom number.Custom number.C'est ça, je crois.
00:24:27 :Forcément.OK.Un loupé.On recommence.Hop.Donc, ça me devient un verre data scraped.Et si je vais dans ma baseet que je l'ouvre,et si je vais sur mes...
00:24:46 :Voilà.Donc là, j'ai bien mes 131 personnes qui sont là.OK.J'ai tout récupéré dans la base.J'ai mes champs, là,qui sont mis à jour automatiquement,qui sont là,et donc, j'ai tout le monde dans la base.
00:24:58 :OK.Pour ça, ça va.Excellent.Qu'est-ce qu'on pourrait faire ?On va simuler,on va faire comme si on va recommencer.Une petite question aussi.
00:25:12 :Le std outs,il est propre à CSV, c'est ça ?Ça dit quoi ?Le self std outs.Ouais.Ah oui, c'est bon.Il est propre à CSV, c'est ça ?
00:25:26 :Le module CSV.En fait, ça, c'est pour les...Alors, non.Ça, c'est les sorties.En gros, c'est pour dire qu'ici,ils sont en succès,ils ont réussi.
00:25:36 :Et là, par contre,je l'ai en erreur.Ça veut dire que la commande n'a pas fonctionné.La commande n'a pas fonctionné.Il y a une erreur.
00:25:43 :Oui, oui.Je parle juste de la commande std outs.Comme le self std outs,je ne sais pas,il appartient à quelle instance, en fait ?
00:25:53 :Std outs et std in,c'est des termes communs,notamment utilisés dans Linux.Std, c'est standard.Et in, c'est entré.Out, c'est sorti.C'est-à-dire que ton in,c'est quand tu tapes une commande au clavier.
00:26:07 :Et le out,c'est ce que le terminal va t'afficher.Là, avec le self std outs,il va récupérer la sortie du programmepour la sortie de l'input qui est fait.
00:26:23 :Si tu veux,with open, c'est l'input.Et le std outs,s'il y a un succès,il renvoie le data scrapped.Par contre,s'il y a une erreur,il renvoie le message d'erreurque Gab a personnalisé.
00:26:38 :Donc, en un moment,je peux utiliser à la place d'un print.Tu as dit quoi ?Je peux utiliser à la place d'un print,par exemple.
00:26:49 :C'est mieux.C'est fait pour...C'est un peu le print de sortie,on va dire.Mais là, c'est vraiment fait exprès.C'est vraiment fait pour ça.
00:27:01 :Parce qu'en fait,ça va être un attribut d'instancequi fait partie de base command.D'accord.Et en plus,tu peux utiliser les styles dessus,le succès ou l'erreur.
00:27:12 :Donc, du coup, je disais,s'il ne trouve pas le fichier,il me le met bien en erreur.Parce que là,j'ai mis un nom de fichier qui est faux.
00:27:22 :Sinon, on avait vu que sinon,il le trouvait,c'est scrappé.Et donc,j'ai bien fait un add data createparce que si je retourne dans la base,on va voir que je n'en ai pas plus.
00:27:36 :Je suis toujours à mes 130 lignes.Que si vous faites un create,bon là, le custom number est unique,il y a une erreur.Mais si vous n'avez pas terminé de citeret que vous faites des create à la suite,vous en aurez 260.
00:27:50 :Est-ce que pour l'instant, ça va ?Oui ?OK.Donc, je vais continuer.Ici, ce qu'on va faire,c'est que notre fichier,on ne va pas forcément l'appeler.
00:28:07 :Enfin, il peut avoir différents noms.OK ?Je ne vais pas l'appeler file.Je peux l'appeler file,après ce n'est pas dérangeant.Ici, je vais faire un sf.
00:28:21 :Donc, vous pouvez l'appeler data.Ou garder mon data,effectivement.Ce qu'on peut faire,on a ici une méthode addArgument.OK ?Data parser, le support n'a pas forcément besoin.
00:28:42 :On va utiliser parser.On va rajouter un argument ici.Donc, l'argument file.Et le type, on va spécifier le type.Donc, c'est une chaîne de caractères.
00:28:58 :Et on va mettre un petit help.Et on va mettre csv.scrap.OK ?Et maintenant,ça veut dire quesi je veux récupérer ça dynamiquement,du coup ici,il faut bien que je fasse file.
00:29:18 :Et en fait, on va utiliser des options.OK ?Et on va utiliser notre file.OK ?Là, on a notre argument file.Et on va le récupérer par les options ici.
00:29:32 :Donc, si je recommence.Là, je refais un data scraper.Et c'était data.csv.Et voilà.Et donc là, il me l'a récupéré comme ça.Est-ce que pour ça, c'est bon ?
00:29:53 :Oui, très bien.Voilà.Vous vous amusez à rajouter un argument comme ça.C'est plus dynamique, en fait.Vous pouvez mettre le nom du dossier dans votre...
00:30:03 :S'il y a plusieurs csv comme ça, ça permet de savoir lequel on récupère.Et vous pouvez très bien faire aussi un...Je crois que c'est...
00:30:12 :C'est le help.Voilà.Et comme ça, vous savez,ici, j'ai mon help qui est là.Qu'on retrouve ici.Et j'ai mon argument positionnel ici.Qui s'appelle file.
00:30:25 :Et j'ai son help qui est ici.Ok ?C'est bon ?Vous me dites un, si jamais il y a des doutes.Ok.Est-ce que pour l'instant, ça va ?
00:30:40 :Ça vous plaît ou c'est pas un truc de ouf ?Non, c'est génial.Ok.C'est génial.Non, mais ça peut être utile.Moi, par exemple, j'en ai fait un...
00:30:49 :Ouais, c'est excellent.J'en ai fait un où quand je le lançais,ça envoyait un mail à tous les clientsqui n'avaient pas validé la vente depuis plus de 15 jours.
00:30:57 :D'accord.Je t'ai fait ta relance, quoi.Tu as personnalisé la relance, quoi.C'est ça.Donc là, c'est vraiment juste...En plus, je voulais utiliser CSV.
00:31:05 :Je sais que Stéphane faisait un mentorat il y a deux jours.Donc, ça peut être cool.Comme quoi, les modules de base,après, vous les utilisez où vous voulez dans le Django.
00:31:13 :Après, Gabriel ?Oui ?Juste petite question.Arrête-moi si je le trompe.Mais là où ça peut être, je pense, super intéressant,j'ai eu le cas encore aujourd'hui avec Djangooù je voulais updater ma database avec un scriptque j'ai mis dans un dossier du projet.
00:31:33 :Et puis, quand j'ai commencé à vouloir lancer le script,il a commencé à me péter des erreurs en me disant« Django settings, la variable n'est pas définie, etc. »
00:31:44 :Et le fait de passer par là,tu as toutes tes variables qui sont déjà définies.Tu n'as pas ce type de problème.Je ne sais pas si tu vois ce que je veux dire.
00:31:56 :Le fait de passer par ton manège là...Parce que je ne passais pas par le manège.py,je lançais juste le script Python directement.Même en chargeant l'environnement virtuel,je lançais le script.
00:32:10 :Mais à partir du moment où j'importais des modèles ou autres,il me mettait des erreurs comme quoi il n'avait pasla variable d'environnement Django settings, etc.
00:32:19 :Et du coup, je ne pouvais rien faire.Pour charger des données, tu as peut-être déjà fait du lot de...Comment ça s'appelle ?Du lot de data, ou pas ?
00:32:34 :Non.Ok.Je fais un petit mentorat dessus.Python manège...Il peut y avoir des fichiers JSON qui représentent votre base de donnéesou des instances.
00:32:45 :Et là, vous faites un lot de data,et ça va aller rechercher tout, ça va populer la base de données tout seul.Mais vraiment tout d'un coup.
00:32:53 :Pour ça, si je fais par exemple un dump data ici,vous voyez, là j'ai tout ce qui est dans la base de données qui apparaît.
00:33:02 :Et ça, je peux le faire ici.Alors attendez, si je me rappelle bien...Je ne connais pas tout par cœur...Et je peux faire un...
00:33:16 :Est-ce que je peux le faire comme ça ?Ouais, tac.Et là, si je vais ici, j'ai un JSON et j'ai toutes mes données.Tous les utilisateurs.
00:33:24 :Et en fait, ça, après, il faut faire l'inverse.Il faut faire un lot de data de votre JSON,et ça va repopuler la base de données.
00:33:31 :Voilà.Ça marche avec les foreign keys et tout ?Oui, bien sûr, carrément.Là, j'ai quoi ? J'ai les permissions, les pk...Ouais, non, il faut faire ça avec...
00:33:44 :J'ai déjà populé une base de données.Du coup, on peut imaginer que la manipulation que tu viens de faire,le dump et ensuite le load,on peut imaginer que le fichier JSON, c'est carrément un backup...
00:33:58 :Ouais.Donc si on scripte régulièrement le dump,ça veut dire qu'on remet sur un autre serveurou un disque externe, peu importe la méthode,mais au moins, on sauvegarde l'image de la baseen cas de crash, quoi.
00:34:19 :Alors franchement, je préfère avoir...Moi, j'ai une sauvegarde qui fait 21 heures sur mon sitede la base en elle-même.D'accord.C'est mieux, parce que là, le dump, c'est plus galère.
00:34:29 :Tu vas te créer tout en fichier JSON.C'est un peu moins pratique.Notre commande, il me semble, Gabriel,pour exporter la base, puis la réimporter.
00:34:41 :Ouais.J'ai plus en tête, là, comme ça, mais tu peux.T'as une commande pour ça, ouais.T'as une commande pour ça.Mais là, maintenant, j'ai pas en tête, ouais.
00:34:51 :Mais tu peux.Mais du coup, je sais plus pourquoi on est venuà parler du JSON, là, d'ailleurs.Ah oui, David, oui.Oui.Oui, c'est vrai, parce que toi, tu lances un script.
00:35:02 :Ouais, je lance un script.Et effectivement, c'est...Parce qu'en fait, je tapais sur un APIpour récupérer des données.Et puis après, du coup, soit justement,j'updatais les modèles où je créais.
00:35:16 :Et comme je le lançais sans le manage.py,ça passait pas.Donc, j'ai fini par passer avec le...C'est quel module?Runscript.Je m'en rappelle plus.
00:35:30 :C'est quel module de Django?Et en passant par là, ça fonctionne nickel.Mais du coup, le cas que tu utilises,je trouve que ça peut être super pratiquepar rapport à ça, quoi.
00:35:40 :Ouais, attends, le manage, oui.Après, là, vous tombez avec le CSV,mais après, vous verrez qu'on pourra faireun Montora dessus, mais il y a ça qui est sympa aussi.
00:35:50 :C'est très rapide aussi à utiliser.Donc, Gwent.export.Voilà, c'est juste pour vous, RnP,si vous voulez regarder ce que c'est.Du coup, oui?Le Python Manage,le job que tu as fait dans le fichier,est-ce qu'il prend toute la base donnée,par exemple, là, en l'occurrence, l'SQLite?
00:36:15 :Moi, il le fait dans l'SQLite.Après, dans MySQL, ça marche.Dans Postgres, oui, normalement,il n'y a pas de problème.Il prend toutes les tables, je veux dire,toutes les tables.
00:36:22 :Ah, quand tu fais un dump,comme j'ai fait tout à l'heure.Oui, parce que là, tout à l'heure,j'ai fait un dump data,mais tu peux aller cibler,faire un genre, si c'est l'application data,et aller cibler les modèles, en fait.
00:36:39 :Si tu fais un dump, tu sors tout.Après, tu peux aller cibler à chaque fois.Tu peux cibler les modèles que j'ai fait,par exemple, faire le dump.
00:36:50 :Ouais, tu peux cibler les modèles que tu veux, en fait,ou l'application que tu veux, c'est granular.Sachant qu'après, que si tu veux faire un lot de data,tu ne laisses pas ton JSON n'importe où,il faut que tu fasses un dossierque tu vas à la préfecture,pour que Django la reconnaisse,
00:37:07 :et tu mettra ton JSON là-dedans.D'accord.Voilà.Il est quelle heure?Bon, allez, j'ai rendez-vous à 22h.J'ai le temps de vous montrer,parce que, bien sûr, une custom commande, c'est bien,mais c'est encore mieux avec des tests.
00:37:28 :Donc, on va créer un test.On ne va pas prendre PyTest,on va prendre le framework du test Django.J'insiste sur les tests,parce que c'est vraiment important.
00:37:36 :Là, je bosse pour une boîte,et sur chaque carte qu'on a,il y a toujours des jeux de tests attachés.Heureusement qu'on les fait,parce que sinon, c'est vite la merdequ'on modifie une fonctionnalité, et ainsi de suite.
00:37:49 :Je vais les mettre un jour.Ouais.Donc, là, on va avoir une classe de tests,une série de test cases, c'est déjà prévu.Et hop.
00:38:05 :Allez.Et en fait, ce qui est bien avec Django,encore une fois, tout est prévu.Donc, on va faire un Django...Comment j'ai fait ?
00:38:16 :Darwin.Django.core.management.Ici, on va importer quelques membres.Alors, comment ça se passe ?Donc, on va faire un DevTest,et DataScraper.Hop.Et ici, on va créer un autre test.
00:38:47 :Du coup, on va utiliser ce qu'on appelle ici...Donc, on va voir la fonction qu'elle commande.Notre commande, elle s'appelle DataScraper.Donc, c'est bien le nom du fichier qui est ici, DataScraper.
00:39:03 :Et on va prendre notre fichier data.csv.On va lui envoyer ça.Et ensuite, il faut pouvoir capturer la sortie.Alors, la sortie, pour la capturer,on ne la capture pas comme ça.
00:39:23 :On va la capturer avec le module I.O.Et on va utiliser ces strings I.O. ici.Et donc, votre sortie...J'ai pas fait une faute d'out, ici.
00:39:41 :On va utiliser...On va la mettre à la variable.Donc, on va faire ici la sortie.Donc, on va utiliser string I.O.On va instantier cette classe-là.
00:39:54 :Et donc, notre sortie...Hop, on va utiliser justement string I.O.Ce qui permet de le faire après,on va faire un assert in.Et donc, on avait dit c'est data...
00:40:14 :Je ne sais plus...C'est data scrapped.Data scrapped.J'aurais pu faire un copie-coller.Ici.Et on va vérifier que c'est data scrapped.Et on regarde si c'est bien.
00:40:33 :On va récupérer la valeur de notre sortie.Donc voilà, c'est pas mal.Donc là, normalement, si je fais un python manage test,hop, j'ai un test qui est lancé.
00:40:45 :C'est OK.Et après, on sait que notre CSV, ici,il y a 130 instances, que je crois.131 lignes, il y a les headers.Donc, on a 130 instances.
00:40:59 :Et donc, on peut faire quelque chose comme self.assertEqual.C'est equal.Ici.Et on va importer from data.models.Ici, on va importer prospect.Est-ce que vous savez comment on peut compter le nombre d'instances d'un modèle ?
00:41:28 :Ou pas ?Non.Avec length ?Non.Comment ?Avec length.On ne peut pas.L-E-N.Encore mieux.Account.Hop.Et on a dit qu'il y en avait 130.
00:41:46 :Et si je relance ?C'est OK.Donc vous voyez, on peut faire comme ça.Et après, on peut très bien aller tester les cas d'échec,si ils fonctionnent bien.
00:41:56 :Donc là, c'est pareil.Je vais faire un test fail scrapper.Je le fais un peu à l'arrache.Un fail scrapper.Et donc là, c'est pareil.
00:42:09 :Donc là, je n'ai pas fait de setup.Je le fais un peu comme ça.C'est répétitif, mais en réalité, avec testcase,vous ferez une setup pour éviter d'avoir à tout répéter.
00:42:24 :Vous savez, pour ceux qui savent, moi je n'utilise plus du tout testcase.Mais sinon, vous pouvez toujours faire un setup.Et puis là, c'est pareil.
00:42:33 :Est-ce que je vais faire ça en fait ?Ça sera plus simple.Hop.On va prendre ces deux-là.Tac.Et ici, on va mettre un faux nom.
00:42:45 :Hop.Et en cas de...On a mis quoi ?Found ici.File not found.Ok.Et si je teste ?Hop.Les tests sont ok.
00:43:05 :Vous voyez, on peut tester les tests si on a un problème comme ça.Enfin, dans le cas où ça ne marche pas.Donc voilà.Tout ça, on aura pu avoir ici un setup comme ça.
00:43:19 :Et puis aller définir des attributs d'un, je pense,pour éviter d'avoir à utiliser nos...Pour définir.Mais là, je l'ai fait un peu rapidement.Je ne pensais pas avoir les tests forcément ce soir,mais comme ça on les a vus.
00:43:36 :Ça me paraît important.Et comme ça, vous savez comment on peut créer une commande.Donc avec un message pour...Quand vous avez l'argument help,vous pouvez passer les arguments à votre commande.
00:43:50 :La commande en elle-même.Et le test qui va avec.Est-ce que, pour vous, c'est bon ou pas ?Parfait.Merci beaucoup.Tous les noms nous fonctionnent.
00:44:06 :Ça, c'est des noms prédéfinis.Tu utilises ceux-là.Là, oui, tes méthodes,elles sont dans BaseCommand, Django.C'est de la surcharge que je fais.Tu vois, ils en ont plein.
00:44:22 :Il y en a beaucoup, beaucoup, beaucoup.Tu regardes tout ce qu'il y a d'arguments.Tu vois, on l'a utilisé.Je m'en doutais un petit peu,mais je voulais juste être sûr.
00:44:33 :Tu n'es pas obligé d'aller à chaque fois, bien sûr,voir dans l'héritage.J'ai mis un point vers la doc.Et en fait, dans la doc,ils te mettent...
00:44:43 :Je n'ai plus mon navigateur.Dans la doc, le lien que j'ai envoyé,ils te mettent vraiment les méthodesqui sont utiles pour ça,pour le Handle et l'AddArguments.
00:44:55 :Donc, voilà.En espérant que ça vous ait plu.Oui, oui.C'est intéressant d'apprendre quelque chose d'autre,quelque chose de nouveau.On avance petit pas par petit pas.
00:45:11 :Chaque fois, un peu quelque chose de neuf.Oui, alors là, ce n'était pas le truc le plus évident.En fait, tu te rends compte qu'avec Django, c'est immense.
00:45:22 :Tu n'as jamais fini.Ah oui, non, non.Avec Django, c'est vraiment immense.Je dis, je ne sais pas,ceux qui connaissent PHP TV ou les forums,témoignez de créer un système complet avec Django.
00:45:38 :En plus, à une époque où je ne l'utilisais pas,il n'y avait pas l'IA.Où, vraiment, les gens peuvent arriver sur une plateforme,se créer un forum,l'administrer en créant leur catégorie,leur subcatégorie, gérer les messages.
00:45:52 :Les utilisateurs peuvent s'envoyer des messages privés,faire de la modération.Vraiment, avec Django, vous faites ce que vous voulez.C'est énorme.Donc, voilà.A première vue, c'est ce qui paraît pas le plus utile au monde.
00:46:07 :Mais franchement, une commande custom comme ça,c'est vraiment très pratique.Oui, il y a plein de cas.Je pense qu'il y a plein de cas de figure.
00:46:13 :Effectivement, ça peut être super utile.Oui, parce que par le manage, ça t'évite de devoir aller après.Peut-être pour initialiser un site.Oui, il y en a, je crois qu'on a fait ça.
00:46:28 :Pour initialiser le site, par exemple.Oui, même que tu as fait des trucs de ouf,par rapport à des fichiers Excel, j'ai cru voir ça une fois.
00:46:38 :Oui, pour envoyer des e-mails, c'était pas la meilleure place.Enfin, il y a plein de cas possibles.Vous vous appelez le script.Ça vous évite de faire des scripts séparésoù il faut appeler les setups de Django et ainsi de suite.
00:46:51 :Il y a quelqu'un qui posait la question il y a pas longtempsdans la section questions.Je ne sais plus ce qu'il faisait.Ça y est, il avait écrit un fichier .py quelque part dans le projet.
00:47:02 :Il essayait de l'exécuter, mais ça ne marchait pas.Forcément, il faut être vraiment dans l'environnement de son applicationsinon ça ne marche pas.Et que là, du coup, le python manage .py avec sa commande,
00:47:13 :ça permet vraiment d'être dedans.C'est clairement le sujet que j'avais vu tout à l'heure.Oui, donc si tu peux utiliser ça, ça peut être...Oui, complètement.
00:47:25 :Donc voilà.Super, merci beaucoup Gabriel.C'est normal, c'est normal.Ok, merci Gab.Pas de soucis.Merci à tous d'avoir été là du coup.Je referai un jeudi prochain et ça sera sur...
Aucune occurrence trouvée pour « ».