Session du 18 mars 2025 à 21h00
Développement Web & Frameworks
Programmation Orientée Objet (POO)
Deviens membre Premium magic_button
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- check +100h de formations
- check +180 exercices de code
- check +100h de mentorats en rediffusion
- check 20 projets
- check Mentorats groupés hebdomadaires
- check Support individuel avec nos mentors
Comprendre et appliquer le pattern Singleton en Django
Découvre le concept de singleton en Python, puis vois comment l’appliquer concrètement dans un projet Django, avec un détour par Streamlit et la gestion de session.
00:00:00 :C'est parti.Mais du coup, R7, je posais la question pour Streamlit et Django.Sans rest framework, tu peux, mais bon, tu envoies des requêtes HTTP et puis à la limite,tu renvoies du JSON.
00:00:21 :En fait, sans DRF, j'ai du mal à me dire comment ça pourrait être.Je pense que DRF te facilite pas mal des choses à la limite.
00:00:31 :Mais sinon, c'est possible.D'accord.C'est surtout parce que j'imaginais un peu surtout faire un front avec Streamlitet un bac en Django pur.Ouais.Ouais.
00:00:53 :Qu'est-ce que tu veux faire?Moi, j'ai commencé pour m'amuser, mais avec DRF, à faire ça avec Streamlit, ouais.OK.Mais bon, je pense que tu serais...
00:01:11 :Avec les sessions, tu peux t'amuser.Ouais, ouais.Ouais, parce que dans tous les cas, dans tous les cas, avec Django,oui, tu peux faire du JSON de réponse, donc tu peux l'envoyer avec ça, ouais.
00:01:27 :Mais moi, je t'ai amusé à faire...On en parle l'arche au disque, je m'étais amusé à faire un truc genreje m'envoie des tokens vers Streamlit et avec Streamlit,peut-être que tu peux...
00:01:38 :Je ne sais pas si tu vois ce que c'est le st.sessionstate.Ouais, je vois.Tu peux vérifier l'état.T'as dit quoi?Tu peux vérifier l'état de la session.
00:01:50 :Bah en fait, je vais commencer à partager mon écran.Tiens d'ailleurs, allez hop.Et puis on va commencer à m'entendre en question.Mais je vais te montrer.
00:01:59 :T'es où?Hop là, il est là.Avant de commencer, je voulais faire quoi?Partager, interscreen.Et c'est celui-là, je crois.Streamlit sessionstate.On voit que j'ai déjà cherché dessus.
00:02:24 :Qu'est-ce qu'il me fait?N'importe quoi.Streamlit sessionstate, je crois.Ouais, tac.C'est exactement ça, c'est le sessionstate en fait que j'utilise.Et en fait, je récupère les clés qui sont envoyées par le back-endet je les enregistre là-dessus, tac.
00:02:47 :En fait, je me crée une clé.Ah ouais.C'est marrant, oui, c'est vrai que tu peux faire comme ça.Moi, j'ai plus tendance à faire comme ça en mode attributs.
00:02:55 :On peut appeler soit comme ça, appeler une clé,soit utiliser un attribut.Moi, j'utilise un attribut, normalement, ça revient au même.D'accord.Bon, excusez-moi, je vais peut-être laisser ouvert pour l'instant.
00:03:11 :Ouais, on va le laisser ouvert.Est-ce qu'il y en a ici qui ont déjà utilisé le singleton ou pas?On va parler de ça aujourd'hui, du coup.
00:03:21 :Non.Ok.En plus, je vais vous donner des petits liens intéressants,des petites ressources intéressantes sur ça.On va vraiment voir la base du singleton, là, moi,ce que je vais vous présenter en Python pur,mais vraiment, c'est une bonne petite base.
00:03:36 :Et puis, on va mettre un...Moi, j'ai utilisé une seule fois,parce que je ne pense pas que c'est un truc que dans tous les cas,je l'ai utilisé une seule fois pour une boîte,et je l'ai appliqué à Blango.
00:03:48 :Donc, au moins, ça fait un cas concret,et je vais vous montrer un peu le cas que j'ai eu.Bon, après, le singleton, en fait, c'est du design pattern.
00:03:56 :Je ne sais pas si il y en a qui ont déjà entendu un peu parler du design pattern.Oui.Il y a Refactoring Guru qui est pas mal, aussi, là-dessus.
00:04:07 :Donc, il existe plein, enfin, plusieurs patterns.Bon, j'en ai déjà vu quelques-uns, mais les connaître comme ça tous par cœur,c'est compliqué, quoi.Donc, voilà.
00:04:19 :Le singleton est un design pattern.Et, en fait, le principe,je vais en s'y rendre maintenant,c'est qu'une classe, avec le singleton,une classe ne peut avoir qu'une instance.
00:04:30 :C'est OK ?Ça, c'est bon ?Oui.Il n'y a que plusieurs instances avec votre classe.Il n'y a vraiment qu'une instance possible.En Python, il en existe quelques-uns.
00:04:45 :Le plus connu, il y a None, True, False.C'est les singleton.Donc, le singleton classique, je vais vous en montrer un.Et puis, on va voir que l'instance, de toute façon, elle n'est créée qu'une fois.
00:04:59 :Donc, imaginez, je vais l'appeler singleton.On voit assez bien mon écran, là ?Oui, c'est bon.OK.Oui, c'est bien.Vraiment, la manière la plus classique de faire, ici,vous avez votre attribut.
00:05:17 :Instance qui va être égale à None.OK.Donc, on part comme ça, avec...Je sens que ça sonne.Il y a quelqu'un qui veut arriver.
00:05:29 :C'est celui-là.Est-ce qu'il arrive à se connecter, celui-là ?Je ne le vois pas arriver.Je pense qu'il doit être en train de charger.Sur le discord, il n'y a pas de problème pour moi, apparemment, dans celui-là.
00:05:52 :Salut, celui-là.Salut, salut.Je ne sais pas si tu m'entends.Tu n'as pas ton micro.En gros, tu m'entends ?On commence à parler singleton ?
00:06:07 :Oui.Salut, tout le monde.Salut, celui-là.Celui-là, toi, tu as déjà utilisé un singleton ou pas ?Oui, je l'ai utilisé.J'avais un projet sur la bibliothèque.
00:06:22 :C'était un singleton.OK.Du coup, là, j'en présente un très basique.Après, on va partir sur le Django pour voir une application concrète.On va aller un peu plus loin.
00:06:35 :J'ai plusieurs choses dessus.Du coup, ce qu'on va faire, c'est qu'on va utiliser la méthode new,qui est appelée avant la méthode init.Donc, il prend la classe.
00:06:50 :En gros, ici, ce que vous allez faire,si ici, votre attribut instance, il est non,là, c'est vraiment le plus basique.Ce qu'on va faire, c'est qu'on va appeler ici instance.
00:07:14 :On va appeler la méthode super, OK, de new.Vous allez voir, ça paraît un peu nébuleux, mais t'as vu.On appelle la méthode super de new ici, OK.
00:07:29 :Et ce qu'on va faire, c'est qu'on va retourner ici l'instance.OK.Donc là, vous allez voir du coup ce qui va se passer quand on fait ça.
00:07:47 :Par exemple, ici, je vais...Bon, là, c'est un singleton vraiment de base.Je ne sais pas, je vais l'appeler A.Mon singleton, tac, ici.Et C, on va l'appeler aussi mon singleton, OK.
00:08:07 :Et si je fais ici un print.Donc, new est appelé avant init.Et ici, on va printer l'idée de A.Et on va faire pareil, on va aller printer l'idée de B.
00:08:27 :Hop.Mince, c'est C que j'ai appelé.Tac, voilà.Hop.Voilà.Et quand vous regardez, en fait, on n'a pas instancié plusieurs instances.On est bien, on pointe bien vers l'emplacement de mémoire, OK.
00:08:47 :Oui.OK.Donc là, on a un singleton de base.Après, il y a plusieurs façons de le faire.On peut le faire avec des décorateurs.
00:08:58 :Il y a d'autres façons aussi de le faire.Mais là, je vous montre vraiment la base.On va plutôt partir vers un cas pratique.Mais je voulais aussi vous montrer autre chose.
00:09:06 :Alors, j'avais préparé un cas avec...Alors, attendez.Hop.Mince.Il est où ?Tac.Donc, est-ce que je vous montre ça ?Oui.Alors, ça, ça peut être sympa.
00:09:25 :Je vais vous envoyer quelque chose.Voilà.J'avais préparé un lien.C'est ça que je cherchais.J'ai retrouvé le lien.Il est là.C'était une conversation sur Stack Overflow, en fait,qui est intéressante.
00:09:41 :C'est un mec qui parle de différentes façons de faire un singleton.Comme ça, vous voyez bien les bases, en fait,de comment on peut faire.
00:09:48 :Et c'est assez marrant.Et, avant de passer à la suite,je voulais juste vous montrer qu'il y avait une façon de faire.Mais alors, pareil,j'ai trouvé qu'on trouve facilement sur Internet.
00:10:00 :Vous cherchez un peu comment on peut faire.Donc, par exemple, là,imaginez que vous voulez utiliser les méthodes init pour initier des attributs.Ben, en fait, ce que vous pouvez faire,donc là, on a bien notifié que c'est new.
00:10:13 :OK.Donc, on va utiliser ici notre attribut instance.L'instance, ici, on peut se créer un...Alors, le plus commun, ça va être de initia.Là, il y a z.
00:10:26 :C'est le plus commun.C'est vraiment un cas que vous pouvez voir assez souvent, false.Je l'avais vu dans un article ou deux, ça.Et donc, là, ce qu'on va faire,init.
00:10:38 :Et donc, les single done, je ne l'ai pas dit, oui.Donc, ça sert beaucoup, par exemple,pour les connexions de base de données.Comme ça, vous êtes sûr d'avoir qu'une seule instance qui gère ça.
00:10:48 :C'était Baptiste qui en parlait au début.Et c'est pareil.Ça, c'est un gathel en commun.Vous trouvez plein d'articles là-dessus.Donc, voilà.Là, on ne va pas s'embêter pour l'instant.
00:10:58 :Donc, on va avoir notre méthode init.OK.Et ce que vous pouvez faire, ici,c'est if not self.Initialize, ici.Initialize, je n'ai pas fait de fautes.
00:11:15 :Ce qu'on peut faire,on va passer du coup notre initialize.En fait, initialize, on va le passer à ce coup.Et ce qu'on va faire, ici,c'est que, par exemple, vous allez pouvoir...
00:11:31 :Bon, on va faire un print pour l'instant.Je vais mettre initialisation.Et en fait, pour avoir un print,ici, vous allez mettre votre attribut 1 et ainsi de suite.
00:11:43 :Vous allez mettre vos attributs.Par contre, pour vérifier, ce que vous pouvez faire,et là, on va mettre déjà initialisé.C'est un flag, en fait.
00:11:56 :Ouais, en fait, vous pouvez faire ça avec un flag.Qu'est-ce que j'ai fait ? J'ai fait une faute.Est-ce que quelqu'un voit ma faute ?
00:12:06 :J'ai dû faire une faute quelque part.Je ne vois pas ma faute.C'était quoi l'erreur ?Il n'y a pas d'attribut 1.Alors, attends.Oui, en fait, il te manque un « i » après ton « t »sur la cls.understand.
00:12:28 :Merci beaucoup.Je cherchais que c'était bien.C'était forcément un truc comme ça,mais je ne le voyais même pas, tu vois.Merci d'avoir plusieurs yeux, c'est cool.
00:12:38 :Voilà.Là, il s'initialise.Et là, il les a initialisés.Et on est bien sur le même espace que moi.C'est bon pour vous ?OK.
00:12:49 :Bon, là, on est vraiment sur un cas de base.Alors, par contre,ça, je n'y avais pas pensé avant de préparer le mentorat.Et en fait,alors, j'avais déjà lu une fois,mais bon, ça ne doit pas être très grave.
00:13:02 :Quand il y a du multithreading,il faut gérer le cas où les threads,ils ne peuvent pas créer plusieurs fois le singleton,plusieurs instances,parce que c'est possible.
00:13:12 :C'est rare, mais c'est possible.Donc, en gros,j'ai lu un peu les ressources qui se faisaient là-dessus.En fait, ce que vous pouvez faire,vous pouvez apporter ce threadingen cas de multithread ici.
00:13:26 :Je ne vais pas m'embêter à faire des init.On va alléger un peu le code, là.On va rendre ça plus cool.Et on va partir avec un singleton propre.
00:13:42 :OK, donc là, j'ai bien mon instance.OK, c'est parti.Donc, en gros,vous pouvez partir ici avec un autre attribut.Et c'est le lock.Et en fait, vous allez utiliser...
00:13:50 :Je vous en ai parlé une fois dans le...J'ai fait un mentorat, je crois,c'était en novembre, là-dessus.Et Stéphane avait suivi sur...la Syncroll, je crois.
00:13:59 :Donc là, on peut aller utiliser threading.lock.Et c'est lui qui fait le flag, en fait.Ouais, et donc, ça va,vous allez l'utiliser pour locker.
00:14:08 :Et en fait, ce qui va se passer...Donc là...Tac.Ici, on n'a pas de...Tac.J'ignore, peu importe.Enfin, instance.Et en fait,donc là, vous faites une première vérification,juste comme ça.
00:14:21 :Je me suis demandé pourquoi.Enfin, j'ai cherché un peupourquoi, comment...le mieux.Pour moi, j'ai l'impression que ce serait comme ça,parce que là, c'est une vérification très rapide.
00:14:31 :Parce que si vous faites la vérificationpour mettre en place le lock à chaque fois,ça peut être plus gourmand en ressources.Donc après, vous faites...
00:14:38 :la vérification pour le lock.Et ensuite,une fois le lock...enfin, enclenché, quoi,on va acquérir...Une fois le zéro acquérir, on va dire,on peut dire comme ça.
00:14:54 :Et là, vous pouvez repartir sur une...Ça fait un peu redondant, je suis d'accord.Donc, on peut repartirsur une deuxième vérification.Et puis là, c'est reparti,on recommence,comme on a fait tout à l'heure.
00:15:06 :Tac.Ton instance.Et puis, on est...Et puis, on recommence, quoi.Super.On appelle le super de...New.Hop.Avec notre classe.Et puis, on n'a plus qu'à retourner.
00:15:20 :On retourne notre...notre instance, en fait.Hop là.OK.Donc, ça, c'est vraiment...dans le cas de multithreading.Ça permet vraiment la vérification rapideparce que ça ne sera pas toujours utilisé.
00:15:38 :Le lock n'est pas forcément toujours utilisé.Et si besoin, boum,le lock se met en place.Et puis là, on refait la vérification.Et puis, on verrouille, en fait,pour pas que les threads fassent concurrence.
00:15:48 :Ça va ou pas ?Oui.C'est un peu un cas plus...plus spécial, je pense, mais...Voilà, un truc du thread safe,ouais, c'est ça, Baptiste.
00:15:58 :Donc, voilà.Moi, perso, je vous dis,c'est des choses que j'avais étudiées,j'avais regardé comment ça pouvait se faire.Ça se fait souvent comme ça.
00:16:07 :Donc, voilà.Moi, le cas concret, ça va être autre chose.Je vais vous montrer.Par contre, une autre choseque je voulais vous montrer aussi,qui peut être intéressante.
00:16:18 :Un module, c'est un singleton.Grossièrement.Je sais que c'est un peu bizarre.Par exemple, ici,je vais avoir...Je vais appeler single..py.OK.Et le A, il va être égal à 1.
00:16:39 :Ça me paraît pas mal de faire ça.On va le laisser comme ça, notre single.Ensuite, on va...Je vais les appeler...Module 1, module 2.
00:16:54 :On va l'appeler module...Module 1.py.On a module 1.py.OK.Donc là, on va faire un import de single.Et ce qu'on va faire,c'est que single.A,
00:17:12 :on va...On va faire un plus égal.On va incrémenter.Et ensuite, on va faire un petit printde single.A.Voilà.Ça me paraît pas mal.
00:17:25 :On pourrait peut-être même faire encore mieux.On va faire un print de l'idée.De l'idée de singledu module complètement.Et je pense qu'on va pouvoir faire la même chose.
00:17:39 :On va se créer un module 2.Je réfléchis en même temps.Ça, je n'avais pas encore trop réfléchi sur ce que je voulais faire là.
00:17:47 :Et ici,on fait pareil dans le module 2.Maintenant, on a notre main.py.On va faireun port de module 1et un portdemodule 2.
00:18:03 :Et normalement, si je n'ai pas fait d'erreur,on voit queici, en fait, ça ne va pas se réinitialiser.On importe le module.On importe le module single ici.
00:18:18 :On l'importe là.On l'incrémente bien deux fois.Donc à chaque fois, ce n'est pas réinitialisé.C'est bien deux.Puis après, trois.Notre module vient du même espace mémoire.
00:18:27 :Ça, il n'y a pas de doute.Donc,il faut bien se dire que du coup, un module,il est chargé une fois quand on lance le processus.
00:18:35 :Il est chargé une fois.Et après, son état,il évolue.Il ne se réinitialise pas à chaque fois.À chaque import, par exemple.On aurait très bien pu le faire ici,l'importer plusieurs fois de différentes manières.
00:18:46 :Mais voilà, moi, ça montre qu'avec différents modules ici,on rapporte le 1 ou le 2.À chaque fois, on est bien sur le même espace mémoire.
00:18:54 :Et il s'incrémente bien.Il ne revient pas à chaque fois.Ce n'est pas deux et deux.C'est OK ?Est-ce que c'est bon, ça ?
00:19:03 :Oui, c'est bon.OK.Par exemple,c'est très utilisé.Je ne sais pas,ceux qui connaissaient le Django,le setting, c'est un module.L'état ne va pas être tout le temps en train de changer.
00:19:18 :Ce n'est pas possible.Ça ne sera pas stable, sinon.Voilà, c'est un module.Ça peut être vraiment utilisé comme des settings.C'est pour ça que je dis un module.
00:19:25 :Souvent, on peut le voir comme un singleton.Donc, voilà.C'est bon pour vous, ça ?Pour tout le monde ?Oui.OK.Pour moi, c'est sympa.
00:19:36 :OK.Oui.OK, OK.Bon, là, c'est un peu plus...Ça part un peu plus tiré par les cheveux.Ça paraît même très logiqueet trop logique pourquoi j'en parle.
00:19:47 :Mais je préférerais juste l'évoquer.Même si ça vous paraît...Enfin, pour vous, c'est évident.Donc, le module single qui était là.On a vu plusieurs choses maintenant.
00:19:56 :Alors, attendez.Alors.J'avais préparé un truc et j'en avais vu.J'avais mon corps.OK.Est-ce que j'avais déjà préparé ça ?Qu'est-ce qui me fait...
00:20:25 :OK.OK.Est-ce que...Est-ce que cette question, elle est vide ?L'immigration ?C'est bizarre, ce qu'il m'a fait.OK.Je vais repartir, du coup, sur...
00:20:40 :J'avais préparé une branche.J'en avais vu.OK.J'avais préparé une branche, je crois.J'avais préparé une branche.Secret singleton.Ça va être celle-là.Hop là.
00:20:56 :OK.Et on va pouvoir...Voilà.Au lieu de tout montrer comme ça,je vais vous la réinitialiser.Pour vous montrer un peu comment je l'ai fait.
00:21:05 :Et pour vous montrer que c'est vraiment tout bidon à faire.Et dans l'admin, c'est pareil.De toute façon, j'ai supprimé les packs.Donc, on va repartir zéro.
00:21:14 :Je voulais...Si j'y vais, je n'aurai peut-être pas le tempsde vous en parler comme je veux.Mais si.Sur liste...Attends, votre liste, j'ai...
00:21:27 :Votre liste.Je suis en train de lire ta question.Alors, attends.Comment...Attends, je vais la revoir.Sur l'iPad, comment peut-on gérerla synchro des infos sur...
00:21:41 :Oui, c'est un thème plus clair à vis-à-vis de voix.La question, c'est...Comment est-ce qu'on peut s'assurerqu'on ne va pas écrire deux fois au même endroit,par exemple, si on veut pocher une info dans une liste,si on a un singleton qui est partagésur plusieurs threads ?
00:21:56 :De toute façon,je viens de te dire,tu fais ton lock,et en fait,tu puisses le faire.Tu pourrais...Je pense que tu pourrais très bien te dire que...
00:22:12 :On va utiliser le threading point là,comme de tout à l'heure.Pour moi, c'est important.Et toujours dans la méthode new,comme je l'ai montré tout à l'heure,en fait, tu pourrais avoir un attribut...
00:22:24 :Oui, tu pourrais faire un attribut liste.Et puis, à chaque fois que tu veux travaillersur ta liste,tu utilises des méthodes,mais qui...Des méthodes qui utiliseraient le lock.
00:22:35 :Je vais te le dire, je pense.D'accord.Ça va ?Je creuserais,parce que c'est une question théorique,parce que je n'ai pas de mise en pratique à faire,mais c'est une question qui me venaitpar rapport à ce que tu avais présenté.
00:22:51 :Oui, comme ça.Moi non plus, je n'ai pas la...Je pense qu'il y a un truc à faire comme ça.Vraiment, tu initialisesune liste dans new,pourquoi pas dans la méthode new,comme on a dit tout à l'heure,et puis après,toujours avec le lock,et puis après, tu travailles...
00:23:09 :Ok.Des méthodes pour faire des append,tu utilises le lock aussi,et je pense que du coup,tu rends 100% tu vois.Je pensais qu'il fallait utiliserdes structures donnéescomme les queues et les dequeues.
00:23:23 :Ah !Pour s'assurer de l'ordredans lequel on insère les données.Je réfléchis comme ça.Je ne sais pas.Les dequeues, pourquoi ?Moi, comme ça,je pensais vraimentà utiliser le lockà chaque insertion,à chaque retrait.
00:23:46 :Comme ça, au moins,ça devrait être normalementplutôt propre.Après, je ne sais pas tropla performance que ça a,le fait d'avoir d'appeler les locksà chaque fois pour chaque opération.
00:23:57 :Mais oui, ça a créécette intéressante question.Tu vois ce que je veux direou pas à peu près ?Ah oui, complètement.En fait, tu acquiers le lockà chaque fois que tu veux utiliserla ressource qui est partagéeet qui est dans ton singleton,mais qui est utilisée
00:24:12 :par plusieurs instancesd'autres classes, par exemple.Oui, c'est vraimentinitialiser la listedans le lock au début,et puis après,des méthodes qui acquièrent le lockà chaque fois.
00:24:26 :C'est intéressant, c'est...A l'ordre ?Oui.Je ne sais pas s'il en a fini.J'aimerais savoir le lock là,c'est quoi ?Parce que je n'ai jamaisutilisé ça.
00:24:38 :Si tu veux, je t'enverraiun lien vers un mentorat.En fait, je ne sais plussur quels exemplesj'avais utilisé,mais on faisait du multithread.
00:24:48 :Et en fait,je ne sais plusquels exemples j'avais,mais si tu veux,les threads, à chaque fois,ils se faisaient concurrence.Je ne sais plussi c'était sur certaines fonctionsoù je faisais de l'incrémentation.
00:25:03 :Il y avait un truc dans le genre.Et en fait, ça renvoyait des fois,pas tout le temps,parce que la concurrence,elle n'est pas toujours là,mais vu que les threads,à chaque fois,ils travaillaient un peudans leur coin,j'avais une incrémentationqu'ils faisaient,mais des fois,
00:25:16 :tu as l'impressionqu'ils se faisaientun peu en même temps.Ce qui n'est pas normal.En fait, le lock,il va te servirà ce que ça ne soit pas le bazar,et que tous les threadsqui travaillent de leur côté,ils se sentent quand mêmesynchronisés,qu'ils ne fassent pas n'importe quoi
00:25:28 :un peu dans leur coin.Il y a un lien après l'autre.Oui, oui, oui.Parce que les problèmesde concurrence,en fait, ça peut vitedevenir le bazarau niveau de ton code.
00:25:42 :Je ne sais plus,je vais montrer un exempleoù en fait,je crois que c'étaitune incrémentationoù elle se faisaitun petit peu n'importe comment.
00:25:49 :Mais je te renverrai le lien,j'avais fait un trucau mois de novembre dessus.Ça va marcher.Je crois que j'en ai parlé,d'ailleurs.Parce que je fais le thread aussi,je pense,c'est au niveau du processeur.
00:25:58 :Ce n'est pas au niveaudu code.Ou bien c'est au niveaude...Parce que là,j'ai un peu d'effort.Oui, oui, oui.C'est pareil.Donc ça, oui.
00:26:07 :Je te renverrai le lienpour ça aussi.Je ne parlais pas aussique de multi-threads,de plusieurs threads.Après,il y a aussimulti-processing.Vraiment,pour des calculsoù il y a besoindes processeurs,des calculs gourmands,tout ça,tu vas utilisermulti-processing.
00:26:23 :J'avais fait un trucsur ça aussi,je crois que c'estdans la même sessionque vous avez fait.J'ai regardé mes notes,là.Ce serait la sessiondu 11 novembre.
00:26:34 :Oui, c'est pour...11 novembre, ok.D'accord.Si ça peut vous éviterde chercher,regardez voir déjàsur le 11 novembresi ça colle bien.En fait,ce n'est pas dur.
00:26:44 :J'avais fait un mentoratsur le thread,le multi-processing,et Stéphane avait enchaînésur...Comment ça s'appelle ?L'asynchrono.Ok, merci.Avec 4.5 kilos.Oui, c'est ça, oui.
00:26:54 :Voilà,on avait tout enchaîné,je crois,dans la semaine.Il y en a qui suivent,dans le genre.Oui,le Asynchio,c'est le 18 novembre.
00:27:03 :Ok.Voilà,ben ouais.Le 11 novembreet le 18 novembre,il y a les deux thèmes,là.D'accord, merci.Merci.Voilà.Donc,voilà.Donc,il faut bien faire la différenceentre le multi-processinget le threading.
00:27:19 :Du coup,là,j'étais sur mon projetde Django,excusez-moi.Ouais,c'est ça.J'ai effacéce que j'avais testéhier,ça.Donc,cette méthode,elle marche très bien.
00:27:33 :Donc,imaginez,là,c'est mon application de Tulu,là,où on avait faitles modèles Viewset,là,la semaine dernière.D'ailleurs,la semaine prochaine,on va continuer.
00:27:45 :On va s'amuser un peuavec les tokens.Et donc,je disais,ouais,donc,avec Django,ce qui peut être pratique,en fait,j'avais un problèmepour une boîtesur laquelle je bossais.
00:27:57 :On avait,on voulait avoirdes settings.Alors,vos settings,en fait,on pourrait très bien se diredans le projet,j'ai des settings ici.Hop,on se définit des settings,je ne sais pas,genre,max,max,max Tudu,hop,est égal à 5.
00:28:15 :Donc,voilà,comme ça,on pourrait dire,chaque utilisateurpeut avoir un maximumde 5 Tudus.C'est idiot,mais,sur principe,ce que je voulais dire,c'est qu'en gros,on pourrait faire,du coup,une vérification à chaque foisdans le code.
00:28:31 :Si le count,en fait,le nombre d'instancesde Tudu,est égal à 5,par exemple,en gros,on ne peut pas en créerplus d'autres,par exemple,voilà.
00:28:42 :Le problème,c'est que ça obligeait,du coup,à coder ça,comme ça,des settings dans le bureau.J'en avais plusieurs à faire,donc,max machin,max fou,est égal à,tac,à 10.
00:28:56 :Sauf que le problème,vous voyez ce que je veux direou pas ?Vous voulez que je m'attachelà-dessus ?Oui,oui,ça va.Vous le dites,c'est vraiment justeune vérification.
00:29:10 :En gros,à chaque fois qu'un utilisateurveut créer un Tudu,on fait une vérification,c'est que s'il est déjà à 5,on lui dit,refusez,le nombre de Tuduset maximum n'est atteint pas.
00:29:19 :En gros,c'est une applicationoù il y avait plusieurs chosescomme ça,en max machin,donc,on pouvait facilement,je ne sais pas,on avait plusieurs définiset puis,il y a quelqu'unqui avait balancé,c'est un peu chiantde faire sans settingsparce que,du coup,dès qu'on va le modifier,
00:29:36 :il faudra revenir sur le code,modifier dedans,le push,machin,machin.Ok,pourquoi pas,donc,on ne fait pas ça.Donc,je me suis dit,comment je pourrais faire ?
00:29:48 :J'ai réfléchi un peucomment ça se traite,ici.Donc,un modèle abstrait,même.Donc,un singleton,comme ça,un singleton modèle,sur Django,et j'ai hérité dece modèle.
00:30:01 :Et là,dans la classe méta,je ne sais passi vous le savez,mais on peut très bien direqu'on est surun modèle abstrait.
00:30:08 :Ça veut direque c'est un modèlequi ne va pas créerde tas d'invasions données.Ok ?Ok.Ok.Ok.Donc,là,il ne sert pasà créer de tasd'invasions données,celui-là.
00:30:22 :Il va servir,on va en hériter,en fait,celui-là.Et puis,on va lui mettredes attributs.Et bien,l'attribut savequi est très utiliséavec Django.
00:30:33 :Donc,là,les arbres,les poires,ici.Et ce quej'avais fait,le pk,eh bien,il sera égal à 1,tout le temps,à chaque save.
00:30:45 :Et là,je rappellema méthodesuper de save.Ok ?Et puis,mon save,voilà,il était comme ça.Voilà.Hop.Là,j'avais mon save.
00:30:58 :Il y a peut-êtremieuxà voircomment on peut voir ça,mais mon delete,pareil.Ici,le delete.Hop.J'avais interdit,interditla suppression.J'étais énervé.
00:31:11 :Hop,j'ai dit,on ne supprime pas.Ici,on passe.Il n'y a pas de delete.Et ensuite,j'étais parti,donc,j'ai trouvé ça bien.C'est un mec qui avait fait ça,je crois.
00:31:24 :Il avait utiliséune classe méthode,ici.Et en fait,en quoi elle est bien ?Parce que du coup,ça me servait de point d'entréepour mon singleton.
00:31:33 :Ok ?Donc là,c'est une classe méthode,donc je prends la classeen entrée.Et ce que je fais,objet.Hop.Donc,ici,c'est,on pourrait dire ça,comme ça.
00:31:47 :Ok ?Et avec donc Go,vous avezpoint,object,point,get,mass.Object,c'est get or create,tac.J'ai souvent utilisé,ici.Et hop,on fait un get.
00:32:03 :Voilà.Donc en gros,ici,c'est create,mass.J'ai fait des grosses fautes.Hop,create,comme ça.Et comme ça,on peut vérifiersi c'est la première foisqu'il est crééet récupérerl'objet en questionet vérifier s'il est créé.
00:32:19 :Mais vu que je ne peux pasvérifier qu'il est créé,je peux faire ça.Et donc,en fait,ce que je vais faire,c'est que je vais récupérersoit mon instance qui existe,soit la créer.
00:32:30 :Ok ?Et le pk sera toujours 1.Et donc,forcément,après,je retourne icimon objet.Donc à partir de là,ce que j'ai fait,c'est que je me suis dit,il y a un modèle qui pourraitme servir.
00:32:43 :À chaque fois,j'aurais besoin d'avoirun modèle singleton.Et en gros,moi où j'en étaisdans le projet,j'en avais qu'un seul.Vous m'arrêtezsi c'est un peu bizarre.
00:32:52 :Ici,j'avais,je m'en servais en faitpour les settings du site.Mais dans la base donnée.Vous allez comprendrequand ça va êtrele final.
00:33:03 :Donc ici,j'ai appelé mon singleton modèle.Ok ?Et je ne sais pas,on pouvait,tout à l'heure,mettre max to do.Voilà.Et puis,on peut se direque c'est unpositiveinteger filter.
00:33:17 :Donc voilà.Hop.Et puis,on ne va pas mettrede verbosync ici.Peu importe.Et puis là,on va rendre les chosesun peu plus propres.
00:33:29 :J'avais fait un truc comme ça.Non,je n'ai pas envie de faire ça.Je ne vais pas le kipper.Ici,j'avais fait,j'avais retourné quoi ?
00:33:37 :J'avais,vu que c'est un singleton,un paramètredu site.Voilà.En fait,j'avais fait mes paramètresdu site comme ça.Et pour que ça soitencore plus lisibledans l'administration,on va faire une classe méta.
00:33:50 :Et on va partir surceux qui font du Django.Je pense qu'ils connaissent.Un paramètredu site.Et il n'y aura pas,après on pourrait très bienle mettrepluriel,verbe.
00:34:05 :On va le,tac,le surcharger,ça.Et on va l'appeler aussiparamètred'instance.Ça ne marchera pas ça.Paramètredu site.Voilà.Et en fait,ça,ça vous permet d'avoirdans votre base de donnéesun modèleavec une seule instance possibleoù vous allez pouvoir en faitcréertous vos settings,
00:34:30 :vraiment les configurerau lieud'aller dansdans settingset créer vos attributscomme ça dans settingset devoir le faire manuellementchaque fois.Là, ça sera dynamique en faitdirectement dans la ligne Django.
00:34:43 :Et,on va déjà faire çaet je vais vous montrerce que j'avais fait après.Ce que j'avais fait après,j'avais fait comment ?On va déjà faire comme ça.
00:34:56 :Hop.Hop là.Et c'était,on va l'appelerfrom.modelsimportsite settings.Hop là.Je crois que j'avais déjà faitl'émigration.Qu'est-ce qu'il me fait ?
00:35:16 :Qu'est-ce qu'il me fait ?Ah, oui.Forcément.Forcément,ça n'a pas fonctionné.Et j'avais,je crois que j'avais déjàune base de donnéesavec ça dedans.
00:35:33 :Comme je l'avais fait,ça évitera tous les problèmes.Je l'avais, c'est tout douxitems.Je crois que j'avais appelémon modèle.C'était items.Voilà.Et donc, je repars sur monOK.
00:35:48 :OK.Nickel.Et,je vais faireunehop là,migration.OK.Donc,tac.Je vais faire un run serveur.Je vais récupérer l'adresse.Tac.Il ne s'est pas ouvert là.
00:36:09 :Voilà.Et donc, en jouant dans la nulle,maintenant,vous avez les paramètres du site.OK.J'ai une instance que j'avais créée.Après,elle est là.
00:36:23 :Donc là,on a une instancequi a été créée.Donc là, vous avez les maxitems.Et,que vous pouvez fairepour être à la limite,pour verrouiller vraimentencore plus le truc.
00:36:34 :Et j'avais fait un trucassez énervé.Je l'avais géré directementdans l'admin.Je l'avais interdit,je crois,la suppression.J'ai utilisé ici,comme ça,adminen décoracteurpointregistre.
00:36:53 :Et là,ça va prendre tout son sensce truc.SiteSettings.Et là,j'étais parti surclassesitesettings.On va suivre les conventionsde Django.
00:37:08 :On va utiliseradminpointmodèle admin.On pourra en reparlerune fois la customisationde l'administrationde Django.Hop.Et là,on peut fairedoncaddc'est add permissionpour rajouter.
00:37:24 :Hop.Il est chiant à me...Hop.Attention.Tac.Ah, merde.Ce n'est pas ce que je veux faire.Hop là.Je n'ai pas envie.On va enlever les typespour l'instant.
00:37:38 :Hop là.On va rester simple.OK.Donc là,ce que je faisais,c'est que je faisaisun retour de false.Donc,on ne pouvait pas ajoutersihoppointobjectpointexiste.
00:37:54 :Donc,si j'avais quelque chosequi existe,une instance qui existait,eh bien,je ne pouvais plus mettredans mon...dans l'admin.On ne pouvait plus cliquersur créer.
00:38:06 :OK.Sinon,effectivement,je pouvais créer une instance.S'il n'y en a pas,je peux en créer une.S'il y en a déjà une,en fait,non,c'est false.
00:38:18 :Et j'avais fait encoreautre chose.Et là,j'avais fait undefhopOn ne va pas s'embêterpour l'instantavec tout ce qui estqui passe dessus.
00:38:29 :Voilà.Et ce que j'avais fait,c'est tout simplementun false.OK.Maintenant,je vais retourner dessus.Donc là,qu'est-ce que j'ai fait ?J'ai fait une erreur.
00:38:44 :OK.C'est sur maDelta Permission.Ah,oui,OK.Hop là.J'ai plus à recevoirle...Voilà.L'objet.Du coup,ici,je pouvais justemaintenant,en fait,ce qu'il y a,je ne peux plusajouter l'instance,vous voyez.
00:39:17 :Ce n'est plus possible.On peut juste accéderà l'instance qui existe.Et c'est le butde mon singleton,en fait,ici.Et ici,je ne peux pas le supprimer.
00:39:26 :Il n'y a plus le bouton supprimer.Et ici,il n'y a plus le bouton ajouterpuisqu'il existe déjà.Bien sûr,s'il était supprimé,ici,il y aurait le bouton ajouter.
00:39:34 :Une fois que c'est ajouté,c'est fini,c'est verrouillé.Je n'ai plus qu'une instanceet après,je peux gérer mes settingsdynamiquement depuis l'administration.Voilà.Excellent.
00:39:43 :Ouais.Merci,sympa.Est-ce que pour tout le monde,ça vaou c'était un peutiré par les cheveux ?C'est bien.C'est bien,c'est bien.
00:39:55 :Ouais,ça va,ça va.Et puis,c'est vraimentsuper, ça.Ouais,en fait,c'est un cas d'utilisationun peu avancé dans Django.Là,vraiment,j'ai fait deux choses.
00:40:12 :J'ai créé le singleton,donc on peut vraiment créer un.Comme ça,on n'a pas à aller se tapertoutes les settingscomme çadans les settings ici.
00:40:19 :Sinon,si on veut les changer à chaque fois,il faudrait revenir dans le code.Si on veut mettre 4,on met 4,ainsi de suite.
00:40:25 :C'est chiant.Et comme ça,les personnes,on avait juste àaller dans l'administrationde notre site Django.Puis,boum,on va faire ça.On est sûr d'avoir qu'une seule instance,donc pas de problème.
00:40:36 :Il n'y a pas de doublons possibles.Et puis,ici,l'admin,en fait,j'en suis vraiment servi,c'est vraiment le petit plus.C'était vraiment pour avoirle bouton ajouter.
00:40:47 :Le bouton ajouters'il n'y avait pas encore l'instance.Et si l'instance est créée,il n'y a plus de bouton à ajouter.Et dans tous les cas,après,j'enlève le bouton à supprimer.
00:40:55 :Comme ça,on peut juste vraimentmodifier,c'est tout.Donc,voilà.C'était vraiment la mise en applicationdu coup,du singletonavec un projet Django.Donc,voilà.
00:41:11 :Ça a été pour tout le monde ?Oui,ça a été.Et,j'ai une petite question.Oui.En fait,je voudrais savoirsi on peut avoir des ressourcessur les designs patterns.
00:41:27 :Alors,oui,j'en ai une super.Alors,attends.J'en ai une super.Alors,je vais quitter ça.Pour l'instant,je vais aller sur monvidéo.Rich FactoringGuru.
00:41:45 :Il est où le chat ?Ok.Merci beaucoup.Sinon,il est quand même simple à lire.Il est assez pédagogique.Ça va.Oui,ça va,ça va.
00:42:12 :D'accord.C'est juste que j'ai pas,j'ai encore mon boulot à côté et tout.Donc,j'ai pas encore eu le temps detout bien regarder comme je voulais,quoi.
00:42:20 :Mais sinon,c'est bien.Quand t'as besoin d'un design pattern,tu peux aller voir là-dessus.Ça t'explique plein de choses.D'accord.Merci.Il y a Baptiste aussiqui a envoyéun message sur le chat.
00:42:34 :J'espère que ça vous a plu,que c'était pas trop...Je me suis dit,bon,c'est un singleton Django.Mais,je pense que ça pourrait vous servirun jour ou l'autre,vraiment.
00:42:47 :La mise en pratique était intéressante.Merci,cool.Puis,je pense que ça peut...Parce qu'en fait,je ne sais plus ce que c'est.Il y a un package Django,une librairie qui existeet qui sert en faità avoir les settings comme çadans l'adminplutôt que dans le fichier settings.
00:43:08 :Mais moi,pour moi,un usage,un singleton me suffisait.Donc,c'était plus simple en fait.Donc,voilà.Écoutez,je ne sais passi il y a d'autres questions.
00:43:21 :Pour moi,c'est OK en tout cas.Et puis,je veux dire,on va refairedu Django AstrayMorphe du coup.OK.Écoutez,il n'y a pas de questions,c'est bon ?
Aucune occurrence trouvée pour « ».