Session du 27 novembre 2024 à 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
Nous allons parler sécurité avec un Custom user : UserAdmin
00:00:00 :Bon du coup ce soir c'est du Django. Dans les gens qui sont là, avec Django, vous en êtes où ?Juste fort comme ça ?
00:00:11 :J'ai manipulé il y a plusieurs années, ça fait bien 4-5 ans que je n'en ai pas refait.Tu me l'avais dit, j'en souviens.Bonsoir à tous au passage.
00:00:21 :Pour ma part, j'ai fait une formation sur Udemy, mais c'est juste regarder, je n'ai rien pratiqué.Ok, pas de problème.Pareil, j'ai suivi la formation de Thibault sur Udemy, j'ai la chance de me remettre dedans.
00:00:38 :Il faut essayer d'aller plus loin.Ok, on va en parler ce soir, il y a un sujet qui me tient à cœur.Très très à cœur parce que j'ai déjà eu le coup une fois il y a un moment.
00:00:48 :Et c'est une chose en plus qu'on fait tout le temps avec Django.Très souvent, je ne dirais pas tout le temps, ça dépend des gens.
00:00:57 :C'est créer un petit laser custom.Bon, on va partir de zéro parce que je n'ai rien préparé pour ce soir, donc on va y aller.
00:01:06 :Je me crée un environnement virtuel déjà.Est-ce que tu peux zoomer un petit peu Gab, s'il te plaît ?Ouais, excuse-moi, je vais faire un terminal de toute façon.
00:01:20 :Je n'en ai plus besoin, je vais me mettre sur mon VSCode et je vais ouvrir Django.Et je vais grossir ici de toute façon.J'ai des écrans, alors c'est un peu la galère pour gérer le terminal.
00:01:47 :Alors, bon déjà je vais initier mon...Attends, je vais faire juste un GameBang pour voir s'il me prend bien mon environnement virtuel.Puis ici, automatiquement, si je lui dis, il me le trouve.
00:02:07 :Ouais, ça a l'air bon. Je fais un test.Putain, ça je pense que tout le monde la connait, la commande,mais elle est bien connue pour savoir quel environnement utiliser.
00:02:23 :Donc là je suis bien dans mon dossier.Donc je vais installer Django, c'est parti.Et ce soir on ne va utiliser que Django de base, on ne va même pas faire de route ni rien, ça va être très basique.
00:02:38 :Mais c'est vraiment plus pour l'administration là.Voilà, je vais...On va commencer, enfin on va initier un projet Django, donc on va l'appeler Project.Et donc, voilà, on a notre projet Django créé.
00:03:07 :Du coup, quand la voie va commencer avec Django pour la plupart ou peut-être plus longtemps,ce que je vous conseille avec Django, parce que vous avez le modèle utilisateur,vous avez un modèle utilisateur qui est inclus avec le Django,c'est-à-dire que vous pouvez déjà inscrire des membres dans la base donnée,
00:03:29 :avec Django c'est déjà tout est fait, c'est built-in,mais moi ce que j'aime bien faire avec Django, c'est créer mon propre modèle utilisateur,parce qu'en fait si vous avez besoin de customiser le modèle utilisateur,parce que le built-in ne peut pas forcément être approprié pour vous,dans le sens où si vous voulez rajouter des champs ou des méthodes,
00:03:55 :le mieux c'est d'avoir vraiment un utilisateur qui est custom.Avec Django, et le problème c'est que si vous créez un modèle utilisateur custom en cours de projet,pour changer en cours de projet, après c'est la merde, pour être clair.
00:04:11 :Franchement, partez avec un utilisateur custom dès le début du projet,comme ça vous êtes tranquille.L'utilisateur custom, moi ce que j'aime bien faire,alors attendez, il faut que j'accepte.
00:04:26 :Est-ce qu'il y a quelqu'un qui rejoint ?Voilà, c'est bon.Salut !Du coup ce soir on fait du Django.Je résume vite fait, on est parti d'un projet vierge,mais on va rester sur le modèle utilisateur.
00:05:02 :Donc je disais, il n'y a pas de souci.Avec Django, il y a un modèle utilisateur qui est déjà inclus dans le Django,donc on pourrait faire notre application sans y toucher et elle marcherait.
00:05:13 :On pourrait faire s'inscrire des gens, sans aucun souci.Mais comme je disais, moi j'aime bien avoir un modèle utilisateur custom,parce que c'est bien plus pratique si on a besoin de le customiser,parce que le modèle utilisateur de base, il n'est pas forcément approprié pour nous.
00:05:31 :Donc je disais, pour tout ce qui est gestion des utilisateurs,je crée toujours une application à part.Je vais faire une start-up et je vais l'appeler Account.
00:05:47 :Donc là je vais avoir mon application Account qui est ici.Toujours penser pour l'utiliser à aller dans mes apps ici.Je vais appeler Account.Sinon ça ne fonctionnera pas.
00:06:03 :Les settings pour l'utilisateur, il faudra qu'on y revienne après,parce qu'on sera obligé d'ajouter quelque chose pour dire qu'on va utiliser un modèle custom.Pour l'instant on s'en fiche.
00:06:15 :Donc dans Account, j'ai bien mon admin, mon adresse.Alors, je disais, c'est ici que je vais créer mon modèle utilisateur custom.Et donc, qu'est-ce que j'allais dire ?
00:06:33 :On va le coder maintenant, on va coder le modèle utilisateur en lui-mêmeet on va faire ce qu'on appelle un manager custom en même temps.
00:06:41 :Donc c'est parti.Pour ceux qui sont au début de Django, qui n'en ont jamais fait,ça pourrait paraître compliqué, mais je vous rassure que après avec la pratique,il n'y a rien de compliqué.
00:06:52 :Je ne sais pas s'il y a déjà qui font des utilisateurs custom,mais franchement, il n'y a rien de sorcier.Et si vous voulez, vous pouvez m'arrêter en cours de route.
00:07:00 :Parlez-moi directement, ne mettez pas un message dans le chat,parce que je ne suis pas forcément sous les yeux.Donc, n'hésitez pas à m'arrêter.Excuse-moi, j'ai juste une petite question.
00:07:15 :Tu travailles avec quelle version, toi, de Django, du coup ?Là, c'est la 5.1.3, je crois que c'est la dernière.D'accord.Alors, est-ce que c'est par rapport à la formation de Thibaud que tu poses ça ou pas ?
00:07:28 :Même sur le site encore, c'est la version 3, il me semble.Alors, ce n'est pas très gênant, dans le sens où la version...Moi, perso, ma formation à l'époque, je l'avais faite en version 4.2.
00:07:44 :Je n'avais eu aucun souci.Et même si tu pourrais très bien faire ta formation avec la version 4.2,là, tu n'auras pas de problème.Même avec la 5, tu n'as pas énormément de changements en soi pour la formation.
00:07:55 :Franchement, tu ne serais pas perdu.Mais vraiment.C'est pour ça que je n'étais pas très motivé de la recommencer.Je me suis dit, est-ce que ce n'est pas trop loin ?
00:08:03 :Non, non, non.D'accord.Pas du tout.Franchement, ne t'inquiète pas.Pour info, là, je bosse pour une boîte.Alors, j'ai dû reprendre un projet qui était en Django version 1.
00:08:16 :Bon, là, c'était quand même autre chose.C'était plus compliqué.Mais la version de Django sur laquelle j'ai dû mettre au goût du jour,c'était à partir de la 1.11, je crois.
00:08:31 :Si je ne dis pas de conneries, je ne sais plus.Je ne peux pas être certifié.Mais en fait, à partir d'une certaine version de Django 1,après, il y a eu des évolutions, mais on s'y retrouve.
00:08:43 :Donc, c'est la version 3.2 où je ne sais plus laquelle c'est.Il n'y a pas de problème.Pas d'inquiétude.Si tu as des questions, tu me les poses, il n'y a pas de souci.
00:08:51 :Donc, voilà.Du coup, pour créer un utilisateur custom,c'est un peu comme avec les modèles.On va le laisser dans le fichier modèle.On ne va pas utiliser la classe modèle directement.
00:09:06 :Mais on le met dans le fichier modèle,comme n'importe quel modèle qu'on pourrait créer.Donc, c'est parti.On va l'appeler, par exemple, custom user.Et ici, en fait, il faut hériter ces abstract users.
00:09:22 :On peut avoir le base abstract user,mais on va garder l'abstract user.Donc, c'est dans framjango.contrib.ostc.models.On va importer.C'est l'abstract user.On a beaucoup moins de choses à définir que l'abstract base user.
00:09:43 :Et moi, perso, en fait, l'abstract user, il est top,parce qu'il y a tout ce qui est email, username, last name, first name.Donc, en fait, il est super bien équilibré.
00:09:54 :Il y a une base qui est parfaite, quasiment parfaite pour moi.Donc, je prends toujours celui-là.Donc, c'est bon, l'abstract user.C'est le même que la classe user qu'on importe quand on veut faire des liens.
00:10:10 :Par exemple, dans les cours de Thibault,il parle de relier des articles et des users,et tout ça, au tout début, dans les blogs.Il nous fait importer une classe user.
00:10:21 :C'est la même chose.Il y a une différence vraiment majeure.En fait, je m'imagine qu'il te fait un truc genre un get.Alors, je ne sais plus comment il doit faire.
00:10:36 :Il doit peut-être faire un truc genre user est égal à get user modèle, peut-être.Peut-être qu'il tape user, et depuis, il n'y a pas l'idée d'en pas y faire,mais il importe directement la classe en se référençant au mot user, comme ça.
00:10:52 :Oui, alors, je ne sais plus exactement.Il faudrait que je revoie le contexte.Mais dans tous les cas, si jamais dans un projet,ce que je vous conseille, c'est d'importer l'utilisateur comme ça.
00:11:03 :Get user model, je ne sais plus où il est exactement.Est-ce qu'on peut la voir, je crois, maintenant avec VS Code ?Je ne suis pas habitué.
00:11:12 :Non, c'est vrai que je regarde. Je ne sais plus où il est exactement.Mais du coup, en fait, avec get user model, je vais aller dans un doc.
00:11:18 :Get user model Django, il est où ?Hop là.Et ça rame, c'est génial.Je vois Stéphane, là, j'ai l'iPad et j'ai des petits lags.
00:11:33 :C'est get user model, il est où ?Il se tourne.Hop là.Attendez, je vais le rechercher.Voilà, en fait, il est dans from django.contrib.auth import get user model.
00:11:51 :Voilà, c'est ça.Donc, en fait, avec ça, je ne vais pas le garder,mais ça vous permet d'importer les modèles utilisateurs de votre projetde manière assez propre.
00:11:59 :Quand vous êtes autre part dans d'autres modèleset que vous avez besoin de faire des relations vers votre utilisateur,je vous conseille de faire comme ça.
00:12:09 :Ou même, moi, des fois, je fais comment ?Je fais comment pour les relations ?D'ailleurs, je vais aller sur mon GitHub,mais je dois vérifier un projet, un des derniers projets.
00:12:22 :Je vais, par exemple, celui-là.Ici, je vais sur le forum, les modèles.Donc, forum.Alors, est-ce que j'ai mon utilisateur ?Name, name.Account user.
00:12:42 :Ouais.Eh bien, moi, je fais comme ça.Ouais, en fait, non.Oui, c'est vrai que je fais comme ça assez souvent.Je vais faire un from, par exemple.
00:12:55 :Ouais.Donc, en fait, le mieux, c'est de faire un django.conf import.On peut mettre les settings comme ça.On pourrait faire comme ça.Et après, je fais un settings.auth.user.model.
00:13:14 :Oui, si, si, je fais ça.Et en fait, parce que dans mes settings,j'ai le modèle utilisateur qui est défini.Bon, là, il n'y a pas encore.
00:13:20 :Et ça me permet de le récupérer comme ça.Voilà.Vous ne voyez que la façon de le faire.Après, bon, il y a le getUserModel comme je vous l'ai donné.
00:13:29 :Et puis, voilà.Donc, voilà, Stéphane.Tu as plusieurs façons de récupérer, en fait,les modèles utilisateurs que toi, tu utilises dans ton projet.Je n'importe jamais la classe directement.
00:13:39 :Là, en fait, je n'irai pas importer le custom user directement.Voilà.C'est plus une question de bonne pratique aussi.Puis même, en général, on n'importe pas directement le custom user.
00:13:54 :On va utiliser une fonction ou les settings.Du coup, par exemple,on veut surcharger son email parce que dans abstract user,on est là, on est go to définition, je crois, là-dessus.
00:14:07 :Voilà.On voit quand on utilise l'héritage ici.Donc, c'est pour ça que c'est bien important d'être opé sur notre opérationnel déjà,d'avoir des bonnes bases quand même en piston général.
00:14:19 :On voit qu'ici, on a des attributs.UserName, FirstName, LastName.L'email.En fait, vous allez voir que moi, l'email,j'aime bien le surcharger parce qu'il ne me plaît pas trop.
00:14:32 :Voilà.C'est tout ce qu'il y a.Et donc, par exemple, ce que j'aime bien faire avec l'email ici,je vais utiliser des models pour un email field.
00:14:43 :Et en fait, j'aime bien le fait que l'email soit unique.Comme ça, au moins, on ne peut pas avoir deux utilisateurs avec le même email.
00:14:52 :Voilà.Ensuite, on pourrait très bien rajouter un champ.Bon, là, c'est pour l'exemple un zip code.On va faire un CarField.Là, c'est un champ de texte.
00:15:03 :On va lui mettre une longueur maximum.Voilà, ça va être 5.Et on va avoir l'attribut RecurrentFields.Encore.Vas-y.Le zip code, tu pourrais définir, par exemple, qu'il n'y ait que des chiffres.
00:15:21 :Ouais, enfin, si, si, si.Après, tu peux très bien gérer ça en Regex,parce que je n'irais pas mettre un IntegerField en soi, pour moi,ou mettre ce qu'on appelle des validators.
00:15:41 :Voilà, c'est ça.Toi, tu peux gérer avec des validators personnalisésqui permettront de valider si c'est un champ, du coup, si c'est accepté ou pas.
00:15:51 :Mais ça, par exemple, je laisse en CarField.En RecurrentFields, du coup, c'est dire quoi ?On va avoir l'email qui va être en champ requis.
00:16:02 :Parce que quand je regarde ici, si je retourne, il est où ?J'ai, donc l'emailField, c'est bien l'email.UserNameField, là, c'est bien UserName.Ok, donc mon RecurrentField, je ne serais pas obligé de surcharger à ce moment-là.
00:16:21 :Mais bon, en gros, vous avez ces champs-là que vous pouvez utiliser,ou UserNameField.Voilà, comme ça, vous avez, en fait, par exemple,si vous voulez que le, comment ça s'appelle, le LastName, le FirstName,soient des champs qui soient requis, on peut les spécifier ici.
00:16:37 :Voilà, donc là, je mets, par exemple, l'email.En UserName, on pourrait très bien mettre ici, que ce soit l'email.Mais par défaut, c'est l'UserName.Donc là, je vais laisser UserName.
00:16:49 :Sachant que si un attribut est dans UserNameField,il n'y a pas besoin de leur mettre de RecurrentField,sinon, dans tous les cas, ça plante.Et si je ne dis pas de bêtises, d'ailleurs,si je ne dis pas de bêtises, en fait, mon email,ici, il y a déjà un RecurrentField,
00:17:08 :donc je n'aurai pas besoin de leur définir.Voilà.Hop.Ensuite.Donc là, j'ai mon modèle UserCustom.Ensuite, j'aime bien avoir mon ManagerCustom.Pour ça, je vais aller importer le manager de base de Django.
00:17:28 :Donc là, c'est pareil.C'est dans Auth, c'est BaseUser.Et on va le BaseUserManager.On va le redessiner bien comme il faut.Et c'est parti.Donc on va avoir un CustomManager.
00:17:46 :Sachant que des managers, vous pouvez les customiserpour n'importe quel modèle.Je n'ai jamais eu à le faire pour d'autres modèles,mais en général, pour l'utilisateur, je le fais à chaque fois.
00:17:57 :Donc là, j'ai mon manager.Et donc, il faut définir une méthode pour la création de l'utilisateur.Voilà.Donc on va avoir ici l'UserName, l'Email, le Password.
00:18:19 :Et on prévoit le coût des portes.Voilà.Hop.Donc, ce que j'aime bien faire ici du coup, c'est que je mets des validations.Donc s'il n'y a pas d'UserName, on va faire une valueError.
00:18:36 :Ici, l'UserName manquant, par exemple.Et si je fais un IfNotEmail, on fait pareil, une valueError.Et l'Email manquant.Voilà.Ensuite, pour l'utilisateur, ce qu'on va faire, c'est User.
00:18:57 :Donc on va faire un self.model.Et hop là.Donc UserName, ça va être UserName ici.L'Email.Donc là, l'Email, en fait, on va utiliser une fonction.
00:19:12 :On va le normaliser.Si on peut dire comme ça.Donc Email est égal à self.normalize.Aïe, elle est déjà un peu pente.Il a retrouvé notre Email.
00:19:25 :Et ensuite, j'ai oublié une chose.C'est quoi ? C'est quoi là ?J'ai pas beaucoup d'espace avec l'écran qui va comme ça.On va faire maintenant ce qu'on appelle un setPassword.
00:19:46 :Et on va envoyer Atmos Pass.Ensuite, on va sauvegarder l'utilisateur.Et on va retourner l'utilisateur.Donc là, on a fait ce qu'il faut pour la création de l'utilisateur.
00:20:02 :Maintenant, il faut qu'on pense à faire ce qu'il faut pour la création du super utilisateur.Donc c'est parti.On commence avec les pédiférences.Donc on va faire un createSuperUser.
00:20:15 :Ça s'appelle comme ça.Donc là, c'est parti.On a l'UserName.Comme tout à l'heure, l'Email.Le SetPassword.Et nos words.VocaWords.Hop là.C'est ce que j'ai fait.
00:20:31 :Je n'ai rien oublié.Et maintenant, ce qui est très important, c'est qu'il y a des attributs avec Django pour l'utilisateur.Des attributs.Qui sont ? Qui sont ?
00:20:42 :IsActive, bien sûr.IsStaff, voilà.Vous avez IsStaff ici.Et en fait, ça permet de faire en sorte que l'utilisateur ait accès à l'administration.Je ne sais pas où ils ont mis IsAdmin.
00:20:55 :Je ne le vois pas.Il doit être dans la couche d'infraction.Dans l'abstract user, je pense.Mais il y a aussi un attribut qui s'appelle IsAdmin.
00:21:07 :Et que vous allez voir du coup.Contrairement à l'utilisateur, ici, on veut que IsStaff et IsSuperUser.Donc c'est pour être vraiment administrateur.Il ne soit pas à false mais à faux.
00:21:20 :Donc ici, on va passer par nos quarks.On va faire un petit set défaut.Et l'attribut IsStaff.On va le passer à faux.Et pareil pour IsAdmin.
00:21:39 :On va le passer à faux.Là, vous n'avez plus de façon de faire.Ça reste du Python.Donc on fait un peu comme on veut.
00:21:47 :Le tout, c'est de le passer à faux.Ses attributs, il est passé à faux.Parce qu'à base, ils sont à false.Donc là, j'ai mon SuperUser.
00:21:56 :Et qu'est-ce que je peux faire du coup ?On peut retourner maintenant un self.createUser.En envoilant l'username, l'email, le password.Et les quarks.Donc ici, j'aurais pu rajouter une vérification supplémentaire.
00:22:23 :Une petite couche pour dire par exemplesi IsStaff est à false, on peut lever une erreur.Souvent, je fais ça.J'ai une couche supplémentaire.Ce n'est pas forcément très utile dans notre cas.
00:22:39 :Et on va spécifier maintenant à Django qu'on a...Alors, on va spécifier à Django qu'on a un utilisateur custom.Mais avant, j'ai oublié très important.
00:22:52 :On va sauter une ligne.Il faut bien dire que le manager qui va être utilisé,c'est le custom qu'on a rajouté.Avec Django, souvent, quand vous avez un modèle,vous avez par exemple modèle.objects.all
00:23:07 :quand vous récupérez tout.En fait, ici, ça permet à votre modèle utilisateurd'utiliser le manager qu'on vient de créer au-dessusqui est custom.Maintenant, il faut aller préciser dans les settings.
00:23:21 :Tu bascules sur une situation.Oui.J'attendais de voir si tu allais le dire,mais le self-normalize email.Oui.C'est quoi l'intérêt en soi ?Parce que si le mec, il rentre son email,qu'est-ce que le normalize email va fairepar rapport à ça ?
00:23:40 :Je pense que c'est pour le cas où il ne rentre pas un email correct.Oui.Je n'ai jamais regardé en détail ce que faisait la fonction.
00:23:47 :Mais on peut regarder.Attends, c'est normalize.Tu as raison.Parce qu'en plus, je m'en sers.On m'a demandé l'autre fois.Normalize email de Django.Il me sembleIl me semble que leJe ne sais plus si il y en a.
00:24:06 :Normalement, si il rentre en espace, c'est bon.Il me semble que ça jouait sur les majuscules aussi.Vérifie.Oui.Déjà, il touche aux majuscules.Il doit te faire un lower.
00:24:21 :Qu'est-ce qu'il te fait ?Oui.Là, je regarde un exemple.Lower case.Il te fait du lower case.Déjà.Il y en a qui s'amusent à rentrer.
00:24:36 :Il y a du lower case, des accents, des trucs comme ça.Il y en a qui s'amusent à rentrer n'importe quoi dedans.C'est con.C'est un normalize.
00:24:46 :Donc, en fait, il vaUniformiser.Comment dire ?Il va t'enlever tout ce qui estSi tu mets une majuscule, par exemple.Il y en a qui doivent le rentrer.
00:24:58 :J'imagine leur e-mail en majuscule.Ça arrive.Mes parents, par exemple.Ils seraient capables de rentrer leur e-mail en majuscule.Le normalize e-mail, c'est pour l'adapter.
00:25:09 :Et c'est pareil.Quand tu fais un set password ici,ça va te déclencher tout un hash de passwordpour éviter qu'il soit en clair.Voilà.
00:25:21 :Du coup, je disais.On était là.Quand on crée un modèle utilisateur comme ça, custom,on ne peut pas s'arrêter là.Parce qu'il faut préciser à l'engros dans le fichier de settingAuth UserC'est modèle.
00:25:42 :Et on met en chaîne de caractère, c'est l'application.Et c'est le nom du modèle.Custom User.Et c'est pour ça que je disais tout à l'heuredans cette acquisition, Stéphane,je pourrais très bien fairefrom project.
00:25:58 :Non.Project.gettings.Je l'importe.Là, je...Non.Il est où ? Il est là.Là, j'importe le modèle utilisateur.Comme je pourrais faire avec unun getUserModel.
00:26:20 :Enfin propre.Encore là, ce n'est pas assez propre que çaparce que le plus propre, c'est de passerpar le confimport settingset en fait, comme ça, on importe le fichierde settingsde manière...
00:26:38 :C'est une bonne pratique de l'importer comme ça.Etde cette manière, après, vous pouvez très bien fairejustement votre settings.Comme je disais tout à l'heure, settingset là, le AuthUserModel, ainsi de suite.
00:26:51 :On ne peut pas fairefromjango.conf.settingsimport.Ça, ce n'est pas possible.Ça ne passerait pas, ça.C'était où ?Donc là, je vais...Donc là, on l'a spécifié ici.
00:27:13 :Là, on l'a défini ici.Et maintenant, on peut aller, du coup, créer des migrations.Et on va aller voir les problèmesqu'on va... Ah non, il y a une autre chose.
00:27:22 :Votre modèle, ici,quand vous créez un modèle,si vous voulez qu'il apparaisse dansl'administration de Django,c'est le point registre, je crois.Ouais.Et c'est le CustomUser Model.
00:27:37 :Si vous voulez qu'il apparaisse dans l'administration de Django,vous êtes obligé de le définirdans admin.py, ici.Donc, from.models, on importecustom user.Alors,je ne sais pas ce que j'écris, pourquoi j'écrismodel, voilà.
00:27:55 :Souvent, ça c'estla plupart des choses qu'on peut voirquand on débute, ou même pas forcémentquand on débute, mais les gens vont allerdu coup mettre dans l'administration custom userqu'ils ont défini ici.
00:28:07 :Voilà.Donc vous allez voir que ça peut poser problème.Et on va croiser les doigtspour ne pas que j'ai de bug.On va faire la migrationpar la base de données.
00:28:18 :Et je n'ai pas de bug, c'est génial.Donc on a bien icinotre fichier de migrationqui s'est fait, avec notrecustom user model.Donc là, on voit l'échange d'users,super user,tous les échanges d'utilisateurs.
00:28:34 :Et maintenant, je peux faire un pythonmanagemigrate.Hop.Et je peux aller créer du coup un utilisateur.Create super user.Donc je vais l'appelercomme partout, gaby917.
00:28:56 :Je vais mettre mon email.Je vais mettre quoi ?De toute façon, c'est pas un secret.Je vais mettre testunderscore test.Et qu'est-ce qu'il y a ?
00:29:16 :Alors, attendez.Qu'est-ce qu'il me veut, lui ?Ah !C'est super user l'attribut, c'est pashisadmin.Ouais, c'est pour ça, je pense. Ouais, on va recommencer.
00:29:36 :Hop. Donc là,on recommence.Juste regarder, createsuper user.C'est reparti, gaby917Gabriel trouve 5arrobas.comJe metstesttesttest.Voilà. Donc là, il est créé.
00:30:04 :Donc, pour ceux qui se disentque ça peut paraître un peu avancé, mais honnêtement,ça, vous allez très vite, si vous faites information en tybo,vous allez très très vite le voir.
00:30:14 :Ça arrive très vite.Donc, c'est pas si avancéque ça, parce que c'est une chose qu'il faut maîtriserassez vite avec Django.Je vais lancer mon serveur.
00:30:24 :Et vous allez voir.Il faut que je le foute sur l'écrandu bas.Hop.Donc là, j'ai lancémon projet Django.On va aller sur l'admin.
00:30:42 :Donc, mon username917et j'ai fait test.Et vous allez comprendre ce qui va se passer.Maintenant, qu'est-ce que j'ai fait ?Test.Voilà.Et donc là, si j'ai bienmon utilisateur qui est là,je clique.
00:31:06 :Là, on peut se dire, pas de soucis.Bien que.Mais là, pas de soucis.J'ai bien mon mot de passe qui est caché.Mais on pourrait très bien s'amenerà modifier le mot de passe parl'administration, ce qui peut se faireavec Django, ce qui se fait normalement.
00:31:22 :Donc, c'est parti. Je change mon mot de passe.Donc là, je l'avais mis test.Et là, je mets testtest1. Hop.Et qu'est-ce qu'il m'a dit ?
00:31:34 :Ah bon, j'ai oublié.Voilà.Maintenant, je me reconnecte.Mon mot de passe a changé.Test.Test1.Vous allez voir où je vais en venir.Test.
00:31:54 :Qu'est-ce que j'ai foutu ?J'ai mis quoi ? J'ai bien mis test1.Quelqu'un a vu ou pas ? Je ne sais plus.Il me semble bien, oui.
00:32:06 :Test.Test1.Avec majusculesur les T.Oui, c'est ce que j'ai fait.J'ai mis ça, test1.C'est ça que j'ai fait, je crois.Oui.Ce n'est pas grave. On va créer un autre
00:32:26 :super user. Ce n'est pas gênantparce que comme ça,ce n'est même pas gênant du tout. On vafaire pareil. Hop.On va lui mettre un mot de passe bidon.
00:32:36 :Create super user qui va avoiraccès à l'admin. Vous allez voir ce que je veux dire.Je vous dis que là,ça va être gênant. On va mettre un mot.
00:32:44 :J'ai.comEn mot de passe,on va juste mettre test.On va voir s'il va m'accepter.Yes.On peut le forcercomme ça d'enchaîner.Le mot de passe en style bidon. Je crois que j'ai fait
00:33:02 :juste le test.Si je retournesur celui de tout à l'heure,là, j'ai un gros...Là, il y a un gros souciavec le mot de passe. Il apparaît en clair.
00:33:16 :Il apparaîten clair etvous allez voir que l'administration,en fait, elle ne devrait pas être comme ça.Déjà, quand on change le mot de passeen administration, le mot de passedevrait être haché et on devrait passer par un formulaire.
00:33:30 :Donc, en fait, ici,ce que je veux vous montrer,c'est quequand vous faites votrecustom user, donc il y a les settings,on ne les touche plus, c'est renseigné,que vous l'ajoutez dans l'administrationcomme vous le faites avec n'importe quel modèle.
00:33:46 :Ça, c'est une chose que j'ai vue souventet j'en ai déjà parlé avec des gens.Ils m'ont dit, ah oui, merci, c'est vrai.En fait, les gens ne s'en étaient jamais rendus compteque du coup, il y a vraiment, au niveau de sécurité,là, c'est zéro. Vous avez le mot de passe en clair,
00:33:58 :ça ne va pas. Il est enregistré comme ça dans la base.Il est enregistré en clair.Et donc, il y a une manière de faire,en fait, qui permetde...
00:34:08 :Il y a une manière de faire qui doit être faite comme çapour avoirune administrationau carré, parce que là, ce n'est pas possible.
00:34:16 :Si vous faites ça à un client, ça ne fait pas.Et donc, il faut utiliserune classedéjà, ça doit êtreDjangoContrib.authEt...Comme le modèle, c'est UserAdmin.
00:34:32 :Vous voyez, là.Donc, il y a un module admin,j'imagine. Voilà.Il y en a tellement avec Django que...UserAdmin. On va utiliserUserAdmin. On va effacer ça.
00:34:44 :On va recommencer. Et donc, là, on va carrément faire une classequ'on va appelerCustomUserAdmin.Et on va utiliser la classeUserAdmin. Très importanted'hériter de cette classe. Vous allez voir pourquoi.
00:34:58 :Et ici, on va direqu'on utilise notre modèleCustomUser.Est-cequ'on se fait la liste display maintenant ?Non, ça, on va le faire à la fin pour le finir.
00:35:10 :On va commencerpar utiliserlesubset en attributs.Alors, ça,ça permet en fait...C'est ce quipermet l'affichage de l'instantutilisateur d'administration.Vous allez voir. Donc, on va utiliser UserAdmin.
00:35:30 :UserAdmin.J'ai plus de voix..FullSet.Et on va faire Plus.Et ici, en fait, on peut rajouteren informations, par exemple,informations complémentaires.Tac.Et ici, on va avoirun dictionnaire.
00:35:50 :Si j'ai pas de connaisse en dictionnaire,en champs,on a vu tout à l'heure qu'on avait rajoutéle zip code.Est-ce que je dis pas une bêtiselà du coup ?
00:36:04 :C'est le champ qui est là.Voilà, c'est ça.Le zip code.Le zip code.Donc ici,on va bien rajoutermon zip code en champs.
00:36:20 :Il n'y a pas de problème.Et normalement,tout est bon.J'ai mon FullSet. Je réfléchis.Si j'ai rien oublié,mon UserAdmin,l'information complémentaire de mon FullSetici, il n'y a pas de soucis.
00:36:38 :Et je pense quej'ai oublié quelque chose.Ok.Maintenant.Et mon zip code.Par contre mon zip code, lui, il est entre parenthèses.J'ai fait n'importe quoi.
00:36:58 :J'ai encore fait n'importe quoi.Voilà.Et normalement, c'est toutce que j'ai à faire.J'ai mon zip code.J'ai rajouté que ça comme champsnormalement. Ok.
00:37:14 :Maintenant, on va voir aussi en attributs.Là, c'est pluspour le formulaire. Vous allez voir.Pour le formulaire de création d'utilisateur.Vous allez voir de quoi je parle.
00:37:24 :Là, c'est l'affichaged'utilisateur dans l'administration. Et maintenant, on va fairequand on clique sur Ajouter un utilisateur.Là, on va le configurer maintenant.Il nous faut ajouterl'attribut AddFullSetest égal àici.
00:37:42 :C'est parti.Là, on va suivre les conventions de Django.Ici, je vaisouvrir mon dictionnaire.Que je me souvienne bien.Ici, il faut qu'on définisseça, c'est vraimentInternet Django.
00:38:02 :C'est pour utiliserles rendus de Django.C'est des choses que vous trouvez dans la docque vous pouvezcopier et colleret que vous pouvez customiser après.
00:38:16 :Et ensuite, je vais avoirmes... De toute façon, si je vois que çabug, après, je sais ce que je vais aller faire.Je vais allerfaire un copier-coller.
00:38:26 :Les champs.Et dans mes champs, ici,on va avoir...Avec Django, on avait l'email.On avaitl'username.On avait lezip code.Le password 1, c'est quandon a ajouté l'utilisateur, donc on a forcément un password 1.
00:38:48 :Après, c'est le password 2.Il y a un isstaff.Password 2.Is staff.Il y en a encore pas mal, je crois.Isactive.
00:39:08 :Et on arrive sur la fin. Là, on a lesgroups.Et user.Permission.Et je pense qu'il nous reste, du coup,l'administrate.Pour savoir s'il a venu ou pas.
00:39:22 :Super.User. Voilà.Donc là, normalement,j'ai tout ce qu'il faut.J'espère que j'ai pas faitde conneries. J'ai bien mes fields.Mes classes, mes fields. Ok, j'ai l'email.
00:39:38 :Et normalement,c'est bon. Voilà.Ensuite, il n'y a plus qu'àfaire un admin.site.Register. Et là, c'est iciqu'on va mettre notre custom useretnotre classe, du coup,qui hérite de user admin.
00:40:02 :Et normalement,si je n'ai pasfait d'erreur, ça devrait fonctionner.On va bien voir s'il y a une erreur.Je vais aller voir dans la doc.
00:40:12 :Non, c'est pas ça que je voulais faire. Hop là.C'est quoi le raccourci deportes lumineuses ? Ok.On va lancer le serveur.Là.Alors, fieldsets.
00:40:28 :Fieldsets.Qu'est-ce qu'il me veutdans mon fieldsets ?Ouais, j'ai fait un...Ah, ok.Ok, je pense quej'ai compris.Hop là.Je pense que monfieldset, en fait, il voulaitil voulait quoi ?
00:41:00 :Tac, tac.Il voulait un tuple.Ça doit être à ce niveau-là. On va réessayer.On va le relancer.Sinon, je vais aller voir la doc.
00:41:12 :Hop.Donc, manage.Run serveur.Et j'ai toujours un problème.Je vais voir dans la doc vite fait.Est-ce que j'avais copiéun exemple de mon fieldset ?
00:41:28 :Super. Et bien c'est quasimentla même chose, il doit me manquer une virgule.Hop.Hop.Voilà.Et normalement...Voilà, c'est bon.C'est parti.Et donc maintenant,si je suis ici,que je clique surmon utilisateur.
00:41:54 :Et donc,on voit ici maintenant,ça me dit bienqu'il ne peut pas l'afficher parce queil n'a pas été haché.Par contre, si je vais sur l'autre,il n'y a pas de problème. Il a bien été haché, je peux le voir comme ça.
00:42:10 :Et donc maintenant, vous pouvez utiliserun formulaire. Comme l'administrationvous avez bien hérité de votre classe,on peut utiliserun formulaire exprès pour faire un reset.
00:42:20 :Voilà. Password, on confirme,on modifie et il sera bien haché.Donc voilà.Et aussi, tout à l'heure,je disais, il est là, j'ai le...Donc ça, c'est lefieldset. C'est ce qui apparaît
00:42:36 :dans l'admin.On a rajouté le zip codequi esttout en bas.Normalement, qui est ici.Informations complémentaires, on l'a bien écrit là.Et addFieldset,ça va être quand vous le faites, par exemple,ajouter. Et là, j'ai un bug.
00:42:54 :C'est parce quej'ai pareil. Donc je vais recopiermon addFieldset que j'avaismodifié ici.Et si je le recharge,hop là, c'est bon.Normalement, je n'ai plus de problème.
00:43:10 :Voilà. Quand vous avez unutilisateur,maintenant, j'ai bien icile formulaire pour ajouterqui correspond à ce que j'ai mis ici.Email, username, zip code, ainsi de suite.
00:43:22 :Email, username, zip code, ainsi de suite.Donc voilà.Et du coup...Le formulaire dépend de l'ordre dans lequel tu mets tonaddFieldset, en fait.Mon addFieldset,tout à la fin,j'ai mon SuperUserStatue.
00:43:38 :Et là, il est bien à la fin, tu vois.Donc voilà.Donc j'avais dû oublierplus qu'une virguleà la base sur ce que j'ai fait. Dans la doc,
00:43:50 :vous le retrouvez. De toute façon,tout ça, vous le retrouvez assez facilement.Vous n'avez pas besoin de vous taper à la main.Vous trouvez une base, et puis après,vous copie-collez, et puis vous écoutezles chansons que vous voulez. Et c'est pareil
00:44:02 :pour ça.C'est comme tout,on n'a pas à apprendre par cœur.C'est parce que moi, je l'avaisnormalement en tête, mais j'ai dû oublier, j'ai pas fait gaffe.
00:44:12 :Ça se trouve,j'avais oublié une virgule, j'ai pas fait gaffe.Je crois que je regarde dans la description. Mais du coup,en fait, c'est vraiment çale souci.
00:44:22 :On a fait beaucoup de choses pour pas grand choseau final. Mais en fait, ici,c'est vraiment pour ça, c'est quej'ai reçu des messages de gensqui m'ont dit qu'ils ne comprenaient pas.
00:44:32 :J'ai mon mot de passe en clair dans l'administration.Et en gros,j'ai pas de formulaire pour lereset. Et puis tout ça,c'était pas bien. Enfin,
00:44:42 :il y avait rien qu'à l'aider. Donc c'est pour ça, surtout,quand vous avezla morale de l'histoire, quand vous avez un customuser ici, toujoursl'administration passée par l'userpar admin, et n'allez pas faire unadmin.support.register
00:44:56 :en l'enregistrant directement à l'arrachecomme ça.Parce que là,vous allez avoirdes soucis au niveau sécurité,le mot de passe, on a vu que ça fait chiant clairsi on veut le changer comme ça.
00:45:10 :Et c'est justepas possible.Donc voilà pour... Je sais pas qu'il y a rien,d'ailleurs. Ah, il y en a un.C'est ce que je voulais vous montrer ce soir. Donc là, on a fait
00:45:20 :un toursur le modèle en lui-même.Encore une question. Vas-y.Ce formulaire de créationd'utilisateur, en fait,c'est parce que t'es dans la baseadmin de Django.
00:45:34 :Est-ce qu'elle se retransposeaprès dans le site pour unformulaire de création d'utilisateur,quelqu'un qui voudrait s'inscrire sur le site, par exemple ?Alors, quelqu'un qui veut s'ins... Est-ce que
00:45:44 :j'ai un projet qui est là ? Non, non.Alors, quelqu'un qui veut s'inscrire sur le site,est-ce que j'ai tous mes projets là ?C'est quoi ici ?
00:45:52 :Pro, Pythoning,RPG...Est-ce que je dois l'avoir là-dessus ?Ici, alors ça, c'est unprojet, j'étais débutant quand je l'ai fait, maisil doit être largement valable encore.
00:46:06 :Voilà. En fait, pourles gens, quand ils vontaller sur le... Je vais vous le lancerà la nuit.Je crois que je l'avais relancé, le projet.
00:46:16 :C'est un vieux projet que j'aurais bienvoulu finir un jour.Je vais vous le lancer.Que tu comprennes...Je ne suis même pas dans le bon dossier. CD,
00:46:26 :Project, Python,Manage, Run,Server. Et là, Stéphane,je vais te montrerpar rapport à ta question.Je ne suis pas sur mon navigateur.Hop.Bon, on ne se moque pas du design.
00:46:44 :J'étais vraiment tout débutant il y aun an et demi.Ici, Inscription.Là, on voit que j'ai mon utilisateur, email, prénom, nom, mot de passe.
00:46:52 :Et en fait, ça, je le gèredirectement. Ce n'est pas directementavec le AddFieldSet que tu as vu.Ici, je passe par unformulaire Django qui est dansun fichier .forms,
00:47:04 :donc dans Accounts.Et je spécifie les champsFields, Email, FirstName, LastName.Voilà. Email, FirstName, LastName.Les mots de passe, il n'y a pas besoin de le dire.
00:47:14 :Le spécifisme est directement.Donc voilà. Et j'ai bienmon RécapChats qui est icipour la sécurité.Donc voilà.En fait, tu as recréé un formulaire à côté.
00:47:26 :Ouais, en fait,tu recréesun formulaire qui est à côtéettu utilises en fait la classe UserCreationFormici.Tu peux faire comme ça.En fait, cette classe-là,elle te lâche un peu de boulot.
00:47:44 :Bon, ça, ne t'en fais pas, c'est un RécapChat.Mais ici, le modèleest à spécifier. Donc là, on voit bien que je l'airécupéré comme ça, avec GetUserModel.
00:47:52 :Et ensuite, j'envoie les champsque je veux mettre. Donc le password se metdirectement. Mais là, j'ai bien rajoutéles champs que je voulais. Voilà.
00:48:00 :Et le formulaire, bien sûr.Je l'ai envoyé.Je l'ai envoyé, envoyé, envoyé.Hop.Dansune vue de SignUpqui est ici. Voilà.Je l'ai envoyé là.
00:48:20 :Après, mon formulaire, je l'envoie dans un contexte.Et puis,les gens peuvent s'inscrire. Et ça, c'est sécurisé.Ça, ce n'est pas moi qui l'ai créé.
00:48:28 :C'est en héritant de UserCreationForm, en fait.Ça permet d'avoirquand même une couche de sécuritéqui inclut dans Van Gogh sans avoir à tout retaper.
00:48:36 :Le fait d'utiliser ce formulaire-là.Donc, voilà.Est-ce qu'il y a d'autres questions ou pas ?Pour la petite info,c'est un petit jeu drôle que j'ai faitavec Django. Avec des histoires,
00:48:54 :le choix de différents personnages.Tac.Donc, il y a toute une histoire. On peut choisir le personnagequ'on veut. Et puis, l'histoireva se modifier en fonction des choix qu'on fait. On a un inventaire,
00:49:04 :on a des énigmes, on peut gagner des armes,on loot des objets.Voilà.À propos desuser admins,c'est vrai qu'on allait le créerdans le modèle.
00:49:20 :Vu que c'estdans l'admin, il n'y a pasd'affaire pour les bugs.T'as dit quoi ?J'entends très très mal.T'as dit quoi ?En fait, je disais, à propos desuser admins,au début, je pensais qu'on allait le créer dans le modèle.
00:49:38 :Non, non, non.Vraiment, c'était ici.L'user admin, en fait,t'as vraiment ton modèlequi est à part avec ton manageretton admin, ton user adminqui est vraiment dans ton fichier iciadmin.py. Comme ça,
00:49:56 :tu sépares bien les choses. T'as ton modèle à partet la façon dont il va être renduet utilisédans l'administration.Voilà.D'accord. Et c'est pas
00:50:08 :à m'en faire, en fait, pour des bugs,en fait, du côtéd'authentificationutilisateur.T'as dit quoi ?C'est pas à m'en faire pourdes bugs sur l'authentificationdes utilisateurs, en fait.
00:50:24 :J'ai entendu « bug », mais j'arrive pasà entendre le reste. Est-ce que tu peux me l'écrire, sinon,dans le chat ?Ah oui.J'ai du mal à l'entendre.
00:50:34 :Est-ce que, sinon, en attendant,il y a d'autres questions ou pas ?Je suis conscient queque ça faisaitbeaucoup de code, un peu long pourça, maisje répète que c'est vraiment très, très, très importantde faire çaet de pas envoyer à large un administrateur,comme j'ai déjà pu le voir
00:51:10 :même souvent.Attendez juste un instant.On va venir là. Hop.Est-ce que ça vous a paru un peu trop galèreou compliqué ou pas ?
00:51:24 :Non, ça va.Ça va ?Non, ça va.En fait, j'avais même pas consciencequ'on pouvaitfaire un custom user,donc c'est parfait.Merci beaucoup.
00:51:40 :C'est normal. J'ai juste un peu galéré.J'ai débuté là avec mes tuples.J'ai dû oublier une parenthèseà quelque part.Mais bon, ça va.Je t'ai fait un snippetsur GitHubet comme ça, tu as copié-collé.
00:51:56 :J'aurais dû faire ça depuis le début.En fait, j'ai bien comprisce que c'est plus hors Django.L'app, la code que tu t'es faitpar le custom manager,tu peux limite la faire comme ça,tu la peaufines et tout, et après tu te la mets de côtéet dès que
00:52:14 :tu crées un projet Django,tu copies ton app et tu as ton custom manager.Oui, exactement.Moi, il diffère toujours un petit peu.Mais ouais, sur ta base,il y a mêmel'IHC qui a tiré et qui utiliseCoupdequetteurqui permet en fait d'avoirdes bases de projet tout prêtes.
00:52:34 :Je ne connais pas la bande.Et tu vas regarder à Django,Coupdequetteur. Vu que c'est dansla ligne Tempest, je n'ai pas à m'en faire.
00:52:44 :Non, tu n'auras pas de soucis de bug,c'est là. Vraiment, dansl'admin.py, si c'est là, c'estpour le rendu dans l'administration.Après, si ton modèle est mal fait,ça, c'est autre chose.
00:52:56 :Maissi tu hérites bien de Abstract User,que tu fais bien les choses,logiquement,avec Abstract User, tu héritesde toutes les sécuritésde Django.
00:53:10 :Désolé, c'était un peu long.On a largement dépassé.C'est pas gênant.Au contraire, c'est bien parce qu'on est parti de rien.C'est parfait.J'y tenais à ça.
00:53:26 :C'est cool. Merci.Je savais que ça allait être un petit peupas chiant, mais un peu long.Parce qu'il n'y avait pas malde code, maisj'ai reçu quelques messagesde gens qui ne se comprenaient pas.
00:53:40 :C'est un truc qu'on ne trouve pas beaucoup sur Internet.C'est un trucde custom avec plusieurs admins.Je n'en ai pas vu énormément.Je suis content de vous l'avoir montré.
00:53:52 :Si besoin, j'écris un article dessus.C'est un peu surprenant.À l'heure de la cybersécuritédans tous les sens,faire ce qu'il faut pour que le password soit haché,ça paraît essentiel.
00:54:06 :Oui, carrément.C'est pour ça que le password...En plus, c'est normalles emails. Je ne m'étais jamais trop posé la question.Tout est inclus avec Django.
00:54:22 :Après, tu peux même réutiliserdes mécanismes de Django.Je suis en train de faire une application DRSpour une entreprise.Tu peux facilement réutiliser des mécanismes de Django,de vérification, et ça c'est trop bien.
00:54:36 :Il y a une petite question qui me vient.Tu parles des normalités de mail.Est-ce que tu pourraissurcharger cette fonctionou mettre un validateurpour dire que, par exemple,le nom de domaine doit forcément être...
00:54:52 :Oui.Tu pourras toujoursfaire un truc comme ça.Je ne sais pas à quel niveautu surchargerais.Le normalité des emails,je ne le changerais pas.
00:55:12 :Peut-être que je feraisun validateurà partavec une regexqui accepterait qu'un certain...Une regex, je ne sais pas avoir,mais qui accepterait qu'un certain domaine.
00:55:28 :Mais pas forcément surchargernormalité de mail.Je ne m'amuserais pas à allertoucher à ce genre de méthodesà Django.Avec l'aventurier.Oui, c'est toujours possiblede surcharger plein de choses.
00:55:48 :Il n'y a pas de soucis.J'en ai mangé pendant longtemps du Djangoet j'ai même réussi à faireun projet de constructeur de forumcomplet.
00:56:00 :J'ai dû faire plein de choses,mais avec des méthodes comme ça,je ne touche pas du tout.Désolé de vous avoir prisune heure ce soir.
00:56:14 :Je m'attendais un peu,mais je ne pensais pasque ce serait aussi long non plus.J'espère que ça vous a plu.Si c'était trop long, dites-le moi.
Aucune occurrence trouvée pour « ».