Session du 27 avril 2023 à 20h00
Développement Web & Frameworks
Bases de données
Veille & Discussions
DevOps & Environnement
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
Déployer Django avec Docker et phpMyAdmin
Découvrez comment déployer une application Django avec Docker et Docker Compose, et ajouter phpMyAdmin pour gérer votre base de données facilement.
00:00:00 :Ok, ça démarre et je présente mon écran.Est-ce que vous voyez bien mon écran?Oui.Ok, très bien.Est-ce que vous avez, je ne sais pas si vous avez pu voir, parce que Thibault il avait misen place en partant en vacances un script automatique pour uploader les rediffusions
00:00:37 :sur le mentorat, je ne sais pas si quelqu'un a vu si ça avait bien fonctionné, je n'aipas été voir si la rediff avait bien été uploadée sur la plateforme, je ne sais passi l'un d'entre vous a pu voir.
00:00:52 :Non, je n'ai pas fait gaffe.Non, ce n'est pas grave. Si à l'occasion vous voyez, si vous voyez qu'elle n'est paslà, vous me le dites. Et je me suis mis à PyCharm la dernière fois, c'est toi qui m'en
00:01:05 :a parlé, qui m'a demandé pourquoi je n'étais pas à PyCharm. En fait c'est vraiment top,il y a quand même pas mal de trucs et je pense même que je vais acheter la versionpayante pour faire du Django et du Framework, c'est vraiment cool.
00:01:21 :Tu vois PyCharm, par contre j'en ai parlé avec un Tsel, à Django Meetup, c'est pareilil y en a un qui était anti PyCharm, le mec qui était anti Windows, il disait ouais maisfranchement tu fais trop de trucs à ta place, moi je ne trouve pas, mais il disait que c'est
00:01:36 :trop magique du coup le jour où tu as un problème tu es dans la merde.Ouais c'est ce que je pensais aussi mais en fait c'est tellement, je suis d'accord, jen'aime pas les trucs qui font les trucs à notre place et du coup quand tu ne l'as pas,
00:01:50 :par exemple quand tu es sur un serveur et que tu essayes de manipuler avec en lignede commande, avec nano ou des choses comme ça, c'est vrai que ça manque un peu maisquand tu as des gros projets, franchement ça facilite vachement la vie, il ne fautpas s'en pliser je pense. Après VS Code il est très bien aussi, je pense qu'il fait
00:02:05 :autant de choses, mais je trouvais que là, notamment parce que j'ai, avec les Dockeret les Docker Compose etc, j'utilisais toujours VS Code et là l'assistance sur PyCharm avecles Docker elle est super bien faite aussi.
00:02:21 :Ok, du coup, attendez je vais vous montrer. Alors ça c'est un peu le programme, oh putainje ne sais pas si on voit bien. Ouais et les autres vous voyez bien c'est assez grand,
00:02:50 :pas de soucis Christian pour le retard. Je vais essayer de les zoomer un peu. Donc làc'est un peu le programme ambitieux que je propose. Du coup, ça en fait c'est une étape
00:03:09 :qu'on peut sauter, vous me dites si vous voulez qu'on la saute, je vous montre directement.Après on va faire des petites manipulations, get et post sur les, en fait je vais vousmontrer comment avec Postman, le logiciel, on peut récupérer facilement comment on faitune requête, parce que des fois c'est un peu compliqué à trouver ce type de requête
00:03:27 :là, vous voyez, taper http, l'URL, le point d'interrogation, search, égal 22, des foisje trouve que c'est un peu compliqué alors que Postman il est créé directement pournous et après il n'y a plus qu'à copier le format, donc ça c'était un moyen. Du coup,
00:03:42 :après je montrerai, il y avait une question de Gabriel pour savoir comment on fait pourfiltrer, pour faire des requêtes d'API en disant je veux que cette ID là ou je veuxles IDs qui sont compris dans la liste 1, 2, 3, 4 par exemple, ou 1, 2, 7, 9. Donc je
00:04:02 :viens juste de trouver un truc, c'est pas built-in mais quasiment, donc on va installerles Django filters, donc en fait comme je vous l'ai dit Django REST framework c'estpareil, c'est le même backend que Django donc ils marchent très très bien ensembletous les deux. Bon ça c'est un peu la procédure comment on fait pour l'installer. Et ensuite
00:04:24 :on fera un déploiement avec Django, on utilisera Docker et Docker Compose, et puis si on ale temps, en fait vous avez déjà entendu que quand on fait du déploiement on n'utilisepas le run server, vous savez quand on fait python manage run server, c'est un peu dangereuxparce que c'est un serveur de développement et il gère pas bien la sécurité et les
00:04:51 :fichiers statiques, donc c'est pas recommandé, c'est même quasiment interdit de faire dudéploiement avec le run server. Donc pour ça on utilise Green Unicorn, donc G-Unicorn
00:05:02 :qui est en fait un, ça s'appelle un WSGI, c'est lui qui fait l'interface entre, enfait c'est lui qui transforme les requêtes HTTP, c'est vraiment, faut le voir commeun point d'interface entre une requête HTTP et le langage Python. Parce qu'en fait par
00:05:23 :exemple quand vous installez, quand vous installez, voilà exactement, sur Python Anywhere, enfait il gère ça pour vous automatiquement, il prend votre code et puis il s'occupe detoutes les requêtes HTTP qui vont vers Python Anywhere, c'est G-Unicorn qui les transformeen langage compréhensible par Python et Django. Donc il faut utiliser G-Unicorn pour, quand
00:05:49 :on est en serveur de déploiement en fait, c'est le WSGI, le WSGI exactement. Aprèsvous verrez que G-Unicorn en contrepartie, il ne gère pas les fichiers statiques, doncpour ça on va utiliser WhiteNose, on pourrait utiliser un serveur Nginx, mais bon ça c'estun petit peu compliqué, en fait le serveur Nginx lui il va gérer les fichiers statiques,
00:06:13 :donc il va aller les chercher et les servir, mais on ne va pas le faire là parce que c'estcompliqué, mais en gros moi quand je fais des déploiements avec Django et Django RESTNetwork, j'utilise un serveur Nginx pour s'occuper des fichiers statiques et ça sert aussi deproxy manager, on ne va pas rentrer dans le détail. A mon avis, je ne sais pas si on
00:06:33 :ira jusque là, et puis si on peut on ajoutera grâce à Docker une interface PHP MyAdminet vous verrez qu'on peut gérer comme ça notre base de données via PHP MyAdmin enjuste un URL, donc ça on ne va pas le faire, je pense le déploiement ici le fontaine.
00:06:54 :Voilà, je pense que c'est un gros programme, j'espère qu'on arrivera à en faire un petitpeu, et si ça vous va je vais partir de zéro en fait, comme ça c'est plus simple, je préfèrepartir de zéro comme ça on voit toutes les étapes de Django REST Framework, même si
00:07:11 :je l'ai déjà fait, je trouve que c'est intéressant, ça fait des rappels pour tout le monde. Doncon va l'appeler Project Demo. Ok, donc là on est dans PyCharm, vous connaissez comment
00:07:37 :on fait pour zoomer dans PyCharm? Vous m'excuserez mes petites maladresses sur PyCharm. Voussavez comment… Tu as vu PyCharm, tu as des skins. De quoi? Tu as des petits skins sympas
00:07:52 :sur PyCharm aussi, sur ton telethème. Ah oui, comme sur VS Code, que tu peux changer tescodes etc. Par contre moi je voudrais juste zoomer, je sais pas si vous… ça fait une
00:08:09 :semaine que j'utilise PyCharm et j'ai jamais fait de vidéo encore avec PyCharm, parceque vous ne devez pas bien voir, si j'ouvre le terminal là par exemple, vous ne devezpas bien voir. Non c'est bon, il suffit juste de faire comme ça. Ok, donc là on va commencer
00:08:29 :à faire comme d'habitude, on va faire pip install django, django rest framework. Ok,on y va. Ensuite on va créer notre projet django, django admin start project et là
00:08:59 :on va l'appeler app, donc là ça va être notre application. Ok, ça marche. On va créerdirectement notre première application, donc on va se dire qu'en fait on va faire une applicationqui nous permet de tracer des mesures, j'utilise toujours cet exemple là, mais on va faireça. Donc on va aller dans l'app, ok, python manage start app mesures, ok, et on va directement
00:09:37 :créer notre API. Donc la même chose, API, ok, donc on va aller d'abord dans mesurespour créer, on va créer notre modèle, ok donc ça vous connaissez, arrêtez, oh làlà vous ne devez pas bien voir par contre. Ah c'est bon? Ouais nickel, ok. Dans la
00:10:03 :salle je ne sais pas qui, je connais un peu, j'ai déjà vu toutes les personnes qui sontdans la salle il me semble. Est-ce que vous connaissez tous un petit peu django? Ouais
00:10:17 :ouais, j'ai l'impression que vous connaissez tous un peu django, comment c'est? Ok, trèsbien, c'est parfait. Et puis si jamais vous êtes perdus, n'hésitez pas à m'interrompre,
00:10:28 :pas de soucis. Ok donc on va créer une première modèles.models, on va dire qu'on va mettreune date, donc date mesure, égal models, on va mettre un date time field et on va mettrela valeur de la mesure, vous voyez ça va être un truc assez simple, on va faire un
00:11:00 :models.floatfield, ok, donc on va directement aller l'ajouter dans le settings comme proposé,on ne va pas l'oublier. Donc on l'a appelé mesure, il faut aussi que j'ajoute mon API
00:11:17 :et il faut aussi que j'ajoute Django REST framework parce que ça se comporte un peucomme une application en fait. Donc c'est REST framework comme ceci, ok, là on est
00:11:30 :bon. Ouais Gabriel? Très rapide, le middleware tu les modifies des fois ou? Justement avecWhiteNose tu vas voir on va avoir besoin de le modifier. Ouais ok. Bonne question. Merci.
00:11:45 :Ok donc là on est bon, est-ce que déjà, bon on va déjà tester, et on va créer notreutilisateur aussi. Super, user.Normalement on devrait avoir un truc qui fonctionne. Ouais ok donc ça fonctionne, très bien,
00:13:07 :on va aller voir directement dans admin, ok donc il faut que j'aille ajouter mon applicationdans le admin.Ça me propose pas là le registre, c'est pas grave. Ok donc là on a bien nos datas,
00:13:56 :on est content. Et maintenant on va travailler un peu sur, tu fais, non, je fais pas, c'eststupide. Je sais que c'est pas bien mais je le fais pas. Maintenant on va créer notre
00:14:11 :API, parce qu'en fait, voilà on fait ce qu'on veut, on fait notre API, donc les API il fautd'abord créer un serializer, parce qu'en fait le serializer c'est lui, comme je vousavais déjà expliqué, il transforme notre modèle en JSON, ça veut dire ça serialiseen fait. Donc pour ça on va faire import rest framework, import serializer, on va créer
00:14:46 :notre serializer en fait, donc pour ça on va faire aussi from mesure, donc ici il fautque je passe, je sais pas si vous avez déjà vu, j'ai galéré pendant longtemps, maisen fait il faut faire clic droit sur, quand on crée un projet, faire clic droit, makedirectory as source root, pour qu'en fait ils reconnaissent quand je fais from mesure,
00:15:10 :pour en fait qu'ils reconnaissent les applications qui sont dans mon projet. Ça vous fait çaavec PyCharm? Ah ouais je fais ça à chaque fois, il faut toujours mettre mon root. J'ai
00:15:28 :un petit peu galéré avec PyCharm. Donc on a data, donc ce qu'on va faire maintenant,on crée notre serializer, donc il suffit de l'appeler, c'est le même nom que votre,j'ai vu que le nom du fichier a son importance, lequel nom du fichier? Serializer. Il faut
00:15:46 :l'appeler comme ça forcément? C'est mieux pour t'y retrouver, mais je suis pas sûrqu'il ait une grosse importance. Je t'avoue que j'ai jamais fait le test. Serializer,
00:16:04 :modèle serializer, et donc là en fait on lui définit le modèle qu'il va utiliserpour serialiser, donc c'est juste modèle, donc c'est data, et en fait on lui dit qu'onveut tous les fils, parce qu'en fait on pourrait se dire dans mon modèle je veux pas tout dansmon API. Donc pour ça on lui définit un rôle comme ça, donc là on a fait notre
00:16:31 :serializer, maintenant ce qu'il faut faire c'est nos vues, donc pour ça on va faireun viewset, c'est un peu comme les classes base view, vous savez en Django, là en faiton utilise des viewsets pareils, donc ce qu'on va faire, on va importer from resframeworkimport, c'est hyper classique ce que je fais, quand vous en aurez fait deux ou trois vous
00:16:57 :allez vous prendre ça les yeux fermés. Donc il va nous falloir aussi notre serializer,from serializer import data serializer, class data viewset, on va utiliser viewset.modelviewset,
00:17:20 :et donc là on va dire notre serializer class c'est notre data serializer, et notre queryset,en fait le queryset c'est juste pour lui dire, si vous avez l'habitude avec Django, quandvous utilisez les classes base view, vous devez lui dire où est-ce que tu vas cherchertoutes mes infos, donc là en gros c'est le queryset, le queryset vous lui dites juste
00:17:45 :en fait tu vas chercher dans ma table de base de données data, donc c'est from mesuredot model import data, et donc là on dit data dot objects dot all, ok donc là pourl'instant je pense qu'on est pas mal, on devrait avoir un truc fonctionnel, ah nonil nous manque les urls, parce qu'en fait les urls c'est comme dans une application
00:18:16 :Django, il faut définir les urls. Donc copie, je fais ça, ok, tout ça je m'en fous j'aipas besoin, donc là les urls pour les API c'est un petit peu différent, il faut créerun router, c'est un router, et il va, parce qu'en fait comme on a défini un viewset,
00:18:39 :il faut lui définir automatiquement vous savez la vue qu'on va utiliser pour lister,la vue qu'on va utiliser pour ajouter, donc la vue c'est pour lister toutes les méthodesget, et pour ajouter ça va être la méthode post, donc en fait il faut créer des urlspour ces deux méthodes là, get et post, donc pour ça on va utiliser le router built-in
00:19:03 :de, c'est pas très gros je trouve, ça vous va là, c'est pas grave si, là l'arborescenceelle est pas affichée très gros, mais bon ça vous va là en termes de visualisationsur l'arborescence et tout ça? Ouais ouais c'est bon. Ok. Donc from reframework c'est
00:19:25 :import, non c'est les routers, pardon, router import, défaut de router, donc on créé,on instantile notre router, qui est un défaut de router ici, et on va lui faire un registreur,en fait on va juste enregistrer toutes les routes qui sont dans notre viewset. Ok, donc
00:19:52 :il faut que j'importe mon viewset, use import data viewset, et donc là on va lui dire,registre, attendez j'y réfléchis, si c'est ça, donc là en gros ça va être le préfixequ'on va vouloir, on va lui dire, bon en fait quand dans mon url je tape mesure, je veux
00:20:27 :que tu m'appelles mon viewset. Donc là mon viewset c'est, data viewset, ok, et maintenantil faut que, je pense que ça c'est bon, je clique là dedans, normalement ça devraitêtre, euh, c'est quoi? Ton data viewset, ouais, est-ce que tu pourrais juste revenir
00:21:09 :deux secondes dessus, ouais bien sûr, ouais, et puis de toute façon on va revenir dessuspour ajouter les filteurs etc. Donc il faut juste que je vérifie dans les url que j'ai
00:21:20 :pas fait, je vérifie dans un projet que j'avais déjà, parce que si j'ouvre un autre projetavec PyCharm il va m'embêter je pense. Ah oui, il faut par contre que j'ajoute mon routeur
00:22:03 :dans mes url paternes. Donc ça vous avez l'habitude en fait dans les applications d'yango, pardon,donc là je lui ajoute en fait, là je mets rien parce qu'en fait je veux pas de préfixedevant le mesure, ça je le ferai dans mon url global, et donc là je fais mon include,
00:22:32 :il me faut un include ici, include, et là je lui mets les url de mon routeur que jelui ai enregistré, là on devrait être bon, attendez je vais lire ça, ok et maintenantil suffira juste que j'aille là dedans, non pas dans le settings, dans l'url, et je vais
00:22:59 :lui dire maintenant tu vas me chercher tout ce qui va commencer par API, API comme ça,on va dire que ça va être les url de l'API, url comme ceci. Ouais c'est juste, c'est juste
00:23:22 :Christian, mais en fait j'aime bien mettre une liste comme ça je me garde la possibilitéde pouvoir en ajouter après. Salut Zucrow! Attendez je regarde un peu les trucs sur
00:23:37 :le site. Ok donc là on est, j'ai un problème d'include, ok.Attendez j'ai un problème, ligne 22 dans les url, API, url.Pourquoi il ne fonctionne pas là? Il ne sait pas causer les guillemets?
00:24:51 :Non parce que c'est une application, donc normalement. Mais c'est comme ça normalementque tu ajoutes, en fait ça c'est une app, tu vois ça c'est l'app, mon application quej'ai ajoutée, et normalement tu sais quand t'as des trucs Django, par exemple si je voulaisajouter tous les url de l'application mesure, j'aurais mis comme ça entre parenthèses,
00:25:26 :normalement c'est comme ça que ça fonctionne. Je connais pas du tout, c'est juste parcequ'il y avait une différence avec celui-ci. Ah non mais merci, ça aurait pu être ça,
00:25:32 :t'as raison. Ah attend mais si c'est bon, c'est parce que j'avais pas mis la virguleici, donc en gros il comprenait pas que c'était un tuplé je pense. Ah mais non mais j'ai
00:26:01 :fait n'importe quoi, en fait c'est un include qu'il faut faire. Include, n'avait pas desens ce que j'ai mis. Et là normalement c'est bon. Maintenant si je vais, merci pour ton
00:26:24 :aide, si je retourne ici, donc là c'est normal j'ai pas défini de vue pour cette url là,mais maintenant si je vais dans API, qui est la vue que j'ai définie, en fait je me retrouveici, là je suis au niveau de mon routeur en fait. En fait ça c'est mon routeur, c'est
00:26:48 :pour ça que je l'ai définie, vous voyez, défaut basic route view for défaut routeur.Ouais merci The Crow c'était ça. Ok bah j'avais pas vu vos messages mais merci des trucs.
00:26:59 :Donc là je suis dans mon routeur et en fait si je vais vers mon routeur, et bah là enfait j'ai la liste, là c'est la liste, donc c'est ma méthode get de toutes mes entrées,et ici c'est l'url, donc en fait ce qui est pas mal avec Django REST Framework c'est qu'il
00:27:14 :me donne en disposition directement une possibilité de lire et d'ajouter. Donc là j'ai deux possibilités,moi je vais ajouter mes datas, moi je vais ajouter mes datas ici comme vous le feriezavec un projet Django classique, donc là vous voyez je peux choisir ma date et puisje peux choisir le timing et puis là je mets 23 par exemple, donc là j'ai mis une première
00:28:00 :valeur et si ici j'actualise, vous voyez ici il m'a bien, donc il me fait bien, ilme fait bien en fait vous voyez c'est bien, il m'affiche, il me sérialise mes donnéesqui sont enregistrées dans ma base de données, donc ça vous voyez c'est vraiment un objet.
00:28:23 :Et ici, là ce que tu veux dire Christian c'est que t'as pas ce truc là, le truc pourajouter? Bah en fait ça ça vient du, c'est parce que j'ai utilisé un modèle Viewset
00:28:38 :justement, en fait si tu utilises, toi peut-être que t'as utilisé avec le décorate, ok, t'asutilisé quoi comme, attends, je vais aller voir là-dedans, ton modèle Viewset, est-ceque t'as bien utilisé le modèle View, ici, t'as bien utilisé ici le modèle Viewseten héritage? Ok, et t'as juste, pardon ouais vas-y. Le ClosVisette en fait il est
00:29:24 :simulé à cet endroit là du coup. Il est quoi? En fait le ClosVisette je pensaisque t'allais faire une méthode exprès pour le redéfinir, mais en fait non, tu peux,ça en attribue directement en fait. Ouais voilà, dans le Viewset ouais. Mais en gros
00:29:37 :si tu le définis pas, quand tu vas faire, tu sais quand lui il va aller chercher, iciquand il va chercher le, il va t'afficher la liste, bah en fait si t'as pas mis leQuerySet il va pas savoir ce qu'il doit t'afficher. Ok d'accord. Alors toi t'as créé BaseModelViewset
00:29:56 :qui hérite de ModelViewset. Et ton Serializer, t'as bien une classe de Serializer commeon l'a défini avec ici, t'as bien utilisé ModelSerializer. Ok bah si t'as un problème,
00:30:26 :si t'arrives pas à retrouver ça envoie moi sur la question, j'essaierai de regarder.Parce que du coup, ce qui est pas mal, et donc vous voyez que via cette interface là,donc je peux lire directement, mais je peux aussi, vous voyez j'ai aussi le DateSpeaker,je peux aussi mettre des mesures au 22 mai, puis je peux modifier ici, c'était à 20h45,
00:30:52 :et puis je mets 45, je mets post. Ok donc là on est content, ça marche bien parce quemaintenant si je retourne sur ma dataliste, bah j'ai bien mes deux trucs. Ce que je voulais
00:31:06 :vous montrer avec Postman, qui est un logiciel qui permet d'interagir avec des API, c'estque grâce à Postman, en fait vous pouvez avoir une idée de, oh putain là vous devezpas voir grand chose, je sais pas comment on zoom là dessus, zoom in c'est tout letemps pareil. En fait Postman c'est un logiciel externe, il vous permet de définir des requêtes
00:31:35 :d'API. Donc là par exemple, mais je vous l'ai déjà montré je pense, ici je dis j'aicette URL là, et je veux faire une méthode get. Donc là c'est assez simple, si je fais
00:31:45 :get, vous voyez en fait il m'affiche bien les résultats de mon API, et ce qui est coolaussi c'est que je peux lui dire, bah en fait là je l'ai sous forme de JSON, mais je pourraisle vouloir sous forme HTML, sous forme texte, automatique c'est JSON, en XML etc. Donc ça
00:32:05 :c'est assez pratique, et vous pouvez faire pas mal de choses, c'est assez intéressant,c'est un texte que vous pouvez exporter etc. Vous pouvez dire save to file, donc là il
00:32:18 :vous enregistre dans un fichier ResponseJSON directement votre requête, donc c'est intéressant.Et ce que j'aime bien aussi moi c'est que ici quand vous allez voir dans code, il vousaffiche le texte, la requête Python que vous devez faire pour avoir ce résultat là. Donc
00:32:34 :là c'est Python mais vous voyez en fait si on voulait un curl, c'est ce qu'on fait dansle code de commande, par exemple moi je connais rien mais en jQuery par exemple ce seraitcomme ça. Donc moi je le mets toujours sur Python, Python requests, et en fait là vous
00:32:50 :voyez c'est Python requests mais on pourrait faire une Python HTTP client, vous voyez c'estun peu différent, mais bref c'est quand même vachement stylé. Et ce que j'aime bien aussi
00:33:02 :c'est que, imaginez que je veux faire une request post, donc je veux ajouter quelquechose dans ma base de données, en fait je peux aller un peu tricher et demander àPostman de la faire. Donc là par exemple, là je l'ai déjà faite, mais imaginez que
00:33:19 :en gros, donc ça je vais supprimer, je sais pas exactement comment faut que je formatemes datas etc pour faire une requête post parce que c'est un peu chiant, vous voyezj'ai un datetimeformat donc c'est un peu relou à connaître. Et bien vous pouvez dire,
00:33:36 :je vais ici dans le body, je définis ici une requête post, je lui mets cette URL là,et en fait là du coup la clé ça va être, c'était, on avait dit quoi, c'est une datemesure, date mesure et val mesure. Ok donc là en val mesure, ben moi je lui dis, je
00:34:09 :lui dis ben on va prendre ça ici, en fait on va faire comme si naïvement on savaitpas mais bon, si on avait, si on faisait une requête naïve comme ça, et puis làon va mettre 45 et si je fais send, et donc en fait vous voyez il me l'a formaté automatiquement
00:34:31 :et il m'a dit exactement comment il fallait que je formatte en gros ma requête. Doncc'est assez cool, et ce que vous pouvez faire aussi si vous voulez pas utiliser Postman,ici par exemple si je fais une autre requête, je dis une autre requête post et je lui dis
00:34:46 :56 ici et que je fais post, je peux aller voir dans l'URL, ah non il me l'a pas mis,pardon, je pensais qu'il me l'affichait ici dans l'URL ce qu'il m'était, mais voilà.
00:34:55 :Ouais Gabriel? Du coup quand tu fais un post avec Postman, ça va t'enregistrer quelquechose dans ta base de données du coup? Ah oui bien sûr, si je vais mettre à jour,
00:35:10 :tu vois toutes les, ça c'est celle que j'ai ajoutée dernièrement, tu vois 56, ça marcheexactement, ça va attaquer la base de données de la même manière. Et là n'importe qui
00:35:22 :peut pas le faire du coup? Bah si, là je suis local host, mais si j'étais sur unserveur avec un IP public et que quelqu'un a accès à cette URL là, bien sûr il peutfaire tout ce qu'il veut, post, get, machin. Donc c'est pour ça qu'après on met des autorisations.
00:35:40 :Une fois je t'avais montré, en fait tu vois là je suis connecté en tant qu'admin, etpuis même ici tu vois dans le headers on a rien parce qu'il n'y a pas d'authentification,mais si on voulait mettre une authentification ici il faudrait mettre, tu vois si par exempledans notre API on réglait une authentification, et bah en fait il faudrait rentrer un username
00:36:04 :et un mot de passe dans le headers ici de la requête, sinon il accepte tout pas quoi.Mais non il n'y a pas de problème de sécurité si tu veux en mettre une. Ok? Ok, merci.
00:36:23 :Je t'en prie. Ok donc maintenant ce que je vous propose c'est qu'on regarde un peu,où est-ce que je l'ai mis? Où est-ce que j'ai foutu mon xcloud? Ah je l'ai perdu.
00:36:53 :J'avais mis tout à l'heure. Le petit programme là. Maintenant on peut ajouter tout ce quiest pour rechercher. En fait vous voyez ici si je tapais cette commande là, normalement
00:37:30 :ça ne devrait pas fonctionner, je reviens ici. Vous voyez ici si par exemple si jevoulais faire une requête et que je vais dire search 22, en fait il ne va pas comprendre,je vais mettre un truc qui existe pour que vous voyez bien que ça marche. Enfin ça ne
00:37:52 :marche pas, c'est normal que ça ne marche pas, parce qu'en fait ici, moi ce que j'aimeraisbien c'est quand je fais une requête de ce type là, et bah en fait il me cherchela valeur 23 et il m'affiche que celle là. Donc en fait pour ça c'est assez simple
00:38:03 :avec Django REST Framework dans le Vue Set, il suffit de lui dire que on veut, Postmanc'est la version D, ouais c'est la version D, mais en fait Postman, ouais Postman jecrois qu'il y a une version invite de commande, mais du coup ça n'a pas d'intérêt jetrouve d'utiliser Postman en version commande, puisque du coup autant se les faire à la
00:38:26 :main, tu vois si ils ne utilisent pas la ligue UI, chacun ses préférences. Alorspour ce qu'on va faire maintenant, c'est on va dire on va mettre un back-end sur larecherche pour faire en sorte qu'on puisse rechercher parmi notre base de données. Donc
00:38:49 :là vous voyez pour l'instant je n'ai pas de bouton qui me permet de filtrer. Et jevais pouvoir l'ajouter tout simplement en faisant du coup c'est restframework.est-ce
00:39:01 :que c'est filters import, ça en fait ça vient directement des filters de Django.Attendez que je vérifie. C'est vraiment, ouais ok donc ça c'est bon, ah oui et c'est
00:39:41 :juste search filter, et donc ici il suffit de lui dire simplement le back-end du filter,donc on va rentrer une liste parce qu'après on va aussi en rentrer d'autres back-endspour permettre de filtrer. Donc là on va lui dire c'est mon search filter, et en fait
00:39:57 :il suffit simplement de lui dire search filter égal, en fait on va lui dire sur quoi onva faire la recherche, parce qu'en fait si on lui dit pas sur quoi on fait la rechercheil ne va pas comprendre. Donc nous on va chercher sur val mesure. Donc maintenant si je retourne
00:40:16 :sur, vous voyez ici je vais mettre à jour, il a pas fonctionné cet abruti, qu'est-cequi manque, search filter, filter back-end, c'est pas search filter c'est search build.
00:40:42 :Maintenant je mets à jour, vous voyez ici que j'ai eu un bouton filters qui est apparu,ici, et en fait maintenant je vais pouvoir aller rentrer une donnée, donc par exemplesi je fais 22, bah 22 il me donne rien parce qu'il a rien trouvé, mais par contre si
00:41:03 :je fais 23, hop il me trouve quelque chose, et ce qui est pas mal c'est que vous voyezici il me met en plus la requête qui me permet de faire la recherche, donc c'est le searchde 23, et il va chercher uniquement sur ce que je lui ai dit de chercher, val mesure.
00:41:18 :Donc si par exemple on avait une API avec des professions, avec des gens en fait desusers avec des professions, et plusieurs users qui ont la profession je sais pas, boulanger,bah on pourrait se dire tu vas me chercher, tu me mets en filter de fields profession,et du coup quand on va faire un research il va aller chercher parmi toutes les professions
00:41:43 :et vous lui dites boulanger.Donc ça c'est pour le search, mais bon là dans notre cas d'étude c'est pas trèsintéressant parce qu'en fait ça veut dire qu'il faut connaître exactement la valeur.
00:41:57 :Moi ce qui m'intéresserait c'est de pouvoir me dire je veux toutes les valeurs qui sontsupérieures à 10 par exemple, ou celles qui sont inférieures à 20.
00:42:04 :Ok donc pour ça on va utiliser un truc un petit peu, ça n'a rien de compliqué, onva utiliser les Django filters.Donc pour ça il faut installer, donc c'est ce que j'avais mis ici, ah mais j'arrêtepas de faire ce truc.
00:42:22 :On va utiliser les Django filters, donc pour ça il faut installer dans les bibliothèquesle Django filters.Donc on va faire ça de suite.Je vais tester pourquoi ça marche pas.
00:42:55 :Comment ça Django filter ça marche ou pas?Ah il n'y a pas de S.Ils ont une belle doc la Django filter.Oui oui en fait c'est la doc de Django Respray More qui est très bien faite.
00:43:44 :Et ensuite qu'est-ce qu'il me faut? Il faut que j'installe, il faut que je mettedans les applications.Attendez je récupère mon, mais pourquoi il disparaît à chaque fois ce truc c'estinfernal.
00:44:07 :Il faut que je le mette aussi dans, Django filter il faut que je l'ajoute ici commeça.C'est dans les settings et je le mets dans le Django filters.
00:44:38 :Ok je relance mon serveur.Et on va se retrouver ici, donc là normalement il n'y a rien qui a changé parce que jen'ai pas défini de filters.
00:44:58 :Donc maintenant on va pouvoir les définir dans notre views.Donc là en fait ici il va falloir aller l'importer, le back-end du Django filtersqu'on vient de créer.
00:45:11 :Donc là ce coup-ci c'est django-filters.respraymore.import et là c'est django-filters-back-end.Ok donc là on l'ajoute, c'est pour ça que vous voyez que j'avais fait une listetout à l'heure.
00:45:29 :Et là maintenant en fait on va lui définir sur quel, un peu comme le search field, surquel paramètre on va vouloir faire nos filtres.
00:45:39 :Donc là c'est du filtersetfields, c'est un peu différent.Et donc là par exemple on va rester sur val-mesure, là c'est un petit peu différent,ce qu'on peut lui dire c'est que, on va dire filterset, en fait là on va lui dire,ça va marcher par dictionnaire, en fait ça va être pareil, si par exemple je lui mettais
00:46:10 :val-mesure, normalement ça devrait marcher de la même manière.Vous voyez ici maintenant j'ai un search et j'ai un filtre mais là mon filtre ila aucun sens parce qu'il a la même fonction que le search, mais ce qu'on peut lui diremaintenant on peut faire un dictionnaire et je vais lui dire en fait sur les val-mesure
00:46:32 :je veux que tu me mettes les fonctions suivantes, donc là on va mettre greater than et lowerthan, donc LTE et GTE.Et donc maintenant si je refresh et que je vais dans filters, vous voyez qu'il m'adirectement mis des nouveaux champs, où en fait il me propose de dire quelle est la
00:46:55 :valeur supérieure que vous voulez, donc là si je fais 10 il va me donner tout cequi est plus grand que 10, donc là 10, 23 et si je fais par exemple 46 normalementou même 40 je vais avoir que les trois dernières.
00:47:08 :Si je fais ici 40, 8, donc là il me donne que les trois dernières et ce qui est pasmal c'est que vous voyez ici il me donne aussi l'URL qu'il faut, donc là il medit val double underscore greater than 40 et comme j'ai pas de lower than il me met
00:47:30 :rien.Et donc là Gabriel tu me vois venir, si je veux en fait maintenant juste, imaginesi j'avais toutes mes valeurs ici, tu veux que les ID 1 et 3 par exemple, on va en ajouterun autre pour que ça soit plus marrant, on va dire 15 et on va mettre 89 et on retourne
00:47:53 :à la liste.Imagine on veut juste 1, 3, 5 et donc pour ça il va suffire de dire maintenant je veuxfiltrer sur l'ID et en fait là on met juste IN et donc si tu retournes dans Django, enfindans notre application, tu as le filter, tu vois il t'a rajouté un ID is in, j'ai
00:48:18 :juste trouvé un petit bug, en fait maintenant si tu vois si je mets 1, on avait dit 1, 3et 5, tu as dit il faut rentrer plusieurs valeurs séparées par une virgule, si je faissubmit il a un petit problème, il suffit juste après tu vois, donc là il m'a juste
00:48:37 :mis le premier et puis en fait tu vois il galère un peu sur le format, il suffit justeici d'aller modifier l'URL et donc là il me sort bien le ID 1, 3, 5.
00:48:50 :Donc je pense qu'il y a juste un petit bug avec le frontend ici du filter filter parcequ'il comprend pas trop j'ai l'impression quand tu mets plusieurs valeurs, à moinsque maintenant là c'est bon il l'a capté, si je mets juste 1, 3, ouais si c'est bonil l'a capté.
00:49:06 :Je pense qu'il y a des petits bugs mais en gros, ouais je t'écoute.Donc le IN en fait que tu as mis dans le code c'est une chose qui est intégrée àREST Framework en fait.
00:49:17 :Bah c'est pas tout à fait intégré à REST Framework parce que t'as vu j'ai dû installerles Django filters là, c'est juste une libre externe mais tu vois c'est quasimentbuilt-in en fait, j'ai rien eu d'autre à faire que…Dans la bibliothèque Django filters en fait c'est ça.
00:49:36 :C'est ça ouais, dans la bibliothèque Django filters, tu vois dans Django filtersil y a carrément un module REST Framework et il y a le backend qui existe et qui estdéjà implémenté.
00:49:45 :Et tu vois ici ton URL, ça doit te faire penser, ça doit vous faire penser un peuà ce qu'on peut faire quand on fait des, vous savez des filters dans les champs, ahouais mais en fait je sais pas si vous voyez bien l'URL, dans les champs de Django des
00:50:04 :fois on a des trucs comme ça, on a le nom de notre paramètre, enfin notre attribut,un double underscore et GTE ou IN ou machin donc là c'est ID IN tu vois.
00:50:14 :Et bien sûr on peut combiner, on peut dire ID IN et valeur supérieure à 40.Là il va me sortir que la troisième.Ah ouais, trop bien, ça va te produire des slots la question ou pas?
00:50:34 :Non en fait la routine elle tourne, mais je peux t'envoyer le code si tu veux.Ouais s'il te plaît si t'as un truc dangereux je vais travailler dessus, je vais voir,essayer de recevoir des trucs comme ça.
00:50:47 :Ouais je peux vous l'envoyer pas de soucis.Ah merci cool.Alors qu'est-ce que j'avais prévu d'autre qu'on peut faire dans le temps imparti,est-ce que ça vous intéresse que je fasse le docker compose, j'ai essayé de le faireen 10 minutes mais du coup je vais bourrine et je vais aller vite je pense.
00:51:15 :Est-ce que ça vous intéresse que je le fasse là rapidement ou est-ce que vous voulez plutôtqu'on discute un peu et qu'on regarde ça calmement la prochaine fois?
00:51:25 :Si vous voulez je peux le faire là rapidement et puis on revient dessus plus calmement laprochaine fois.Ah mince, il y a des réponses différentes du coup.
00:51:46 :Je vous laisse débattre dans le Python Anywhere.Je pense que c'est mieux qu'on regarde ça pour la prochaine fois parce que là sinonje vais vous balancer le truc.
00:52:01 :Ok du coup on voit ça la prochaine fois.Donc question sur Python Anywhere, je ne suis pas un pro de Python Anywhere parce que moije fais mes déploiements sur des VPS type Linode etc mais j'en ai fait un ou deux dedéploiements sur Python Anywhere donc si je peux essayer d'aider.
00:52:31 :Sans trop te prendre la tête, Python Anywhere c'est une bonne solution mais bon moi je t'avoueque je me suis déjà pris pas mal la tête sur Python Anywhere avec la configurationdu WSGI, c'est le seul truc un peu chiant à configurer pour ne pas se tromper dans le
00:53:03 :chemin du dossier etc.Ah merci Gabriel.Mais sinon Python Anywhere c'est très bien pour déployer un projet, c'est assez simpleet puis l'aide elle est pas mal.
00:53:13 :Mais je te dis, du coup t'en es où là Christian, tu l'as déjà déployé ton cruc ou tu vasjuste le faire sur Python Anywhere? Ok donc maintenant ton étape c'est de passer à la
00:53:37 :production et de le mettre sur Python Anywhere.Donc déjà il y a un truc important à faire avant de déployer, c'est de faire, t'as untruc qui s'appelle Python Manage Check Deploy, tu fais ça dans ton projet et en fait ilva te dire, si j'écris comme un plouc ça va pas aller, check deploy et en fait il va
00:54:04 :te sortir, bon c'est un peu, on voit pas bien là, mais il va te sortir tous les problèmesen gros de sécurité que t'as avant de déployer donc il va falloir que tu les résolves unpar un avant de déployer en production.
00:54:17 :C'est pas compliqué mais il y a un petit peu de boulot, tu vois il faut bien que t'aiesdéfini un Hello World Host, tu vois ici il faut bien avoir, il faut bien définir tesHello World Host etc.
00:54:36 :Et en fait tout ça, ça va te donner, attends je vais essayer de te montrer sur un des trucsque j'ai en prod, attends je me cherche un projet, je vais chercher un truc, je vaispouvoir te montrer ça, alors en fait tu vas devoir, tu vois ici en fait j'ai deux types
00:55:15 :d'environnement, j'ai un environnement de développement et un environnement de production.Est-ce que t'as déjà fait ça Christian, mettre toutes tes variables d'environnementde Django dans un fichier.env? Ou est-ce que tout est hard codé dans ton settings
00:55:40 :? Ah bah Christian a quitté la réunion, j'espère que j'ai pas dit quelque chosequ'il fallait pas. Ah, salut Christian t'es revenu? Pas de soucis. En fait tu vois,
00:56:09 :donc je te demandais est-ce que déjà t'as bien mis par exemple secret key dans le Djangosettings, il faut pas le hard coder ici, faut jamais qu'il soit apparent dans le code,donc il faut le définir via une variable d'environnement, est-ce que ça déjà t'asfait dans ton, ok donc tout ça c'est bon. Et en fait, donc là tu vois ce que je disais,
00:56:29 :si je suis en environnement de type production, bah en fait il faut ajouter toutes ces lignesde code là, donc tu vois c'est pas trop compliqué, et donc déjà si t'as ça dans ton settings,tu vas quasiment retirer 90% des messages liés à la sécurité qui sont dans le check
00:56:52 :deploy. Donc tu vois en fait il faut juste que tu lui dises, bah le temps, tu vois çac'est des options de sécurité, bon après je les connais pas toutes par cœur, maisen gros c'est ce que te recommande Django, il faut tout mettre ça à true, faut mettre
00:57:08 :des longueurs de, en gros ça c'est des persistances de cookies etc, donc en gros tu mets toutça et déjà tu fais disparaître pas mal d'avertissements de sécurité. Et après,
00:57:23 :une fois que t'as fait ça, bah ça tu peux les retrouver, ça je crois que c'était,je sais plus où est-ce que j'avais vu ça, j'avais tâtonné je crois et j'avais finalementtrouvé tous ces trucs là, je te les enverrai si tu veux. Donc ça en fait, ça tu peux
00:57:41 :les mettre dans le settings directement, tu vois y'a pas de valeur sensible, c'estjuste que t'emmerdes pas à les mettre quand t'es en développement, mais tu les metsque quand t'es en prod. Donc tu vois tout ça c'est dans mon, là je suis dans mon
00:57:54 :settings.py, donc tu les mets dedans, après bon ça dépend si tu veux gérer dans tonenf, tu peux mettre enf type et tu peux mettre prod par exemple comme ça, ça marchera quequand t'es en prod et quand t'es en développement il va pas t'emmerder. Ok donc voilà tu fais
00:58:14 :ça et puis après bah tu te laisses guider en fait dans Python Anywhere t'as un truc,il va te demander, tu vas dans webapp et là il va te guider, il va te dire tu mets toncode etc, tu mets ton fichier. Je sais pas si t'as déjà regardé, si t'as déjà
00:58:30 :été voir Christian ou si c'est juste ton idée pour l'instant de le déployer. Okbah ce que je te conseille c'est d'aller voir, donc tu te crées un compte Python Anywhere,c'est gratuit, en fait si t'utilises le compte gratuit le seul inconvénient c'estque tu vas par exemple si ton username c'est Christian, bah ton URL pour ton application
00:58:57 :sur Python Anywhere ça sera christian.pythonanywhere.com. Mais c'est pas non plus, c'est pas comme sit'avais un nom hyper bizarre comme URL, c'est juste que t'as Python Anywhere dedans,après si tu veux utiliser un nom de domaine à toi, bah là faudra payer je crois quec'est 5 euros par mois pour avoir un nom de domaine à toi, mais déjà gratuitement
00:59:20 :tu peux déployer ton application facilement comme ça. Donc tu vas sur Python Anywhere,je vais voir si je peux y aller avec mon propre Python Anywhere, bah là je suis sur un truc,donc tu vois tu vas dans web, là j'ai déjà une application mais tu fais add new web
00:59:39 :app, donc là je peux pas parce qu'en fait j'en ai déjà une, mais tu vas ici dansweb et puis tu vas en créer une et puis il va te guider. Donc ce que je te propose
00:59:48 :c'est que tu ailles le faire, parce que là en fait il y a beaucoup de trucs doncje peux pas te dire tout ce qu'il faut faire, mais le plus simple c'est que tu y ailleset puis dès que t'es bloqué tu nous dis, il y a même Gabriel qui a déjà déployé
01:00:00 :un projet donc je demande pas à Gabriel de faire le boulot des mentors mais c'est justesi jamais Gabriel tu veux répondre on n'hésite pas non plus.
01:00:12 :J'en voyais dans le chat, Thibault avait fait une vidéo, ou même des vidéos je crois,et il détaille vraiment toutes les étapes une par une et il fait tout en même tempsen fait et ça m'avait beaucoup servi. Dans Python Anywhere?
01:00:28 :Ouais regarde j'ai mis un lien dans le chat. Ah ok, super.Et après j'avais fini avec toi parce que j'avais, tu sais il y a des petits trucsque j'avais pas fait et du coup tu m'avais aidé, genre tout ce qui est secure, HTTPStout ça. Ouais, ok avec le.env et tout je crois aussi
01:00:45 :on en avait discuté. Ouais c'est ça ouais. J'avais fini un peules finitions avec toi mais sinon dans les vidéos il explique vraiment tout de A àZ. Ouais bah du coup Christian je te conseille
01:00:55 :de suivre ça. Après j'ai vu qu'il y avait une autre questionavant Christian sur Python Anywhere. Ou alors j'y ai rêvé.Et du coup la prochaine fois je vous montrerai comment on fait pour mettre dans un containerDocker et en fait là vous voyez qu'on est en développement donc on travaille avec la
01:01:28 :database SQLite mais du coup je vous montrerai qu'avec le Docker c'est hyper simple de mettreen place un serveur MySQL pour avoir une base de données en fait qui tourne sur unserveur MySQL et je vous montrerai ça et je vous montrerai comment on fait pour connecterle PHP MyAdmin pour administrer facilement votre base de données et voilà donc on reprendra
01:01:49 :ce projet là et puis on fera le Docker, le Docker Compose et le PHP MyAdmin.Vous verrez on va s'éclater. Et on fera aussi, je vous montrerai comment
01:01:59 :on fait le JUnicorn au lieu du RunServer mais c'est tout simple c'est une commande,c'est juste une petite commande quoi. Est-ce qu'il y a des questions, des discussions?
01:02:18 :Juste une petite demande de conseil. Merci.Du coup en mettant ton code, tu fais tout à l'heure et en essayant de trouver un tutosur les Django REST Framework, tu me conseillerais quel genre de tuto parce que j'en ai trouvéun mais je ne sais pas si c'est bien ce genre de truc là.
01:02:40 :Un tuto? Attends je vais aller voir, peut-être que ça se trouve j'ai déjà regardé, ohlà, qu'est-ce que c'est ça? C'est quoi? Attends dis-moi, je vais aller sur YouTube,
01:02:49 :dis-moi ce que c'est. J'ai tapé Django REST Framework françaiset il t'a une grosse playlist de français de vidéos de Donald le Programmeur.Donald le Programmeur, ouais. Attends je vais voir, ça me dit quelque chose,
01:03:04 :Django REST Framework. Celui-là là?Il y a combien de vidéos dessus? Ouais c'est ça.Celui-là je ne connais pas. Attends, moi qu'est-ce que j'avais été voir? Est-ce
01:03:19 :qu'il y en a qui me parlent? J'aimais bien Danny Evey, ouais lui il est pas mal.Danny Evey, je l'aime bien, lui il est sympathique. Mais j'avais regardé un peu là-dessus.
01:03:37 :Après qu'est-ce que j'avais? J'ai pas beaucoup regardé de vidéos YouTube là-dessus,c'est surtout des, j'ai surtout regardé la doc et puis voilà c'est surtout ça ouais.
01:03:51 :Parce que là en fait toutes ces vidéos là YouTube elles me parlent pas trop. C'estsurtout la doc et puis en fait tu verras que c'est tellement proche de Django que tu n'aspas besoin d'apprendre énormément de choses de nouveau tu vois. Il faut comprendre le
01:04:08 :concept de Serializer etc. mais une fois que tu as compris ça, t'as pas beaucoup de chosesen plus. Je trouve que t'as pas énormément de choses, de concepts en plus que Django.
01:04:17 :Mais du coup ce que je te conseille de faire c'est, bah je sais pas déjà si t'as regardéun peu les articles que j'avais fait, j'ai pas du tout la prétention de dire que c'estbien mais c'est vraiment juste pour la base le Serializer et après ce que je te conseille
01:04:31 :c'est de prendre ton projet concert et de faire l'API là-dessus tu vois. Je sais pastu vois avec ce qu'on a vu là, avec les filters etc. je pense que ça te donne un
01:04:42 :peu de grain à moudre parce qu'en fait tu pourrais te dire bah en fait là j'ai unevue qui me donne, pourquoi il marche plus, il est plus en train de renaître, tu pourraiste dire bah en fait... c'est bizarre pourquoi il marche plus. Bon bref. Je vais me faire
01:05:24 :un petit coup de main. Quelqu'un voit pourquoi il pourrait ne plus fonctionner? Bon je saispas c'est bizarre. Je sais pas ce qui m'a foutu. Ah mais j'ai changé quelque chose ici.
01:05:55 :Pendant que j'étais en train de vous montrer. Je sais pas pourquoi il marche plus. Maisen gros tu pourrais te dire bah en fait... c'est quoi ça? Ouais ça pour commencer
01:06:16 :bon tu vois en fait je suis juste parti d'un modèle classique Django. En fait là c'estpar écrit ce que j'ai fait. Ah non c'est un peu différent parce que ici tu vois j'ai
01:06:29 :pas utilisé les view sets, les classes view sets, j'ai utilisé apiview.get et apiviewpost. En gros c'est un peu l'équivalent des function base view plutôt que des view
01:06:41 :sets. Donc ça permet de voir autre chose. Peut-être faire comme t'as fait là dansla vidéo par les classes pour commencer c'est plus simple? Ouais moi en fait j'ai fait
01:06:51 :l'inverse j'ai commencé par ça et après j'ai fait les classes mais je te conseillede commencer par les classes view sets c'est mieux. C'est plus propre. Je vais t'envoyer
01:06:59 :le code. Ouais s'il te plaît. Pour le boulot en fait. Je vais t'envoyer un paquet je l'aipas mis sur Github je vais t'envoyer le project démo. Bah je vais l'envoyer à tout le monde.
01:07:13 :Mais du coup et après ce que tu peux faire tu prends ton projet de concert et puis tufais une API et puis tu essaies de je sais pas tu t'affiches les concerts tu filtrest'ajoutes une autorisation. Dans mon blog j'avais mis un article qui dit comment on
01:07:28 :fait pour avoir l'autorisation par token ou par username, password. Donc voilà tu peuxdéjà faire ça je pense que ça serait pas mal. Ouais et puis utiliser les listes comme
01:07:39 :t'as fait là le truc qui m'intéressait dans la question juste devant. Ouais. Avecpeut-être différents prix pour m'entraîner à faire ça ou différentes dates ou toutça. Ouais carrément. Ouais bah voilà. Est-ce que d'autres ont des questions? Est-ce que
01:08:00 :ça vous a intéressé les autres? Parce que moi j'ai répondu en gros à une questionde Gabriel mais est-ce que les autres vous en avez vu un intérêt? Ok bon bah bonne
Aucune occurrence trouvée pour « ».