Dashboard de commandes avec Streamlit et DRF
Session du 18 janvier 2024 à 20h00
Développement Web & Frameworks
Bases de données
Deviens membre Premium
Cette session de mentorat est réservée aux membres Premium. Rejoignez-nous pour accéder à toutes les rediffusions des sessions de mentorat !
Premium
- +100h de formations
- +180 exercices de code
- +100h de mentorats en rediffusion
- 20 projets
- Mentorats groupés hebdomadaires
- Support individuel avec nos mentors
Dashboard de commandes avec Streamlit et DRF
Dans la continuité de ce qu'on a fait la semaine dernière:
à partir des data récolté grâce à l'API de notre CRM, on va créer un Dashboard de commande de produits avec Streamlit et avec une API DRF qu'on construira, on rempilera une base de données de commandes.
00:00:00 :Avant de commencer, est-ce que vous avez des questions que vous voulez aborder, n'importelesquelles ? Sur des sujets variés, n'hésitez pas. Gabriel veut faire un sondage qui utilise
00:00:50 :unitest et pytest. Avant j'utilisais unitest, et maintenant j'utilise pytest, et apparemmentil y a beaucoup d'autres qui mettent à pytest. Je pense savoir s'il y en a beaucoup ici,
00:01:07 :ou s'ils vont rester sur unitest. Je ne sais pas les autres, si c'est ce que vous utilisez,moi je n'avoue qu'aucun des deux, mais les autres n'hésitez pas à répondre à Gabriel.
00:01:23 :Nathaniel, pas de soucis, c'est ton premier mentorat, tu débutes en Python, c'est quoiun peu tes attentes, t'es nouveau aussi sur la plateforme, ou que sur les mentorats ? Je
00:01:55 :te laisse répondre dans le chat, et si c'est ton premier mentorat, je ne sais pas s'ily en a d'autres pour qui c'est le premier mentorat, je ne pense pas, à part Nathaniel,je pense que j'ai déjà vu tout le monde. Nathaniel, n'hésite pas. C'est une session
00:02:13 :de mentorat, avec Thibaut on prépare toujours un programme, souvent c'est moi les mentorats,Thibaut il en fait de temps en temps, le samedi ou d'autres jours, et ce qu'on fait pendantles mentorats, c'est qu'on voit des sujets qui ne sont pas forcément évoqués sur la plateforme,on essaye de faire un truc interactif, donc là s'il n'y a pas de questions, moi je déroule un
00:02:58 :peu le programme en essayant de montrer des choses intéressantes, et si vous avez desquestions vous arrêtez, et l'idée à la fin du mentorat, c'est pas de savoir refaire ce qu'on afait pendant le mentorat, parce que des fois on voit des trucs un peu avancés, donc il ne faut
00:03:16 :pas avoir peur, il ne faut pas se laisser impressionner par ce qu'on peut faire en mentorat,l'idée c'est juste de découvrir ensemble, et un jour comme ça, si jamais tu vois ce qu'on a vu,tu te dis ah oui ça j'ai déjà vu, et comme ça c'est pas la première fois que tu le vois,
00:03:28 :et puis c'est un peu plus frais dans ton esprit, et puis c'est un peu le concept des mentorats.Ok, bah désolé Gabriel, je pense que tu ne trouveras personne, j'ai pas l'impression qu'ily a des gens qui font beaucoup d'unitests, donc pas de réponse pour toi aujourd'hui sur ton sondage.
00:03:52 :C'est pas grave. Alors tout d'abord, est-ce que vous avez vu, ouais c'est ça, merci Jean-Philippepour la précision, tu peux retrouver la rediffusion du mentorat sur la plateforme, et puis n'hésitepas à poser des questions, et même soit à moi directement dans le chat, ou à d'autres,enfin il y a des étudiants aussi qui sont avancés et qui peuvent répondre aux questions,
00:04:22 :donc n'hésitez pas à discuter entre vous. Est-ce que vous avez vu le programme,est-ce que ça vous intéresse, est-ce que vous voulez voir autre chose ?
00:04:29 :Ok pour le programme, donc il y a plutôt deux parties, il y aura une partie front-end et unepartie back-end, la partie front-end ça va être fait avec Streamlit, et la partie back-end onla fera avec DRF, Django REST Framework, qui sera en fait une API par-dessus ce qu'on peut faire
00:05:06 :un modèle Django. Donc voilà, et puis on va se servir aussi de ce qu'on a fait la dernière fois,l'API, c'est-à-dire récupérer des datas d'un CRM, donc d'un logiciel dans lequel on gère desfactures, des produits, etc, pour en fait, on va récupérer ces datas, comme datas brutes un peu,
00:05:27 :et on va les incorporer dans une base de données qui nous est propre pour pouvoir gérer un systèmede commandes par exemple. En fait si je résume, où est-ce que je peux écrire, je voudrais dessiner
00:05:43 :quelque part, ok donc en fait nous on va avoir notre CRM, donc le CRM c'est le logiciel,ouais j'ai vu, merci de m'avoir notifié sur Twitter, j'ai vu qu'il y avait quelques mises à jour. Donc
00:06:16 :on a notre CRM dans lequel on a nos factures et nos produits, donc on va dire que ça c'est un peu,si vous êtes freelance ou autant entrepreneur et que vous avez un truc pour gérer vos produits,comme on a vu la dernière fois, donc là vous avez vos produits disponibles à la vente, donc par
00:06:32 :exemple je vends une application Django à 100 euros, je vends une application Streamlit à 70euros, des choses comme ça. Donc ça c'est ce qui fait partie du CRM, voilà. Ensuite avec l'API qui
00:06:46 :est propre au CRM, donc c'était Dolibar qu'on va mettre ici, Dolibar, avec l'API de Dolibar onva récupérer la data, donc on va faire ici, on va faire un truc comme ça, je ne sais pas si ça va être très propre.
00:07:06 :Grâce à l'API en fait on récupère la data, ici la data, data brut, bon désolé pour le schéma il est un peu dégueu,data et donc en fait ça va être là, le Dolibar lui va juste nous donner la liste des produitsdisponibles, donc la liste des produits avec le prix, comme on a vu la dernière fois. Nous ce
00:07:36 :qu'on aimerait c'est carrément gérer un système de commandes où les gens ils ont un formulaire,ils peuvent lister les produits et commander le nombre de produits, par exemple il dit jevoudrais commander deux applications Django à 50 euros, donc ça fera une commande à 100 euros avecdeux applications. Donc on va récupérer la liste des choix disponibles, sur notre dashboard Streamlit
00:07:58 :vous verrez ça va prendre forme, en fait on va dire je veux tant d'applications et on va fairefaire commande par exemple, et une fois qu'on aura cliqué sur commande, ça enverra la commande dansnotre base de données à nous, ce qui nous permettra justement de gérer des commandes et puis même
00:08:21 :d'avoir un historique, par exemple le 30 mai j'ai eu quatre commandes de l'application Django,etc. C'est juste pour mettre un petit peu en pratique ce qu'on peut faire avec Streamlit et
00:08:34 :DRF. Donc ce que je vous propose c'est qu'on commence d'abord par créer l'application, le DRF,l'API REST Framework et après on fera le dashboard avec Streamlit, ça vous va si on fait ça danscet ordre ? Ok donc on va aller dans, on va se créer un dossier, vous voyez assez là ou c'est
00:08:59 :peut-être un peu petit, ça va c'est assez grand là ? Donc là je suis sur mon terminal, je vais làoù je veux créer mon truc, donc moi j'ai ça, Montora, et puis on va se créer un projet MKDIR,on va se dire gestion commande projet. Ok on va aller dans CD, gestion commande projet,
00:09:33 :et puis on ouvre, j'utilise BS Code pour développer mon code. Ok donc le premier truc que je fais,c'est que je crée mon environnement virtuel comme d'habitude. Ok donc je vais le créer,
00:09:53 :python m venge venge, je vais zoomer un peu, ok je l'active, source venge bin activate etj'installe Django pour l'instant et on va utiliser Django et Django REST Framework. Ok on installe
00:10:28 :tout ça dans l'environnement virtuel, pas de soucis. Ce que j'aime bien faire c'est séparerle back-end et le front-end donc on va se dire, on va faire un dossier back-end et on va faire unautre dossier front-end. Ok donc là on va aller dans le back-end et on va créer notre projet
00:10:48 :Django. Donc Django admin start project et donc là on va l'appeler, je sais pas, gestion commande,on va dire gestion commande back-end. Ok et donc là normalement on a notre manège etc. Donc là
00:11:18 :ok on a notre architecture de, bon je vais pas revenir dans le détail de Django, il y a laformation et tout ça, là c'est pas le but. On va créer une première application qui va nous
00:11:30 :permettre, pourquoi il me dit ça lui ?On va se créer une première application qui va nous permettre de définir en faitles produits. Donc on l'a créé. Donc Python manège start app et on va l'appeler commande
00:12:20 :plutôt, ouais on va dire que c'est une commande, non je vais l'appeler produit. Ok et j'aime bienaussi créer, quand je fais des API, je découpe, j'aime bien qu'elles soient séparées donc jecrée aussi une application API. Python manège start app, je l'appelle API, comme ça j'en ai
00:12:49 :deux. J'oublie pas d'aller les ajouter directement dans mon settings ici. Je vais diminuer un peuparce que je ne vois plus rien. Voilà ici dans les applications à installer. Donc on a dit,
00:13:08 :on l'a appelé comment ? On l'a appelé produit et l'autre c'est API bien sûr et ce qu'il ne fautpas oublier aussi d'installer c'est REST Framework parce qu'en fait REST Framework ça se comporte unpeu comme une application pour Django. Voilà on avance. On va faire peut-être, qu'est-ce qu'on
00:13:34 :peut faire maintenant ? Bah on peut aller directement, on va aller dans produit, on vacréer notre modèle. Donc en fait ça le modèle, pour ceux qui ne connaissent pas Django, ça va
00:13:43 :être une classe qui va nous permettre de définir la tête que va avoir notre table dans la base dedonnées de Django. Donc on va utiliser ça et en fait il faut que j'utilise, je ne sais pas si vous
00:13:56 :vous souvenez ce qu'on a fait la dernière fois, il va falloir que je récupère, il faut que monmodèle, en gros il faut que mon produit, il ait la même tête de la manière dont je vais lerécupérer avec le CRM. Voilà je vais ouvrir une nouvelle fenêtre et je vais récupérer. C'était
00:14:16 :la session du 11 janvier, où est-ce qu'on était ? Produits et services. Alors on avait un label,une référence et un prix. Donc on va dire rep, label, price. Ok, produit, tout ça on n'en veut pas,
00:14:40 :référence, un label et un price, ça va être un float et on va mettre la date aussi. Voilà, date field, date time, on vamême mettre, je pense qu'on peut faire ça, date time field, voilà. Vous verrez, peut-être que ça peut
00:15:10 :paraître obscur pour certains mais ça va prendre forme après, je vais vous expliquer une fois qu'onl'aura mis. Donc ça c'est notre modèle qui permet un peu de définir la tête que va avoir notre base
00:15:20 :de données, la table dans la base de données. Ok, donc là pour l'instant je n'ai rien fait,j'ai juste fait, si vous voulez je peux vous montrer ce que ça donne. On va peut-être faire,
00:15:29 :on va appliquer des migrations, on va faire make migrations pour le modèle produit. Ok,et on réapplique les migrations, voilà, et on va se créer un super utilisateur aussi. Ouais,
00:15:52 :la date c'est la date de création ou ça peut être la date de l'achat aussi, il n'y a pas de,j'aurais peut-être pu mettre date achat mais en gros oui c'est ça, c'est date, si tu veux je vaismettre date achat et il va falloir que je refasse mes migrations. Voilà, ça va Gabriel, tu te sens
00:16:14 :mieux ? Oui, là je n'en mets pas parce que je ne veux pas m'embêter, parce qu'en fait si tu metsauto no, tu sais que dans l'interface admin tu ne vas pas le voir apparaître, il s'afficherauniquement une fois que tu l'auras créé etc. Et là je veux qu'on puisse facilement le modifier
00:16:39 :nous-mêmes, donc c'est pour ça que je ne mets pas de auto no. Oui, mais bon en tout cas là on neva pas l'utiliser. Je vais créer un super utilisateur pour pouvoir rentrer dans la
00:17:01 :plateforme admin, create super user, on va l'appeler admin, et je vais mettre un mot de passe bidon,ok, je ne sais plus si j'ai besoin de faire les migrations, non il n'y a pas besoin. Ok,
00:17:22 :python manage run server, ok donc là on a un serveur de développement avec un petit site webqui tourne tout seul, donc pour ceux qui ne connaissent pas, ça c'est vraiment le serveurde développement de Django, il ne se passe rien, et ici si je vais dans admin et que je tape ce que
00:17:41 :j'ai demandé en, voilà, donc forcément je n'ai rien parce que je ne l'ai pas ajouté dans mon admin,admin.site.registerproduits, ok, voilà donc là on a les produits et si on voulait on pourrait
00:18:04 :en ajouter donc la référence, le label et le prix. Mais là en fait ce n'est pas ce qu'on veut faire,ce qu'on veut faire nous c'est remplir automatiquement ces champs-là dans la base dedonnées en fonction des datas qu'on récupère depuis notre CRM avec la date de création. Donc
00:18:22 :pour l'instant on ne va pas, donc ça c'est juste pour vous montrer un peu l'interface,pour monter l'interface admin pour ceux qui ne connaissent pas Django. Donc là pour l'instant,
00:18:33 :on n'a pas fait, pour ceux qui connaissent Django, on a fait quelque chose de Django très simple,on n'a même pas de vue, on a juste créé un modèle dans la base de données. N'hésitez pas à me dire
00:18:46 :dans le chat si vous êtes perdus ou pas, pour ceux qui débutent et qui ne connaissent pas Python,ne soyez pas du tout inquiets, c'est normal si vous êtes complètement largué, c'est des chosesavancées, c'est de la programmation web avec le framework Django, donc vraiment ne vous inquiétezpas, il ne faut pas vous sentir dégoûté avec ça, plutôt même il faut vous sentir encouragé,
00:19:07 :il faut vous dire, ça vous montre ce que vous pourrez faire avec Python plus tard et d'icimême quelques mois. Il y a des étudiants qui progressent très vite et qui en quelques mois
00:19:18 :peuvent faire des super projets avec Django ou avec n'importe quel autre framework. Ensuite,on va aller maintenant dans notre API. Donc en fait l'API, pour ceux qui étaient là la
00:19:31 :dernière fois, c'est ce qui permet de faire le lien entre votre base de données et n'importequel script. Donc on va aller dans notre API et c'est là qu'on va créer notre API à partir
00:19:43 :de notre modèle. Donc on va utiliser REST Framework. Donc pour faire ça, il faut toujourscommencer quand on a une API à créer un fichier qui s'appelle Serializer.py. Donc en fait,
00:19:58 :moi je commence toujours dans cet ordre, comme ça je ne me trompe pas, je commence par monSerializer. Le Serializer en fait, c'est ce qui permet de transformer un objet, une place d'objet
00:20:09 :en modèle JSON. Donc voilà, c'est tout simple. Un modèle JSON, c'est quoi ? C'est un dictionnairequi est lisible par un humain, c'est-à-dire un dictionnaire avec des clés et des valeurs. Et
00:20:19 :en gros, c'est ce que fait le Serializer. Donc pour ça, on va importer depuis REST Framework,on va importer les Serializers et depuis les modèles, on va importer les produits. Le
00:20:37 :modèle produit. OK. On va créer notre Serializer. En fait, le Serializer, c'est juste, on va hériterde Serializer de REST Framework. Ici, on fait de l'héritage. Au lieu d'aller tout coder soi-même,
00:20:56 :on va juste faire de l'héritage sur le modèle Serializer qui existe déjà dans REST Framework eton va lui dire ici que le modèle qu'on veut Serialiser, c'est produit. Donc en gros,
00:21:06 :ce qu'on dit, vraiment grossièrement, c'est qu'on transforme notre objet qui est une instance declasse en un modèle JSON. Vous allez voir après, je vais vous montrer ce que ça veut dire en gros.
00:21:20 :Ensuite, une fois qu'on a créé son Serializer, on va dans les Views. On va forcément aller devoirutiliser le Serializer qu'on a créé. On va devoir aussi utiliser notre produit. Et en fait, ça,
00:21:33 :ça permet de créer les, je ne vais pas utiliser ça. Il nous faut les Viewsets aussi. From RESTFramework, Import, Viewsets. Voilà. Et en fait, ça, ça permet de créer directement les méthodes
00:22:02 :GET, POST, PUT, DELETE, etc. En fait, rien qu'avec ça, je définis dans REST Framework toutes lesméthodes que je veux. Oui, Jean-Phi? Quand tu mets .models, c'est parce que tu prends les,
00:22:21 :là tu es dans le Directory API. Tu vas chercher le modèle qui est en produit, c'est ça? Ah oui,j'ai fait une erreur d'ailleurs. C'est une très bonne remarque. Là, si je fais ça,
00:22:39 :si j'écris From .models Import Produits, ça veut dire que le .models, c'est pour le forcer à allerchercher le module Models.py qui est dans le dossier où je suis actuellement. Mais là,
00:22:54 :vous avez, dans Models, en fait, je n'ai rien. Dans mon API, elle n'est pas là pour définir mesmodèles, elle est là pour définir mes Serializers. Donc en fait, ici, ce que je dois faire, mais
00:23:05 :même là, je me suis trompé. Ce n'est pas dans .models, c'est dans Produits Models. Comme ça.C'est une bonne remarque de Jean-Phi. Produits Models, voilà. C'est comme ça que je dois faire.
00:23:24 :C'est pour ça que, par contre, là, tu vois, dans la View de mon API, je fais bien un .serializerparce que c'est pour le forcer à aller chercher le Serializer de l'API où je suis actuellement.
00:23:38 :C'est clair pour toi, Jean-Phi. Oui, c'est bon, merci. Je t'en prie. Je pensais que c'étaittoi qui avait le micro. Enfin, on entendait le micro, une conversation à propos de repas,
00:24:09 :je pense. Ce n'est pas grave, mais voilà. Si jamais il y a des choses que vous ne voulezpas qu'on en prenne attention au micro activé. Voilà, donc ça, je vous disais, c'est ce qui
00:24:22 :permet de définir les différentes méthodes, get, post, etc. Je vais vous montrer après.Voilà, et une dernière chose qu'il nous reste à faire une fois qu'on a fait ça,qu'on a fait la Views, il faut aller, il faut créer, on n'a pas créé d'URL en fait,on n'a pas de chemin d'accès pour l'instant parce que la puissance d'une API, c'est quoi ? C'est de
00:24:45 :pouvoir faire des requêtes, get, post, etc. depuis un URL. Donc là, il faut forcément qu'on créeles URLs. URL.py, est-ce que je fais un peu, je copie ce qui existe déjà, je n'ai pas envie de
00:25:01 :tout recréer. Donc là, on va voir, on va créer nos URLs d'API. Ça peut paraître obscur, maisencore une fois, après je vais vous montrer le rendu et je vais vous expliquer d'où vientchaque chose. Donc, from REST Framework, import routers, et on va créer un routeur qui va être
00:25:27 :le défaut de routeur et on va aller enregistrer les routes vers les méthodes qu'on a créées. Donclà, vous voyez, on va plutôt faire, from views import, produit viewset. Donc là, ce que je fais,
00:25:48 :c'est que je lui dis, j'associe à l'URL qui commencera par produit, tout ce que j'ai définidans mon viewset produit. Et puis là, on va dire qu'on va lui mettre include routers, et là,
00:26:08 :il ne faut pas oublier d'importer le include. Voilà, et il va nous manquer maintenant justed'aller renseigner dans nos URLs principaux. Il nous suffit. Là, on va dire que tous les
00:26:29 :URLs qui commencent exactement par API, on veut inclure tous les URLs de l'API. Donc là,normalement, on est bon. Normalement, j'ai tout, je pense. Produit, API, ok. Je vais vérifier que
00:26:50 :j'ai bien appliqué. Donc là, c'est bon. Voilà, donc si maintenant, je me retourne ici. Donc là,forcément, il bug parce que j'ai un peu modifié les URLs. Si je vais dans admin, vous voyez que
00:27:06 :j'ai toujours mon site d'administration avec mes produits. Ici, j'en ai zéro. Et maintenant,vous voyez que si je tape API, j'arrive ici sur ce qu'on appelle, là, c'est mon router global. Si
00:27:18 :j'avais d'autres applications que produit, elles s'afficheraient ici. Donc, vous voyez que toutça, je n'ai pas développé. Moi, j'ai juste fait définir les URLs et c'est Django REST Framework
00:27:31 :qui fait tout le reste. Donc là, si je clique dessus, vous voyez ici que j'ai une liste desobjets qui existent dans ma base de données. Donc là, forcément, je n'ai rien. Et ici,
00:27:45 :c'est un moyen pour moi de créer directement des objets. Je vais vous montrer, par exemple,si dans mon interface admin, j'ai ajouté un produit. Donc, je ne sais pas, je mets DRF et
00:27:58 :puis là, j'y mets application API à 20 euros, la date d'achat aujourd'hui, save and continue. Donclà, j'ai ajouté un produit. Si je vais dans ma liste des produits, vous voyez que là,
00:28:15 :je commence à avoir des choses. Donc, la différence qu'il y a entre ça et ça, c'est que ça, je nepeux pas l'interfacer facilement avec un script. Vous voyez ici, si je veux récupérer la liste de
00:28:33 :mes objets, il faut que je clique à la main, etc. dessus. Alors qu'ici, si je rentrais cette URL-làdans un produit, j'aurais accès à tous ces produits-là. Donc là, par exemple, je vais en
00:28:44 :ajouter un autre. Vous allez voir, j'ajoute un autre produit. Donc, Django application à 500euros, toujours today, save and continue. Si je vais voir dans ma liste des produits, donc là,
00:29:01 :j'en ai deux. Et donc typiquement, si je tape cette URL-là dans un, vous me connaissez maintenant,j'utilise beaucoup Postman, dans un script, je pourrais rapidement avoir ces infos-là. Donc là,
00:29:16 :on va créer ici et que je fais bien une méthode get et que j'envoie. Vous voyez ici, j'ai toutesmes infos directement. Donc, c'est vraiment, là, l'API DRF que j'ai construite, qu'on a construit
00:29:30 :ensemble là, c'est un moyen d'interfacer notre base de données depuis un script. Là, vous voyezqu'en fait, il me donne le script qui me permettrait d'obtenir les infos depuis le script. Là, vous
00:29:41 :voyez, si je fais, je vais ouvrir une autre fenêtre. Si j'ouvrais ici une commande, voilà,et que je copie-colle ce qu'il me dit, donc là, vous voyez, voilà, j'ai tout ça, on va mettrejuste, voilà, et que je fais response.json, vous voyez qu'en fait, je récupère un dictionnaire
00:30:05 :avec toutes les infos qui sont dans ma base de données. Oui, Gabriel? J'ai utilisé une foisrequest comme ça, brut, et les payloads, ça va être quoi, par exemple, ici? Yaders aussi,
00:30:20 :en fait, ça dépend. Le Yaders, c'est si jamais on avait voulu mettre des identifiants deconnexion. Tu vois, si par exemple, on avait restreint l'accès aux utilisateurs connectés,
00:30:33 :typiquement, t'aurais mis ta clé d'API ou ton user mode pass dans le Yaders. Le data, c'est sijamais tu veux envoyer des paramètres dans ton API, tu peux les passer par là, si tu veux mettredes paramètres dans ta recherche, par exemple, des filtres ou des trucs comme ça. Ok, merci,
00:30:57 :d'accord. Ouais, je t'en prie. Voilà, donc ça, c'est, on a construit notre API, voilà,on est content, et ce que je voulais vous dire tout à l'heure, c'est que le fait de faire unviewset directement intégré, vous voyez, il crée automatiquement la méthode get,ce qui permet d'avoir les infos, mais aussi la méthode post. Vous voyez, ici, si je mets
00:31:21 :stream unit app et que je lui mets 30 euros et que la date d'achat, je lui mets automatiquementcelle qu'il m'a mis de base, je lui fais post. Donc là, il m'a posté, et si je retourne dans
00:31:35 :la product list, vous voyez qu'il m'a bien posté ce que je veux. Donc, c'est pas mal,en fait, le viewset, il me met automatiquement à jour, enfin, il me met à disposition la méthodeget et la méthode post qui me permet de mettre des objets dans ma base de données, mais il me
00:31:51 :permet aussi de faire du retrieve, c'est-à-dire que, ici, si je mets l'ID, par exemple, là,je vois que j'ai ID 2 dans mon URL, que je mets 2, hop, il va me récupérer directement mon objet,et vous voyez qu'ici, je peux modifier. Donc, là, si je modifie, ça va être la méthode put qui
00:32:13 :va être appelée, parce que je fais une modification et je peux même faire un delete. Donc, j'ai accèsvraiment à pas mal de choses intéressantes directement parce que j'ai fait un viewset.
00:32:26 :Et le viewset, pour rappel, c'est ce qu'on a fait ici, c'est la vue ici, qui fait à partir duserializer. Oui, Sylla ? Vous avez une question ? Allô ? Oui, vous m'entendez ? Bonsoir. Oui,
00:32:48 :oui, bonsoir. Bon retour. Merci. Donc, le viewset, si je comprends bien, il m'envoie toutes lesméthodes liées au product, à l'occurrence, par exemple, que ce soit le get, post, out, delete.
00:33:10 :Dès que je mets le viewset comme ce qu'il y a là, je n'ai plus besoin de genre de recrute method pourfaire le get ou même pour faire le delete. Oui, exactement. Ça, par exemple, attends, je vais
00:33:21 :te montrer. On va demander à chat.gpt. En fait, ça, c'est du class base view. J'ai ce viewset DRF.En fait, nous, on a utilisé le viewset, ici le modèle viewset de DRF qui est déjà implémenté,et si on avait voulu le faire à la main, il aurait fallu faire vraiment des méthodes comme ça,
00:34:10 :tu vois. Tu aurais pu définir une méthode get, post, etc. Tout redéfinir à la main. C'estpossible, mais c'est beaucoup plus simple de le faire comme ça avec un modèle viewset parcequ'en fait, le fait de faire avec un viewset, après, il met à disposition un formulaire, etc. que
00:34:37 :Oui, pas de souci. Voilà, donc là, on a notre API, mais à la base, nous, ce n'est pas ce qu'on veut. On ne veutpas la faire, la remplir à la main. Donc, tout ça, on va supprimer. Ok, donc là, normalement, on n'a plus rien,
00:34:58 :on n'a plus notre base de données, voilà. Donc là, pour moi, on a fini notre back-end. Maintenant,ce qu'on veut, nous, maintenant, c'est retourner au, on va quitter ça, on va faire le front-end. Ok, on va, on va, on va, on va aller dans notre front-end,
00:35:28 :et puis dans le front-end, on va aller créer notre dashboard, dashboard.py. Ok, pour ça, on va utiliser Streamlit.Donc, pip install Streamlit, comme d'habitude. Donc là, il installe.
00:35:47 :Donc là, on va juste dire, bienvenue, bienvenue dans le dashboard, carrément.Ok, et puis, je ne vais pas m'embêter, je vais aller récupérer ce qu'on avait déjà fait la dernière fois, depuis le Dolibar.
00:36:35 :Donc, ça, en fait, c'est, pour ceux qui n'étaient pas là la dernière fois, on va vérifier que ça fonctionne toujours, quand même.Il faut que j'installe Panda, mais je pense qu'en fait, il m'installe Panda automatiquement quand j'installe Streamlit.
00:37:02 :Est-ce que la clé est toujours bonne ? On verra, je vais peut-être devoir la modifier.Je le fais là, sur le côté, sur l'écran, que vous ne voyez pas.
00:37:13 :Il faut juste, en fait, que j'aille chercher ma clé d'API qui me permet de récupérer les informations de mes différents objets disponibles.C'est celle-là, je la mets là, mais vous ne pouvez pas, vous ne pourrez rien faire avec, je la changerai après le cours.
00:37:47 :Donc, c'est pas la peine. Et ouais, juste pour vous montrer, ceux qui n'étaient pas là la dernière fois,en fait, il faut imaginer que, voilà, vous avez, si vous êtes freelance ou quelque chose que vous voulez vendre des produits,des applications ou quoi, vous pouvez, donc là, c'est des trucs un peu bidons que j'ai fait pour l'exemple,
00:38:11 :mais vous définissez différents produits que vous vendez et que, si par exemple, vous voulez les mettre sur votre site web.Donc là, c'est ce qu'on va faire. Donc, vous pouvez imaginer que là, on dit, voilà, j'ai un objet, un outil spécifique sur vos données,
00:38:25 :un dashboard, je le vends 100 euros, etc. Donc, ça, c'est un site web qui permet, c'est comme un site webdans lequel vous pouvez définir vos factures, etc. Là, vous voyez, facturation, paiement, etc.
00:38:41 :C'est ce qu'on appelle un CRM. Et vous définissez les différents objets que vous mettez à la vente.Pourquoi c'est intéressant ? Parce que quand vous faites un devis, vous pouvez aller sélectionner dans votre devis les objets que vous avez en vente.
00:38:55 :Donc, c'est pour ça que c'est bien d'avoir tout au même endroit. Si vous faites un devis pour un client, vous dites,voilà, je te vends un outil spécifique pour tes données à 70 euros. Donc, vous sélectionnez directement.
00:39:06 :Et si vous avez, par exemple, un site Internet qui est externe, vous voulez afficher sur votre site Internet les produits que vous vendezet qui sont disponibles dans votre commande, dans votre liste, dans votre carnet de commandes, en fait.
00:39:22 :Et donc, vous voulez que quand vous ajoutez des nouveaux produits, quand vous changez les prix dans votre outil de gestion,vous voulez que sur votre site Internet, ça se mette à jour. Donc, ça, typiquement, on utilise l'API de Dolibar.
00:39:35 :Ce n'est pas moi qui l'ai créé. Là, j'en ai fait une avec DRF. Mais celle de Dolibar, ce n'est pas moi qui l'ai faite.Ce sont les développeurs de Dolibar. On peut accéder, justement, aux datas qui sont disponibles dans le CRM.
00:40:02 :aux datas parce qu'il faut forcément une clé. Et voilà. Donc, avec juste ces quelques lignes-là, on peut accéder aux datas depuis un scriptsur notre CRM. Donc là, on va juste vérifier que ça fonctionne bien.
00:40:52 :On fait une requête à l'API et voilà, on récupère. Donc, nous, ce qu'on aimerait bien faire maintenant, c'est un dashboard avec ces datas-là.Donc, Streamlit, peut-être que vous connaissez. C'est comment déjà ? Streamlit Run. Dashboard, je ne suis pas dans le front-end. CD front-end.
00:41:33 :qui sera disponible via un URL. Donc là, bienvenue sur mon dashboard carrément. Sur mon dashboard de commandes.Donc là, il faut imaginer que ce soit votre site Internet à vous, dans lequel vous voulez afficher les différents objets que vous vendez.
00:41:50 :Donc, pour ça, nous, ce qu'on va mettre, c'est qu'on va créer une petite liste. On va dire, on pourrait mettre, par exemple,si je mettais directement st.dataframe et que je mettais mon df, là, j'aurais directement les différents trucs qui sont disponibles.
00:42:17 :Vous pouvez dire, par exemple, st.write, voici la liste de mes services. Donc, voici la liste de mes services en dessous.Donc, nous, ce qu'on aimerait bien, c'est proposer un espèce de panier de commandes dans lequel l'utilisateur, il sélectionne parmi ce qu'il a disponibleet il fait une commande. Donc, pour ça, on va se créer, on va dire, on va créer st.write commande et puis ici, on va le mettre en expander.
00:43:10 :Comme ça, on ne va pas le voir afficher tout le temps. With st.expander, mes services. Voilà, comme ça, en fait, liste des services,on ne le voit pas tout le temps affichée, on peut faire comme ça. Donc, commande, on peut dire, qu'est-ce qu'on va dire ?
00:44:23 :Donc, en fait, on va le mettre en deuxième colonne, on va dire st.write votre panier, et là, on va dire st.write panier.Ok, donc là, vous voyez que pour l'instant, le panier, il est vide. Maintenant, ce qu'on va faire, c'est qu'on va permettre à l'utilisateur d'ajouter des choses dans son panier.
00:47:51 :Je vais laisser comme ça.Attendez, je réfléchis à comment. Parce qu'en fait, maintenant, l'idée, ça va être qu'une fois que le user, il aura fait sa commande, et bien ça, on va aller le balancer dans notre base de données.
00:48:46 :Donc on va mettre un bouton maintenant avec le panier.Voilà, on va mettre ifft.commander. Et bien en fait, c'est là où au lieu de faire une méthode GET, on va aller faire une méthode POST où on va aller balancer les datas qu'on a récupérées.
00:49:59 :Pour moi, il suffit, je vais aller là-dessus, si je fais ref djia django application price 200 et que je lui dis OK.Ah oui, parce que mon application, en fait, elle ne tourne pas. Je vais devoir, je vais retourner dans mon backend.
00:51:01 :Donc là, on va voir ce qu'il fait.Si je poste ça, en fait, je vais aller voir dans Postman, ref param, je pense que si on met ici la clé, donc on lui dit la ref, là on lui met la valeur djia,là le label, on lui dit une nouvelle application, pour le price, je lui dis c'est 200 et je pense qu'il n'y a pas besoin d'autre.
00:51:47 :En fait, je veux juste voir un peu la tête qu'il doit avoir.Ah oui, pardon, c'est pas dans les paramètres que je devais le mettre, c'est ici.
00:52:23 :Et le price, je mets 200, si je lui balance ça, pourquoi il me fait ça ?Désolé, j'essaie juste de voir pourquoi la requête de poste ne fonctionne pas.
00:53:06 :Est-ce que peut-être quelqu'un voit le problème ? Pourquoi j'arrive pas à envoyer la data avec ça ?Pourtant, ici, c'est lui qui le fait, là.
00:54:01 :Là, ça a l'air de fonctionner, on va pas s'embêter, on va faire un peu les bourrins, on va faire une URL comme ça.Donc là, il va suffire de récupérer IfButton, on va faire ça comme méthode, on va pas s'embêter, on va faire un request,un poste, ici il suffit de mettre poste, et puis là dans l'URL, on va faire un peu les bourrins,
00:54:42 :mais on va modifier ici, on va le définir ici, URL, et on va se faire, ici pour la ref,vous voyez un peu le délire ou pas ?
00:55:11 :Je fais pareil dans les tests de Django, des fois je mets des strings dans mes URLs comme ça.Ici on va mettre l'URL, et là on va lui mettre ses df, non c'est plutôt,donc ça va être panier, on va le mettre ici parce que sinon ça va être invisible, ref, label, et price,
00:55:53 :et donc là on va mettre panier, serviceSelected, ici ça va être panier, label, et là ça va être panier, price,et on va tout lui envoyer ici, ref, label, et le price.
00:56:14 :Ok, donc là normalement, je vais ouvrir tout ça, je vais peut-être les dégager,on va les supprimer, donc on va supprimer le 4 et le 5, 4 on délette, pour que vous voyez bien qu'en fait,on va bien ajouter des informations dans notre base de données depuis notre dashboard,
00:56:41 :donc là c'est bon, donc là on a rien, je vais le mettre en petit ici, et donc là on va être sur notre dashboard,ok donc on va revenir au début, donc là la liste des services disponibles on est là,on dit qu'on veut outils spécifiques sur données, on veut commander,
00:57:07 :et donc là normalement il a envoyé les datas dans notre, ok ça n'a pas fonctionné, et pourquoi ça ?On va peut-être juste vérifier que l'url est bon, st.writeurl,
00:57:21 :ok je comprends, c'est parce que dans l'url, on ne va pas prendre celui-là, on va prendre,ouais en fait c'est à cause des espaces, il faudrait que dans les urls je gère mieux les espaces,là on va s'en créer un juste pour le fun, on va s'en créer un ici dans les produits,
00:57:56 :sinon on va le modifier, je vais le modifier ici, et je vais dire juste outils spécifiques data,c'est à cause de l'espace en fait, dans l'url il faudrait gérer la manière dont on rentre les espaces,outils spécifiques data, là si je fais commander normalement ça devrait fonctionner,si je vais voir dans l'url, toujours pas, donc qu'est-ce qu'il n'aime pas maintenant ?
00:58:35 :Normalement ici, si je clique là-dessus, ouais c'est parce qu'il faut lui dire,normalement c'est une requête poste, pourquoi il ne veut pas la prendre ?
00:58:53 :Ouais, il faudrait que je règle, parce que je ne vais pas débugger ça là maintenant devant vous,est-ce que vous avez compris le principe où on a ici un dashboard qui nous permet d'afficherles produits qui sont disponibles, et une fois qu'on a sélectionné le produit disponible,lorsqu'on fait commander, il va envoyer les datas récupérées dans notre base de données ici,
00:59:35 :grâce à l'API DRF qu'on a faite, et en plus il va lui définir une date d'achat par défaut,en fait il va prendre celle qui existe, mais pour faire ça il faudrait que je le mette dans mon modèle,dans mon backend ici, c'est dans mon produit, ici comme on a vu tout à l'heure,
01:00:01 :si je mettais un default ou alors un auto no add true, à chaque fois que quelqu'un va commander un objet,il va rajouter automatiquement la date du jour, donc dans notre base de données,chacun des objets avec la date de la commande, et ça permettra un peu de gérer les commandes faites par les utilisateurs.
01:00:35 :Voilà comment on peut gérer un petit peu, comment on peut jouer avec les API,désolé en une heure c'est un peu short de tout faire, si vous voulez on pourra revenir plus en détail la prochaine foiset justement avoir un panier, parce que là j'ai un peu fait le bourrin avec le panier,
01:01:03 :il y a juste un seul élément, mais pouvoir ajouter plusieurs objets dans l'élément,gérer les quantités et l'envoyer directement avec une méthode post,là j'arriverais pas à le débugger en deux minutes, pourquoi la méthode post elle s'envoie pas, mais voilà.
01:01:18 :Là en une session c'était un peu short peut-être pour ceux qui connaissaient pas.Est-ce que dites-moi sincèrement si ça vous intéresse qu'on continue à faire ce genre de choses,ou si vous trouvez qu'on a déjà fait le tour ?
01:01:41 :Je pense que c'est intéressant d'approfondir.Tu voudrais qu'on approfondisse Eric c'est ça ?Oui je pense.Je suis en train de faire un débrief sur l'idée de l'application.
01:02:06 :Excuse-moi Eric, la qualité du micro ça sature un peu, je comprends pas tout,mais ce que je comprends, dis-moi dans les messages si c'est bien ça,c'est que t'aimerais qu'on continue à approfondir ça,et peut-être que ce qu'on a fait là, si j'arrivais à vous le montrer avec un vrai panier,
01:02:28 :qu'il envoie les datas directement dans le...En fait ce que je comptais faire, mais là j'ai un petit bug sur la méthode post,mais si ça vous intéresse je continue.
01:02:40 :Après si vous voulez voir d'autres choses,moi en une seule session c'était un peu trop ambitieux,mais ce que je me disais c'est qu'on pourrait avoir un formulaire dans Streamlitqui permet justement de voir les produits disponibles,de faire des commandes, d'envoyer ça dans la base de données,et après ce qu'on pourrait faire c'est un autre onglet dans le dashboard
01:03:08 :qui permettrait d'afficher toutes les commandes,et qui nous permettrait de faire des calculs sur les commandes,c'est-à-dire filtrer le nombre de commandes qu'on a eues par jour,le maximum, puis faire des graphes un petit peu interactifs via le dashboard.
01:03:21 :C'est un peu à ça que je pensais sur la suite de ce projet, si ça vous intéresse.Oui, en fait oui, typiquement on pourrait facilement récupérer les commandesdirectement depuis Dolibar, mais là l'idée c'était qu'on le fasse nous-mêmespour faire l'exercice, parce qu'en fait l'API Dolibar elle propose déjà
01:03:55 :de récupérer, après avec Dolibar tu peux pas, je sais pas si t'as des formulaires,tu peux pas créer un formulaire en fait où il te dit voilà la liste de mes produitset si tu veux commander, tu vois c'est pas un site de e-commerce en fait.
01:04:11 :Là ce qu'on a fait c'est un peu comme si on définissait des produits dans Dolibaret on créait un site e-commerce depuis une plateforme externe.
01:04:22 :Alors la différence entre Django et Django REST Framework, pour moi il faut pas les comparerl'un à l'autre parce que c'est pas les choses, elles font pas les mêmes choses.
01:04:33 :Django c'est vraiment le framework web qui te permet de faire des applications webavec des pages web etc. Tu vois par exemple, il y en a d'autres, c'est quoi déjà Gabriel
01:04:48 :ton site web ?Oui, j'en ai fait plusieurs, j'ai fait un jeu de rôle et là je suis en train de faireun forum builder.
01:05:00 :Ah oui et c'est quoi l'adresse juste pour que je montre l'exemple ?Je l'ai pas mis en ligne encore.Et ton site web internet, toi c'est Gabriel Trouvé.fr ?
01:05:09 :Oui, c'est Gabriel Trouvé.fr. Il est fait avec Wagtails et Django.Ah ok, mais c'est juste pour montrer un exemple à Sylla qui pose la question.
01:05:23 :Ah oui c'est à cause du W, je pense que ça a pas marché.C'est pareil, c'est une base de Django de toute façon.Oui c'est sûr, mais c'est pour montrer à Sylla.
01:05:33 :Ah Sylla, donc là tu vois typiquement c'est un site web Django de Gabriel qui est dansla communauté d'Oxtreem, je pense que tu connais maintenant.
01:05:41 :Et voilà, Django te permet de faire ça.T'as des URL, tu vois ici, les URL t'emmènent, en fait en back-end des URL c'est quoi ?
01:05:51 :C'est des vues, et les vues elles te disent tu dois renvoyer ce template là, HTML etc.Donc ça c'est du Django.Du Django Red Framework, c'est ce qui permet en fait de, tu vois typiquement,donc là il a un blog, et dans son blog il a une liste d'articles.
01:06:11 :Et donc là si t'es un utilisateur, tu vas cliquer à la main sur chaque article etc.Peut-être que ce qui pourrait être intéressant pour toi Sylla si par exemple tu fais,je sais pas, tu fais des études, tu veux récupérer de la data etc.
01:06:28 :Ce serait d'avoir une API qui te sort la liste de tous les articles disponibles.Donc en fait t'aurais un URL ici, et typiquement tu ferais une méthode get sur cette URL là,et tu récupérerais dans une liste Python tous les articles avec le titre, la section etc.
01:06:47 :Et tu pourrais aller faire, je sais pas, du traitement statistique dedans,de l'intelligence artificielle avec ChartsGPT,où tu dirais fais moi un résumé de chacun des articles.
01:06:57 :Voilà donc typiquement le Django Rest Framework,il te permettrait de faire ça automatiquement,aller chercher chacun des articles avec le contenu, le titre etc.Tu pourrais le faire avec du web scrapping mais comme on l'avait déjà,enfin Thibault il va mettre en ligne une formation sur le scrapping,c'est parfois un peu limite sur le plan éthique, et même parfois légal.
01:07:26 :Donc voilà.Donc Django Rest c'est uniquement pour...Ouais en fait Django Rest c'est du Rest API effectivement, c'est pas...Enfin tu vois là tu peux quand même avoir une interface jolie de produits etc.
01:07:44 :Mais oui c'est pour faire des APIs DRF,c'est pas pour faire des templates HTML etc.Voilà.Pour la prochaine fois si vous voulez,je résoudrai ce problème d'interface entre le dashboard et puis l'API,je ferai un truc fonctionnel avant la session,et après nous on jouera avec les datas qu'on récupérera,
01:08:16 :on fera des graphes, des statistiques,comme ça on fera un peu de data si vous voulez.Si ça vous intéresse, après si vous avez des questions ou d'autres trucs que vous voulez voir.
01:08:31 :Et aussi, on le fera pas tout de suite,mais je prévois dans quelques sessions, peut-être pas maintenant,de vous montrer Apache Airflow.Voilà je fais un petit teasing.
Aucune occurrence trouvée pour « ».
Bravo, tu es prêt à passer à la suite