Session du 29 juin 2024 à 19h00
Développement Web & Frameworks
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
Introduction à FastAPI
Session de mentorat et de support dans laquelle vous pouvez venir poser vos questions.
00:00:00 :Je vais vous partager ma petite diapo.Normalement, là, vous devrez bien voir.Si vous le voyez bien, n'hésitez pas à me dire si je dois zoomer un peu plus ou quoi pendant la présentation.
00:00:18 :Des fois, on ne voit pas assez bien sur Meet, donc il ne faut pas hésiter à me dire.Bonsoir Laurent.OK.Du coup, introduction à FastAPI.
00:00:30 :Donc, FastAPI, avant toute chose, c'est quoi ?C'est un framework web, principalement pour du back-end, qui permet de créer des API rapidement.Lorsqu'on va l'utiliser, on va l'utiliser avec les annotations de type.
00:00:47 :Donc, par exemple, on va mettre le nom de notre variable de petits points à son type.Et niveau construction, il s'appuie sur Starlet,qui est quelque chose qui permet de faire fonctionner du back-end en Python pour le serveur web.
00:01:00 :Et il va utiliser Pydantic, qui est aussi une autre bibliothèque,qui va servir à la gestion de validation de données.Vous verrez tout à l'heure dans l'exemple comment on utilise ça.
00:01:09 :Ses avantages, c'est quoi, par exemple, par rapport à un Django ou même un Flask ou ce genre de choses ?C'est qu'ici, on n'est vraiment pas sur de l'interface front-end.
00:01:19 :On est vraiment sur du back-end, sur du déploiement d'API.C'est le but principal.Donc, c'est vraiment rapide à déployer, très simple d'utilisation.Ça fournit une documentation automatique pour votre API à utiliser avec un simple clic,avec Swagger UI, notamment.
00:01:33 :Vous allez voir, c'est super intuitif.Moi, je l'utiliserai souvent et c'est top pour les débutants, je trouve,qui veulent commencer à faire un petit peu de back-end en Python.
00:01:42 :Alors, première chose, du coup, comment l'installer sur sa machine ?Voilà, rien de bien compliqué.Première étape, comme je le recommande à chaque fois,c'est de se faire un petit environnement virtuel avec VN ou avec Picharm,pour ceux qui sont sur Picharm.
00:01:56 :Après, il faut l'activer.Et derrière, il y aura deux packages principaux à installer, voire même trois.C'est du coup la bibliothèque, donc le package FastAPI,et le package Uvicorn, qui va permettre de faire tourner notre serveur.
00:02:11 :C'est un serveur ASGI, donc c'est un serveur qui va gérer les tâches en synchrone.Parce que du coup, FastAPI est compatible au niveau des tâches en synchrone au back-end.
00:02:21 :Et voilà, rien de plus au niveau de l'installation.Et puis, vous pouvez directement commencer avec votre première application.Et du coup, comment faire notre première application ?
00:02:33 :Encore une fois, rien de très compliqué.Je vous ai mis une petite capture d'écran de ce que j'ai fait tout à l'heure.Comment on procède ?
00:02:41 :C'est un petit peu la même image que les autres au niveau de la construction,des routes, etc.C'est un peu pareil qu'un Django ou qu'un Flask, pour ceux qui ont déjà fait.
00:02:49 :On va venir importer le module FastAPI de la bibliothèque.On va venir créer notre app.Donc ici, le nom, c'est app.Je ne sais pas si vous voyez mon curseur.
00:02:58 :N'hésitez pas à me dire si ça pourrait me servir pour la suite.Est-ce que vous voyez mon curseur là autour de app ?Oui ? Ok, super.
00:03:04 :Donc on va venir créer notre app.Nickel, merci Yannick.Avec le nom qu'on veut.Donc là, je vais donner le nom app, tout simplement.Qui va du coup être utile après, derrière, pour définir nos routes, etc.
00:03:15 :Et on va pouvoir tout simplement définir nos routes simplementen appelant le nom de notre application,la méthode dont on souhaite utiliser,et la route.
00:03:26 :Donc ici, app.get, donc la méthode get.Donc on va récupérer des informations.Sur le Slash, ça va être la route par défaut.Et là, par exemple, on voit que quand on lit la racine,on va avoir un message.
00:03:39 :Salut Doxring, qui va s'afficher sur le navigateur webquand on va arriver sur l'URL de notre serveur Slash, à la racine.Maintenant, on peut aussi aller un petit peu plus loin.
00:03:48 :Par exemple, imaginons que j'ai une base de données avec différents items.Que chaque item a un ID.Et bien, pareil, on peut avoir un get en spécifiant un ID.
00:03:57 :Et à ce moment-là, on va return uniquement les informationsde l'item qu'on a demandé avec le Slash.Donc là, par exemple, si on va sur notre URL,on fait 127.0.1 Slash items Slash 1.
00:04:10 :Ça va nous donner les informations de l'item numéro 1de notre base de données, par exemple.Donc ça, c'est pour le code première application.Rien qu'avec ça, vous avez une première applicationface API qui fonctionne.
00:04:24 :Ensuite, pour la lancer, c'est très simple.C'est du coup avec uvicorn, que je vous ai ditqu'on a installé un petit peu plus tôt.Et comment ça marche ?
00:04:32 :Eh bien, uvicorn, c'est le serveur qu'on utilise.Main, ça va être le nom de notre fichier.Donc en général, avec face API, on appelle main.py,
00:04:39 :le fichier principal qui contient le code.App, c'est le nom de notre app.Donc celui-ci, ça peut être autre chose.Et moi, je précise, je trouve que c'est intéressantparce que l'option est présente.
00:04:50 :C'est d'indiquer le tirer-tirer-reload.Ça permet d'éviter de couper le serveuret de le relancer à chaque fois que vous faites une modification.Le tirer-tirer-reload, il permet qu'à chaque foisque vous allez faire une modification dans votre codeet que vous faites CTRL-S pour sauvegarder,eh bien, ça va reload le serveur automatiquement
00:05:05 :et vous n'avez donc pas besoin de l'arrêter et de le relancer.Donc c'est quand même bien pratique.Après, il y a d'autres paramètres.Vous avez le tirer-tirer-host pour définir l'adresse IPà laquelle vous voulez que votre serveur soit disponible.
00:05:16 :Vous avez le tirer-tirer-port pour définir le port,ce genre de choses.C'est les options principales.Mais rien qu'avec ça, vous avez votre première applicationface API fonctionnelle.
00:05:25 :Est-ce qu'il y a des questions par rapportà ce début d'introduction, à cette première app ?Un peu de simple.Non, ça s'éclaire ?OK, super.
00:05:42 :Eh bien, comme je vous l'ai expliqué juste avant,on va voir du haut un petit peu comment on gèreles routes et les méthodes.Comme je vous l'ai dit, c'est super simplepour définir quelle méthode on veut choisirentre GET, POST, PUT et DELETE.
00:05:56 :Je mets les quatre méthodes principales,il y en a d'autres.Et de définir les paramètres qu'on prendau niveau du chemin de la requête, etc.
00:06:06 :On vient appeler le nom de notre appavec arrobale app.Et derrière, on met le point de la méthodequ'on veut utiliser.Point GET si on veut venir récupérer des informations.
00:06:15 :Point POST si on veut venir publier des informations.Point PUT si on veut venir en modifier.Point DELETE si on veut en supprimer.C'est les quatre méthodes HTTP de base.
00:06:24 :Je pense que tout le monde connaît.Et derrière, vous dites sur quelle routevous voulez que ce soit disponible.Et vous pouvez préciser aussice qu'on appelle entre-crochetsdes paramètres dynamiques.
00:06:37 :Moi, j'appelle ça comme ça.C'est l'utilisateur qui, derrière le slash,va indiquer ce qu'il veut noter là.Comme je disais tout à l'heure, par exemple,par l'ID, ça peut être le numéro de l'article 1,le numéro de l'article 10, etc.
00:06:50 :Deux méthodes différentespeuvent avoir la même URL.La même, c'est donc ça.Comme vous voyez ici, PUT et DELETE sont la même.Parce qu'en fait,en avis, on peut mettre plusieurs méthodes dessus.
00:07:05 :C'est-à-dire qu'on peut venir modifieravec un item, c'est avec son avis,mais on peut venir aussi le supprimer.Par contre, vous ne pouvez pas fairedeux méthodes PUT ou deux méthodes POST différentessur le même chemin ici.
00:07:24 :Parce que sinon, ça va créer un conflit.OK ?Donc, bien limiter à chaque foisun seul PUT et un seul POSTpour un seul truc.
00:07:35 :Par contre, vous pouvez coupler un de chaque, par exemple.OK ?Maintenant, pour la validation des données,comme je disais tout à l'heure,on va utiliser PIDENTIC.
00:07:46 :On l'a installé dans les requirements au début.Je reviens vite fait en arrière.Ici, par exemple, vous pouvez rajouter PIDENTICsi vous êtes amené à vouloir gérer des données.
00:07:57 :Donc, on va l'utiliser un petit peucomme validation des données,un peu comme une base de données, si vous voulez.Et on va définir nos modèles de donnéesqu'on veut utiliser grâce à cette bibliothèque.
00:08:07 :Je ne sais pas s'il y en a certainsqui la connaissent d'entre vous, PIDENTIC ?Vous l'avez peut-être déjà utilisédans votre projet, dans votre cas d'utilisation ?
00:08:17 :Non, du tout ?OK.Non ? OK.C'est aussi utilisé avec Flask.Moi, je l'utilise aussi avec Flask,c'est pas identique, mais c'est assez pratique.
00:08:30 :Voilà, si ça vous intéresse,peut-être que je pourrais aller un peu plus grand,mais là, on va avoir vraiment les bases toutes simples.Donc, FastAPI peut l'utiliserpour définir la validation des données.
00:08:41 :Pour ça, on va utiliser le modèle de base,qui est le BaseModel,et on va venir définir notre donnée comme une classe.C'est-à-dire que, par exemple,on veut qu'un item, un produit,on va venir le définir avec classe,le nom qu'on lui donne,donc là, un item,qui est un...
00:09:02 :On a vu l'héritage il n'y a pas longtemps en PO,c'est une classe qui est héritéede la classe BaseModel de PIDENTIC,qui va pouvoir venir chercherces cours qui étaient.
00:09:10 :Et on va définir, donc,tous les attributs que contiennent notre produit,notre item.Donc là, par exemple, notre produit,on veut qu'il y ait un nom.
00:09:18 :Donc, tout à l'heure,on a dit qu'on utilisait la syntaxe d'annotation de type,donc ici, on va dire que le nom du produit,ça va être une string.
00:09:27 :On va définir son prix avec une valeur float,une valeur arrondie,arrondie à virgule, pardon.Et, donc, qu'on s'appelle,est-ce que le produit est offert ou non,avec une booléane.
00:09:41 :On pourrait, par exemple, mettre,est-ce qu'il est en stock ou non.Enfin, par exemple,available ou in stock,enfin, voilà.Ici, c'est un exemple avec un booléan.
00:09:50 :Et on va dire que,donc, par exemple,de base,on peut définir sa valeur de base.Là, j'ai mis non,c'est une erreur de ma part,j'aurais dû mettre false,autant pour moi.
00:10:00 :Donc, c'est false tout de coup,les booléanes.Et derrière, du coup,quand on fait notre méthode,donc, pause, put, etc.,on va pouvoir dire que,quand on crée un item,vous allez voir tout à l'heureavec l'interface de Swagger Vue 8,on peut définir que notre variable item,son annotation type,
00:10:17 :c'est, donc, un objet de la classe item.Ce qui fait que ça va venir récupérerautomatiquement les propriétésde la classe item.Et vous allez voir tout à l'heureque quand je vais vouloir créer,à l'aide de l'interface,un nouvel item,eh bien, j'aurai directement,après remplir, le nom, le prix,
00:10:35 :et machin,je n'aurai pas besoinde venir donner les paramètres.OK ?Et après, du coup,on ajoute un returnune fois que la requête est validée.
00:10:44 :Est-ce que vous comprenezcomment marchepas une annotation type de base ?En gros, c'est ça, en fait,qui est coupléà l'annotation type de face API.
00:10:55 :Ça marche aussi avec Flask.On vient, du coup,créer une classe pour chaque...Donc là, par exemple,un produit qu'on veut utiliser,qui va être une classequi va être sous-héritéede la classe de basede PIDBaseModel.
00:11:07 :On va venir définir nos attributs.Et en fait, cette classe-là,derrière, on va pouvoir l'utilisercomme annotation typeà la place de string.Vous voyez, ici, je mets item.
00:11:14 :Et ça va dire, en fait,à notre méthode,donc là, notre méthode post,que l'on veut posterquelque chosequi respecte les propriétésde la classe item.
00:11:23 :Donc, ici,il faut que dans notre...ce qu'on envoiedans le body, en fait,de notre requête post,il y ait un nomsous forme string,un prix sous forme un float,et est-ce que le produitest offert au nomsous forme un bool.
00:11:37 :Si ça ne respecte pasces trois critères-là,la requête ne sera pas validée.Oui, ça ressemble beaucoupà un petit ton de base.C'est pour ça que c'est super simple.
00:11:47 :Ça utilise des concepts de base,l'annotation type.Ici, on crée des méthodesqui sont classiques.Derrière, c'est wrappépar FastAPI.Mais, en fait,ce ICIP identiquenous permet d'utiliserde créer, en fait,si tu veux, des...
00:12:03 :Je ne sais pas comment...En fait, c'est que tu feraisdes classes pour chaque choseque tu veux utiliserdans tes requêtes.Par exemple, moi,j'ai là un produit, un item.
00:12:11 :Et ça, tu vas pouvoir l'utiliseren annotation type.Et tu vas, du coup,pouvoir limiter le faitque quand on crée un produit,ça doit respecterles critères de notre classe.
00:12:20 :Donc, ici,ça doit contenir çaet uniquement ça.Oui, Guillaume ?Oui, tu m'entends correctement ?Oui, nickel.Oui.J'ai une petite question.Je suis plus habituéau développement web classique,tu sais, tout ce qui est front-endet javascript.
00:12:35 :Et, du coup,j'utilise souvent ces ODE ou Prisma.Donc, je ne sais passi ça parle à des gens,mais c'est pareil,c'est la validation de données.
00:12:42 :Et, en fait,ma question,c'est par rapportà l'architecturede ton fichier, là,le class item base modèle.Est-ce que...Là, je sais que c'est un exemplepour avoir tout sur la même base.
00:12:51 :Oui.Mais est-ce que tu le metsdans un dossier à part aussi ?Genre, en mode,tu y fais appelpour alléger ton fichier,justement ?
00:12:59 :Oui.Moi, en général,quand je fais un assez gros projet,je mets dans un fichier différenttout ce qui est au niveaudes validations des données.
00:13:05 :OK.Ça marche.Je n'ai pas sous la mainmon exemple de...Ah quoi ?Je dois l'avoir sur GitHub.Je vais essayer de vous montrertrès rapidement.
00:13:13 :Je dois l'avoir sur mon GitHub.Je peux vous donner un exemple.C'est tout flasque,mais c'est le même principe.Alors, attendez.Je vais essayer de vous retrouverça très rapidement.
00:13:20 :Ça te donnera un petit exemple.Et après, je répondrai...Enfin, je te laisserai parlervite fait, Naïr,mais je vais justevous montrer ça d'abord.
00:13:26 :Alors, c'est laquelle ?Ça doit être peut-êtrecelui-là.Oui, ça doit être ça.Tac.Oui.Donc, grosso modo,bon là, je l'ai fait avecPeewee, plus au flasque,mais c'est le même principe.
00:13:36 :Je vais partager mon écranplutôt que partager...Qu'on s'appelle...Tac, tac, tac.Attendez.Hop.Je vais présenterun autre contenu.Je vais présenterun autre contenu.
00:13:46 :Je vais présenterun autre contenu.Je vais présenterun autre contenu.Je vais présenterun autre contenu.Je vais présenterun autre contenu.Je vais présenterun autre contenu.
00:13:56 :Tout l'écran.Hop.Et je vais venir vous mettreça là.OK.Là, tu vois bien ?Ouais.Du coup, là,tu vois que par exemple,donc ça, c'est...
00:14:06 :Celui-là, c'est l'équivalentde mon main.Donc, c'est là où je faismon app, etc.Et derrière, en fait,je vais avoir un modèleSpam API pour mes modèlesde validation de données.
00:14:14 :Donc là, j'utilise Peewee,mais tu vois que c'estglobalement le même principe.On a quelque chosequi est hérité.Je crée la classeet derrière, je metsmes attributs.
00:14:22 :Tu vois, STR, ici,bool, etc.Peewee, il fonctionneavec même encored'autres sous-trucs,mais le principe est le même.Tu crées, en fait,un fichier modèle,par exemple,qui va vraiment gérertous tes modèles de donnéeset tu mets un partet derrière,tu peux l'importerpour l'utiliser.
00:14:38 :OK, ça marche.Donc, tu peux faireune architecture comme ça.Yes.Voilà.Vas-y, Naïr.Bonjour à toi.Bonjour à tout le monde.Je voulais te...
00:14:47 :C'est peut-êtreune question bête,mais est-ce que ça prenden compte aussile global et local ?C'est-à-dire ?Au niveau des variables ?Pour récupérer,par exemple,l'item,je vois que c'est...
00:14:58 :Tu peux le récupéreren bas,dans l'argumentde la définitionde ta...Là, ici ?Oui.Oui.Est-ce que ça prend en comptele global et local ?
00:15:08 :Parce que c'estce que j'avais vudans la formationde Python de base.Est-ce que c'estla même chose ou pas ?C'est un peu différent, là,parce qu'en fait,là, c'est en gros,il faut considérerle local,mais c'est un peudifférent,parce qu'en gros,il faut considérer
00:15:23 :le local comme une classequi peut être utiliséecomme annotation type.C'est un concept un peu...Enfin,ce n'est pas très...Comment dire ?Ce n'est pas trèscohérent à comprendre.
00:15:32 :Voilà,comme si ici,tu mettais que,tu vois,l'item,ce serait une string,tu vois,ou l'item,ce serait une float.Ici,tu dis que item,c'est quelque chosede la classe item.
00:15:45 :Donc,il doit respecterce que tu as noté,ici.Donc,il n'y a pas vraimentd'histoire de variable,parce que c'esthérité d'une classe.Ah,d'accord.
00:15:56 :Tu dis que ta variable,en gros,c'est un objetqui respectecette classe-là.D'accord.Voilà commela programmationorientée objet,où en gros,item,c'est un objetde la classe item.
00:16:09 :Donc,en fait,l'objet que tu vas créer,il va respecterses propriétés-là.En gros,là,c'est la même chose.Ici,automatiquement,ton item,c'est un objetde la classe itemqui respecteses propriétés.
00:16:24 :Et donc,en mode annotation simple.D'accord,merci,c'est gentil,super.Pas de soucis.OK.Donc,tout à l'heure,je vous parlaisde documentation automatique,de Swagger UI,tout ça.
00:16:38 :Donc,FastAPI,en fait,vous génère automatiquementvotre documentationinteractive de votre APIvia deux interfaces différentes.Vous l'avez directementvia le slash docsavec Swagger UI.
00:16:48 :Et vous l'avez aussiavec Redoc.J'ai très peu utilisé Redoc.Je trouve çabeaucoup moins interactif.Personnellement,je conseille FastAPI à 100%.Et quand je vous feraila démo tout à l'heure,je le ferai avec Swagger UI.
00:16:58 :Après,Swagger UI,en plus,vous pouvez aller plus loin.C'est un plein d'utilités.Vous pouvez fairedes Swagger,etc.C'est même utiliséen entreprise.Moi,je l'ai bosséchez Orange avec ça et tout.
00:17:11 :Donc,moi,je vous recommandeSwagger UI à 100%,à 200% même.Et vous verrezqu'en fait,c'est super interactif.Et vous pouvez utiliservotre API super simplement avec.
00:17:21 :Et ça,c'est un des gros avantagesde FastAPI.Quand vous créez votre API,vous avez automatiquementtout votre documentationavec une interface interactivepour l'utilisersans vous embêterà utiliser Postmanou des requêtes CURLou je ne sais pas quoi.
00:17:33 :Là,vous allez juste allersur votre serveur,taper slash docset vous pouvez utiliservotre API.OK.Est-ce qu'il y a des questionssur ces deux dernières chosesavant de passer à la suite ?
00:17:43 :Non,c'est good ?OK.Très bien.Du coup,évidemment,quand vous avezun app,un serveur web,le but à un moment donnéaussi,quand vous avez un projet,c'est de le déployer.
00:17:57 :Une des méthodesles plus simples,c'est avec Docker.Je ne pourrais pasvous faire la démonstrationparce que j'ai désactivéla virtualisationsur cet ordinateur-làpour des raisonsque je ne sais pas.
00:18:07 :Donc,j'ai désactivéla virtualisationsur cet ordinateur-làpour des raisonsde performance.Mais,en gros,je vous ai misun exemplede Dockerfileque vous pouvez utiliserpour votre app.
00:18:20 :Classiquement,pour ceux qui n'ontjamais utiliséle Docker,ils ont le couragede suivre des cours dessus.C'est super utile.Mais voilà,vous importez une imagede Python.
00:18:30 :Moi,je bosse encoresous 3.10.Vous définissezvotre environnementde travaildans votre container.Vous allez copiervos fichiers locaux.Par exemple,ici,vers mon répertoirede travailet de mon container.
00:18:45 :Je lance ma commandepour installermes Requirements.Ici,je vous ai ditque votre Requirement,au minimum,il doit contenirvotre bibliothèqueface API.Unicorn,pour le serveur,n'est pas identiquepour la validation de donnéessi vous l'utilisez.
00:19:00 :Vous copiez égalementtout le restede votre dossier localqui contientvotre main.py,potentiellementvotre model.py,tout votre codevers aussile répertoire de travail.
00:19:10 :Vous rendezvotre port publicpour accéderà l'application.Et après,vous pouvez utiliservos commandesavec la commande ubiquanteque je vous ai présentéetout à l'heurepour lancer le serveurdirectement.
00:19:22 :Une fois que vous avezcréé votre Dockerfile,vous créez l'imageavec Docker Buildet vous lancezavec Docker Run,Docker classique.Ceux qui connaissentDocker,vous n'aurez pastrop de soucisavec ça.
00:19:34 :Sinon,je vous encourageà apprendre Docker.Ça vous serviratôt ou tard.OK.Voilà pour le déploiementavec Docker.Et puis,on va faireune petite démonstrationavec un projetque j'ai fait cet après-midi.
00:19:47 :Au passage,je vous mets le liende la documentation.Je vais vous l'envoyer ausside face APIparce qu'elle esttrès bien fournie.Elle est vraiment complète.
00:19:55 :Donc, si vous avezenvie d'allerun peu plus loin,elle est super bien faite.Et moi,je vais vous présenterun projetque je vous ai faittout à l'heure.
00:20:04 :Je vous ai faitun truc très simple,un projet que je penseque vous avezenvie de faire.C'est un gestionnairede tâches.Comment on appelle ça ?
00:20:12 :Il y a un autre nom.Un peu une to-do listsi vous voulez.Moi,j'appelle çaun gestionnaire de tâches.Mais oui,une to-do listsi vous voulez.
00:20:21 :Donc, voilà.Comme je vous distout à l'heure,on apporte face API.On apporte Paridentic.Moi,j'utilise Typing en pluspour les modèlesde données.
00:20:30 :On apporte aussiUbicornpour lancer le serveur.Ici,moi,je le mets directementdans mon nameparce que ça m'invitede fairecette commande là.
00:20:40 :Je peux le fairedirectement làavec ubicorn.run.Oui,je vais zoomer.Bougez pas.OK.C'est mieux comme ça ?Je vais baisser çacomme ça,on verra bien.
00:20:51 :OK.Je vais reprendre du coup vite fait.Donc,on apporte face API.On apporte Paridenticpour les validationsde données.Moi,j'apporte Typing en plus.
00:21:00 :À la fin,du coup,au lieu de devoir lancerdirectement mon applicationet de la commandeque je vous ai dit tout à l'heure,il y a une autre manièrede faire.
00:21:08 :C'est,donc,vous mettez votreifname="main",vous importez ubicornet en fait,ubicorn a une méthodequi s'appelle runqui permetde le lancer directementà l'intérieur,directement dans votre code.
00:21:20 :Donc,ubicorn.run,la même syntaxe iciet après,vous avez les optionsreload true,je pourrais préciser aussiport égaletc.Et ce qui faitque du coup,je peux lancer mon appjuste en faisant ça.
00:21:33 :Et j'ai mon serveurqui est lancé.Avant de passersur l'autre serveur,je vais repasser un peusur le code.Donc,comme je l'ai montré tout à l'heure,on crée notre app.
00:21:42 :Moi,je l'appelle appqui, du coup,est un objet FastAPI.On crée,donc,notre classe,donc,notre tâchebasée sur BaseModelavec,donc,la validation de donnéesn'est pas identique.
00:21:56 :Dans le mode tâche,je veux qu'elle ait un titre,je veux qu'elle aitune descriptionet un booléenest-ce que la tâcheest complétée ou nonavec par défautje ne l'ai pas complétée.
00:22:05 :J'ai rajouté égalementpour que chaque tâcheait un ID,donc,une auto-incrémentationd'un ID,donc,de 1 à infini.Donc,pour,je crée aussi un,donc,on s'appelleun dictionnairequi va contenirtoutes mes tâches,donc,tâche avec un S,task,et qui va,du coup,contenir dedans,donc,
00:22:28 :deux petits points,chaque objetqui est un objetqui est un objetqui est un objetet donc,chaque objet,enfin,chaque,qu'on s'appelle,donné,il y aura,donc,un int au débutqui sera donc son IDet,donc,qu'on s'appelleun objetde la classe task.
00:22:48 :Et j'initialisemon compteur par défautcomme quoi la première tâcheelle aura comme ID 1,tout simplement.Est-ce que ça va pour çapour l'instant ?
00:22:55 :Après,je vais présenterles méthodes.Ouais,ok.Première méthodeque je vais présenterpremière méthodeque je crée,je veux créer une méthodepour créer une tâche.
00:23:06 :Pour ça,donc,méthode post pour la création,je définis ma route,ici,donc,sur task,voilà,sur les tâches.Je dis que ma tâchepar défaut,donc,c'est quelque chose,donc,de validisation donnéede ma classe task.
00:23:22 :Je viens récupérerma variable globaledans mon compteur,en fait,pour l'IDet,donc,je viens,donc,récupérer ma variable globaledans la listede toutes les tâches.
00:23:34 :J'incrémente mon compteuret je renvoie à l'utilisateurl'ID de la tâche.Ici,je mets "-1",parce que je l'ai incrémentéjuste au-dessus.Donc,pour correspondreà l'ID de la tâchequ'on vient de créer,il faut que je fasse "-1".
00:23:46 :Et après,donc,le contenu de la tâche,donc,il y aura le titre,la description,est-ce qu'elle est complétéeou non.Ensuite,pour récupérer toutes les tâches,là,encore une fois,rien de bien compliqué,je vais utiliser la même URL,ce n'est pas dérangeant,sur task,et je vais return,
00:24:03 :donc,pour chaque,donc,une listequi va contenir,donc,toutes mes tâches.Et donc,pour ça,je vais récupérer,donc,l'ID de ma tâcheet je vais venir,en fait,faire un model.dump.
00:24:18 :Donc,je vais récupérertous les données,en fait,de mon dictionnairetask,donc,avec typing.Donc là,en fait,ça va me les affichersous forme de listeavec l'IDet le contenu de la tâcheavec,donc,titre,descriptionet complété ou pas chaque fois.
00:24:37 :Ensuite,donc,deuxième méthode get,si je veux récupérer,donc,le contenud'une seule tâche précise,ici,donc,je dis à l'utilisateurqu'il peut prévisiter,donc,une,on s'appelle,donc,l'ID de la tâche.
00:24:53 :Donc,l'ID de la tâche,c'est,donc,l'ID de la tâche en faisant,donc,en utilisant la méthode getsur mon dictionnaireavec le task ID.
00:25:02 :S'il n'existe pas,je renvoie une erreur.S'il existe,je retourne à l'utilisateur,pareil,avec la méthode dumpet le task ID.Rien de bien compliqué,c'est du Python de base.
00:25:11 :Et après,je vais implémenter aussideux autres méthodes.La méthode pushpour pouvoir modifier,donc,grosso modo,c'est pareil,c'est un peu pareilque la méthode create.
00:25:21 :C'est juste qu'ici,on n'a pas le compteurpuisque la tâche est déjà créée.Je viens juste la modifieret si elle n'existe pas,je renvoie une erreur.
00:25:29 :Rien de bien compliqué non plus.Et pareil,pour la delete,je viens vérifier si elle existe.Si elle n'existe pas,je renvoie une erreur.Sinon,je la deleteavec son ID,encore une fois.
00:25:40 :L'ID,en fait,permet d'identifier la tâchedans mon dictionnairede toutes les tâches.Et voilà.Et après,je lance mon programme.Est-ce qu'il y a des questionssur le code puravant que je vous montrel'interfaceet comment l'utiliser ?
00:25:53 :Non ?Pas de questions ?Ok, super.Eh bien du coup,écoutez,je vais vous montrerà quoi ça ressemble.On va se rendre du coupsur 127.058000.
00:26:09 :Et du coup,comme je vous l'ai dit tout à l'heure,nous, on va utiliser Swagger.Donc,on se rajoute un petitslash docs derrière.Et on arrive sur l'interface.
00:26:16 :Comme vous voyez,on a déjàtoutes les routesqui sont pré-documentéespar FastAPI avec Swagger.On a aussice qu'on appellenos schémas de données.
00:26:30 :Donc, par exemple,moi, j'utiliseHTTP Validation Erreurde FastAPIpour envoyer une erreurà HTTP.On a notre modèle taskoù ici,on voit par exemplequ'il y auraun titre obligatoire,une description obligatoire,et notre booléen.
00:26:43 :Donc,est-ce que c'est complété ou pasavec une valeur par défautou false ?Donc voilà,ici,on peut retrouvertous nos schémas de données.
00:26:51 :Ce qu'on va faire,c'est du coup,on va commencerpar une petite tâchepour sa méthode post.On va mettreun readout.Et là,vous avez le body.
00:27:00 :En fait,vous pouvez directementremplir et vous voyezque c'est pré-rempliavec le modèle.Et donc là,j'ai juste à venir modifier.Donc par exemple,je vais dire que ma tâcheaujourd'hui,c'est un mentorat d'Oxtring.
00:27:11 :La description,c'est un mentoratsur FastAPI.Et on va direque je ne l'ai pas encore finipuisque le coursn'est pas terminé.Et hop,je vais venir créer ma tâche.
00:27:20 :Je vais aussi me direque j'ai un mentoratd'Oxtringqui n'est toujourspas fait non plus.Hop,et on va venir se créerdeux tâches.
00:27:29 :À chaque fois que je les crée,j'obtiens un retouravec donc ma tâcheet son ID.On a vu tout à l'heureque ça a commencé à 1.
00:27:35 :Là, c'est la deuxièmeque je crée.Donc l'ID, c'est 2.Voilà,vous voyez,c'est super simple d'utilisation.Maintenant,j'ai Get.Pareil,je peux exécuteren un seul boutonet j'obtiens une listecomme je vous ai ditavec toutes mes tâchesavec pour chacunela tâche qu'il a ditet les données à l'intérieur.
00:27:52 :Au cas où,on a oublié la tâchequ'il a dit.Voilà.Maintenant,je peux aussi récupérerune seule tâcheavec donc le task ID.Et là, c'est simple.
00:28:03 :Pareil,comme j'ai préciséque je voulais un task ID,je vais justemettre le numéro,faire Executeet je récupèrece qu'on appelleles donnéesde la tâcheque je viens d'indiquer.
00:28:14 :Tout simplement,c'est super simple d'utilisation.Pareil,grâce à l'ID,je peux venir en modifierune tâche.Donc on va direpar exemple,ma première tâche,je viens la modifier.
00:28:24 :C'est toujours un mentoratd'Outstream.C'est toujourssur FastAPI.Mais par contre,disons que le cours,maintenant,je l'ai terminé.Je vais la passeren complète,en trou.
00:28:35 :J'Execute.Il me ditque c'est le code 200,que ça s'est bien passé.Et derrière,si je viens la re-récupérer,vous voyez que du coup,mon complete est passéà trou.
00:28:44 :Pareil,super simple d'utilisation.Et enfin,du coup,vous avez aussi,moi,vous avez juste à indiquerla tâche.Par exemple,moi,je vais supprimerla deuxième tâche,celle de juillet.
00:28:58 :Hop,je la supprime.Je retourne dans mes quêtes.Je ré-execute.Elle n'y est plus.Voilà.C'est vraimenttopissime,je trouve,quand on débute.Enfin,même pas forcémentquand on débute.
00:29:11 :Même aujourd'huipour des gros projets,quand il n'y a quedu back-end à faireou quand il n'y a que une API,je trouve que c'est super bienà faire.
00:29:18 :C'est super intuitif.Donc,si vous avez été à lautiliser Postman,des requêtes ou quoi,c'est encore utilisé en entreprise.Moi,je l'ai utilisé chez Orange,pour vous dire.
00:29:27 :Et il y a aussid'autres frameworksqui sont baséssur çaen back-end.Par exemple,je prends l'exempledu framework Reflex.Pour ceux qui connaissent,c'est un framework Python aussiqui, en fait,utilise ce FastAPIen back-end.
00:29:40 :Voilàpour la présentationde FastAPI.Est-ce qu'il y a des questions,que ce soit des questions globalesou alors sur la partiesur le back-end.
00:29:47 :Ou alors sur la partiesur ce qu'on s'appellesur l'interfacecomme çade Struggle.Oui,Naïr.C'était pour savoir réellementl'utilité,comment ça s'utilisevraiment en entreprise.
00:29:58 :Parce que là,c'est pour uneto-do list.Mais en entreprise,comment on va l'utiliser,par exemple ?Dès que tu as une API,en fait.
00:30:06 :Dès que j'ai une API,je l'utilise.Dès que tu as une API,tu peux l'utiliser.Dès que tu as une API,tu peux l'utiliser.Dès que tu as une API,tu peux l'utiliser.
00:30:14 :Dès que tu as une API,tu peux l'utiliser.C'est une des nombreuses solutions.Aujourd'hui,rien ne t'empêchede faire ton APIen Flaskou en Django.
00:30:24 :Mais imaginonsque c'est une API.Souvent,en entreprise,le cas le plus...Pour moi,le cas qui va arriverle plus souvent,c'est que tôt ou tard,tu vas devoir faire des testspour un projet.
00:30:35 :Et en général,90% du temps,quand tu fais des tests,tu fais une APIpour faire des tests.Et quand tu fais une APIpour faire des tests,du coup,pour justement testertes différentes routesde ton API,c'est un peu la galèred'utiliser Postmanou d'utiliser Curlou même de développer
00:30:50 :tes propres schémasde testsavec Python,etc.Au lieu de t'embêter,tu utilises Flask API,tu définis toutes tes routespour les testset après,tu as l'interfacepour l'utiliser simplement.
00:31:01 :Par exemple,je donne l'exempleque j'ai fait chez Orange.J'ai développé une APIde testsur un serveurqui a un peu,si vous voulez,un Amazon Servicequi est un peuun servicequi est un peuun servicequi est un serviceà l'Amazon Service,à la AWS,
00:31:17 :à l'Azure,etc.Donc,en gros,vous avez un gros serveurqui permet de faire des VPS,tout ça.Et en fait,mon API,du coup,devait permettre de testerla création d'un VPS,sa suppression,la modification des paramètres,etc.
00:31:32 :Et du coup,tu peux le faireavec Flask API,par exemple.Dès que tu vas avoirdes tests à faire,dès que tu aurasune API à faire,c'est super simple.
00:31:41 :D'accord,merci.Est-ce qu'il y a d'autres questions,que ce soit sur l'interfaceou sur Flask API ?Alors,je ne sais plusqui m'avait demandé,je cours dessus,je crois que c'estWilfried,mais il n'est pas là,ce soir.
00:31:54 :C'est Arcel,je crois.Arcel,peut-être,je ne sais plus.Je sais qu'il y avaitune ou deux personnesqui l'avaient demandé.Après,de toute façon,il sera disponibledans la diffusion.
00:32:06 :J'aurais une questionun peu plus globale.Comment on faitpour avoir la logique,pour pouvoir mieux,pour pouvoir savoirà quel moment on utiliseun defou à quel momenton utiliseun dictionnairepour pouvoir mieuxcomposer notre code ?
00:32:19 :Un defou un dictionnaire ?En gros,pour avoir une logique.Parce que moi,des fois,quand j'arrive sur une page videpour faire mon code,je suis bloqué,je ne sais même pasquoi mettreou quoi fairepour pouvoir faire mon code.
00:32:32 :Ça,après,tout dépendde ton projet.Je ne peux pasfaire des defsdès que tu as une fonctionqui n'existe pas.Je ne peux pasfaire des defsdès que tu as une fonction.
00:32:43 :Tu utilises un def.En général,il faut tout le tempsfaire des fonctions.Une fonction,une utilité.Ça t'évited'avoir un code grouillonoù tu n'as pas de fonctionet tout se marche dessus.
00:32:53 :Tu fais une fonction,une utilité.Dès que tu asune fonctionnalité à faire,dès que tu asquelque chosequi doit faireune utilisation précisequi a un seul but,tu crées une fonctionpour ça.
00:33:04 :De un,ça ne permettrapas que ton codene se mélange pas.Ça permettrade faire de la réalisationplus précise.Ça permettrade faire de la réutilisabilité.
00:33:13 :C'est-à-dire que ta fonction,tu pourras l'utiliserdans d'autres scénariossi tu en as besoin.Par exemple,c'est une fonctionqui permetde faire un calculou d'afficher du texte.
00:33:22 :Tu pourras l'utiliserdans d'autres contextes.Donc ça,après,c'est pour les defs,pour les fonctions,pour l'organisationde ton code.Après,pour les modèles de données,il y a pas malde cours sur Doctrinelà-dessus.
00:33:35 :Ça dépend,pareil,encore une fois,de ton utilisationde ton projet.Il y a des modèlesde donnéesqui vont êtreplus adaptésles uns par rapportà d'autres.
00:33:46 :Par exemple,tu veux stockerdes données,tu veux pouvoirles parcourirassez facilement,retirer des chosesau bout,à la fin,tu vas utiliserdes listes.
00:33:57 :Alors que plutôt,si tu veux allerpouvoir associerpar exempleun paramètre,un non-paramètreà une valeur,par exemple,qu'est-ce que je pourraisdonner comme exemple ?
00:34:07 :Par exemple,tu vois,un numéro de tâcheou contenu de la tâche,dès que tu vasvouloir associerun nom pour ta valeuret le contenude sa valeur,là,tu vas utiliserun dictionnaireet en plus de ça,le dictionnairete pourra,en gros,c'est une clé de valeur,
00:34:24 :ça doit chercherla clé de valeur.Derrière,le dictionnaireva te permettred'aller récupérerla valeur précisepour le nomde la clé de donnée.
00:34:33 :Par exemple,tu as un dictionnairequi contientdes prénomsavec l'âge,tu vas mettreun dictionnaireavec le prénomde toute ta familleet les âges qu'ils ont,tu vas pouvoir,grâce au dictionnaire,tu vas pouvoir diredictionnaire.get
00:34:47 :Thibaultet hop,il va te direque Thibaulta 30 ans.Donc,dès que tu vasrécupérer des données préciseset les associerune clé,une valeurpour pouvoirles récupérercomme tu veux,le dictionnaireva peut-être êtreun peu plus intéressant.
00:35:04 :Je t'inviteà regarderle dossier que j'ai faittout à l'heuresur les hashablesparce qu'il y abeaucoup de casoù il va te falloirdes données hashableset par exemple,les dictionnairesça en estalors que les bitsça en est pas.
00:35:18 :Les hashablessont des typesde données hashableset ça permetde pouvoirles retrouver.Comme elles ontun identifiant unique,pour les parcourir,tu vas pouvoir retrouverchaque valeur précisémentpour faire très simple.
00:35:30 :Après,tout dépendde ton projet.Il fautvraimentutiliserchaque donnéepar rapportà ce quetu veux en faire.Il y a pleinde cas différents.
00:35:42 :Je penseque c'est largementabordé dans laformation Pythonmais je penseque Thibaultprésente un peutous les typesde donnéeset après,il faut que tu essaiesde réfléchirquel type de donnéespeut être plus utiledans ton cas.
00:35:57 :Rien ne t'interditnon plusd'utiliser chaque GPTpour t'aiguillerun petit peu à côté.Tu peux direj'ai un projetcomme ça,j'ai ce typede données là,je veux fairece genre de projet,quel type de donnéestu me conseillesd'utiliserpour telle utilisation ?
00:36:13 :Il ne va pas te faireson code à ta placemais au moins,il va te conseillersur les types de donnéesà utiliseret comme ça,tu seras peut-êtreun peu moins perduet tu arriverasplus facilementà identifierquel type de donnéestu dois utiliserpour quel contexte.
00:36:28 :J'espère que çarépond à ta question.Merci,tu as réponduà la questionde la formation à peu près.J'ai passé les DEF,j'ai passé les DEFINEet je suis arrivéau module.
00:36:38 :Après,n'hésite pas,même en dehorsde la formation de base,sur le site,tu as plein d'articles,etc.Et même,je pense,dans l'appareil de recherche,si tu tapes données,là je suis en trainde regarder,tu as des articlessur les listes,tu as des articlessur les dictionnaires,
00:36:55 :sur les types de donnéesde base en Python,sur les typesde donnéesde base en Python,sur les typesde donnéesde base en Python,je pense que tu asmoyen de pas malde naviguerpour voir un petit peuquel truc tu dois utiliseret dans quelle situation.
00:37:09 :Et ça permettraun petit peude mieux comprendrequand tu dois utiliserdes listes,quand tu dois utiliserdes dictionnaires,etc.D'accord,merci,top,super.
00:37:21 :En arrivant sur ta page,le pseudocode est très utileaussi,ça permet de synthétiseravant le DEF.Quelle page,Guillaume ?Ouais,c'était pour Naïr,c'était vraimentsur son IDE.
00:37:32 :Avant de commencerun DEF dans le dur,le top,c'est comme on ditavant chaque formation,c'est de faire des commentaireset de mettrece que tu veuxdans ta page.
00:37:41 :Donc,par exemple,je veux une liste de tâches,je veux qu'elle fasse çaet autre choseet autre chose.Et comme ça,après,tu as juste à mettrela correspondancedu langage,on va dire françaisou anglais,à le langage Pythonou autre en faitque tu utilises.
00:37:57 :Comme ça,tu seras beaucoupplus clairsur les définitionsou autre.C'est le plus simple.Ouais,très juste.Noter à l'écritun peu tout ce que tu veuxque ton projet fassevraiment précisément.
00:38:09 :Une première foissans terme technique,genre un peucomme un cahier des chargeset derrière,tu peux rajouterdes termes techniqueset comme ça,voilà,chaque GPTou même toi,tu pourras y voirplus clairsur ce que tu dois implémenteret je pensele fait de le noter,
00:38:25 :ça t'aidera plus.C'est quelque choseque je ne fais pas assezd'ailleurs.Très bonne remarque,Guillaume.Un plaisiret en plus,si vous avezGithub Copilot,une fois qu'il a vules commentaires,après c'est pépite.
00:38:38 :Oui.Mais il faut le corrigerpar contre.Il faut faire attention,il faut le corriger.Oui, tout à fait.C'est vrai queje me rends comptequand je le faisqu'il est assez efficacelà-dessus.
00:38:49 :OK, OK.Écoute,merci pour cette intervention,Guillaume.Est-ce qu'il y avaitd'autres questionsque ce soitsur çaou sur FastAppyou n'importe quoi d'autre ?
00:38:59 :Non, pas de questions spécialement.Non, c'est good.Moi,personnellement,je suis un débutantsur les API.En tant que personnequi venaitde l'âge des piresde l'informatique,on n'a pas ça,on n'a pas l'API,le développement web,etc.
00:39:42 :Ce genre de trucs,j'essaye de comprendrecomment ça fonctionne,c'est tout.Ça n'a pas l'airtrès compliqué,en fait.Non, moi,je trouve queles API,c'est vraimenttopissimeparce que c'est un peula grosse portevers le développement websans se bourrer le crâne,sans se compliquer la vie,
00:40:06 :sans se dégoûter,en fait.C'est parce qu'il n'y a pasà s'embêteravec 36 000 frameworksde front-end,de back-end,de 46 000 trucsà installer,etc.
00:40:16 :Un truc comme FastAppy,voilà,si tu as enviede faire des tests,si tu as envied'avoir une petite application,de trucs de tâches,etc.,
00:40:24 :si tu as enviede ne pas t'embêteravec 36 000 trucsdu front-end,back-end,et tout,c'est vraimentsuper simpled'utilisation,etc.Oui, c'est le meilleurmoyen simplepour utiliserton application,soit.
00:40:39 :Oui, voilà,c'est ça.Si tu as envied'avoir une applicationsimple,juste qu'elle soitutile,pas forcémenttrès jolie,utilisée,etc.,juste fonctionnelle,c'est le meilleurmoyen de s'y introduiredans ton travail.
00:40:54 :Et pour le coup,ce n'est même pas forcémentque pour les débutantsou pour les petits projets.Moi, comme je l'ai dit,j'ai fait une grosseAPI chez Orangeavec.
00:41:02 :Donc,vraiment,ça peut êtreutilisé dans pleinde cas différents.Oui,c'est intéressantquand même.Mais,voilà,voilà.Ok, ok.Eh bien,écoutez,s'il n'y a pasd'autres questions,je pense qu'on vapouvoir peut-êtrese laisser làtranquillement.
00:41:22 :Vas-y,Marcel.Je ne sais passi on t'entend pas.Je ne sais passi t'as ton micro coupéou pas.Tu peux parlers'il y a Marcel.
00:41:46 :Je pense qu'on aproblème.Ça ne fonctionne pas,je pense,son micro.Quand je t'ai ditl'autre jourconcernantlalibrairie,ça ne fonctionnepas chez moitout le temps.
00:41:59 :Ah oui ?C'est bizarre,ça.Oui,c'est ce que je t'ai dit.Lorsque j'ai lancé,j'ai passé toute la soiréepour corriger ce problème.Je n'ai pas vu ton messagela soirée,je n'étais pas là.
00:42:10 :Du coup,avec l'aidede ChatGPT.Oui,t'as réussi.Oui,avec désinstaller,réinstaller,essayer cette démarche,installer celle-là.Quand je t'ai montré,c'était la bibliothèqueet l'environnement,c'était,il n'y a rien,que PIP.
00:42:26 :C'est bizarre.Il n'y avait rien dessus,j'ai juste lancé la commande.Quand tu l'as fait,chez toi,ça a fonctionné,chez moi,ça ne fonctionnait pas.
00:42:34 :Essaye PIP 3,parce que moi,j'ai eu le même problèmeque toi,je crois,Valide.D'accord,essaye.C'est un collèguede l'applicationqui m'a donné,il m'a dit de mettrePIP 3et de l'installer.
00:42:48 :C'est ce qu'il m'a ditet ça a marché.Ça a fonctionné.Suivant ton installation de Python,ça peut être changé.PIP 3,ça va...En fait,des fois,PIP,suivant ton installation de Python,il va t'installercomme si c'étaitdu Python 2.
00:43:02 :Et du coup,tu te retrouvesavec des anciens packages obsolètesalors que PIP 3,ça force à utiliserPython 3 et tout.Et pendant ceci,upgrade ton PIP.
00:43:10 :Des fois,tu as un messagequand tu dis...Non,je l'ai fait.Même ceci.C'est pour ça,ça peut être utile.J'ai cru entendre Arcel.
00:43:19 :Je crois que t'as retrouvé ton micro.Ah,j'avais cruavoir ton micros'activer.Sinon,on doit pas réécrire,Arcel.Oui,là,tu m'entends.Ah,ça y est.
00:43:32 :Oui,c'est bon.Oui,en fait,c'était une carte orientée API.Oui.J'ai remarqué souventquedans l'utilisation d'API,on a tendanceà trop écriredu texteou des normes.
00:43:45 :Et du coup,j'aimerais savoirsi c'est possibledese regarderdes images.Des images ?Oui.Alors,techniquement,oui.C'est-à-direque,par exemple,je sais pas,moi,je fais...
00:44:02 :Donc là,si t'imaginesque tu utilisesune vraie base de donnéesavec tonface-to-API,là,par exemple,et que tu veux,je sais pas,moi,un produit,par exemple,tu vas pouvoir,par exemple,comme tout à l'heure,j'ai créé une tâche,tu vas mettre,par exemple,image,et à ce moment-là,
00:44:23 :tu vas mettre le cheminde l'image,par exemple,slash image,slash le nom de ton image.Ça,tu vas pouvoir.Après,tu vas pas pouvoirla visualisersur l'interface.
00:44:34 :Pour ça,il va falloirobligatoirementune interface front-end.Par exemple,quand tu vas fairele get,l'image va pas êtreaffichéeavec Swagger UIpour l'afficher.
00:44:45 :Il faudraun framework front-endpour l'afficher.Mais après,rien ne t'empêchecôté backendde quand mêmeconsidérer l'imagequ'elle soitdans les paramètresde ton produit,etc.,
00:44:57 :mais pour autantqu'elle soit pasaffichéeen utilisantle slash docscomme tout à l'heure,tu vois.Si tu veux vraimentl'afficher,après,ce sera avec du front-end,avec du CSS,tout ça.
00:45:10 :D'accord.Du coup,je devrais avoirla méthode,c'est,en fait,je dois allerde la même manièrepour,bon,disons,la même façondont tu as créél'API.
00:45:25 :Et du coup,je les lisà la base de données,c'est ça ?Oui.Après,là,je n'ai pas abordéle fait,mais tu peux regarderla documentationde Face API.
00:45:37 :Elle est super bien faiteet je pense quetu auras des exemplesdedans pour,du coup,tu pourras,je ne sais rien,tu vois ?
00:45:45 :Et à ce moment-là,tu pourras gérertes images,mais du coup,elles ne seront pasaffichées sur ton interface,mais tu pourras quand mêmeles gérer,quoi.
00:45:54 :Je ne crois pasque j'ai d'exemplessous les yeuxsur ce PC.Je suis en trainde le regarder.Si,j'en ai unetje ne sais pascommentil s'appelle.
00:46:06 :Je ne sais pascommentil s'appelle.Je ne sais pascommentil s'appelle.Je n'ai unettac.Ouais,dans l'essence,en fait,c'est grosso modocomme je te disais.
00:46:20 :Imaginons,là du coup,mon produit,tu veux qu'il ait une image.Par exemple,je vais mettreimage.p pour image produit.En fait,tu vas considérerque c'est unestring,si tu veux.
00:46:32 :Et en fait,ta string,je vais mettre un égal,en gros,ta string va contenirle chemin d'accès à l'image.C'est-à-dire que,par exemple,imaginons que tu asun sous-dossier image,tu vois,et de temps en temps,tu as ton image.
00:46:45 :En gros,tu vas indiquer que ton image,elle va être dans imageslashet je ne sais pas,ton produit,il s'appelle,c'est un vélo,tu vois,tu vas mettre vélo.png.
00:46:55 :Et tu vas pouvoir le stockercomme ça,en fait.Et derrière,avec un framework frontend,en récupérant ce chemin d'accès là,tu vas pouvoir l'afficher.
00:47:02 :Mais du coup,ce qui fait que,quand tu vas utiliser,par exemple,comme je t'ai montré tout à l'heurele docs là,ça ne va pas te l'afficherdirectementvia le docs.
00:47:11 :En gros,tu ne vas pas avoir l'image,tu vas juste voir son chemin d'accèset derrière,il te faudraun framework frontendpour l'afficher.D'accord,c'est assez clair.
00:47:20 :Voilà.En soit,tu n'es même pasobligé à 100%d'utiliser une base de données,tu vois,tu peux le faire en localcomme ça.Si tu restes en local,je pense que ça doit marcher.
00:47:30 :Mais il faut quand même,quoi qu'après,tu laisses stocker.Ah,c'est la TCT.J'ai jamais fait çaen base de donnéescomme ça.J'ai jamais fait çaen base de donnéespour les images.
00:47:41 :Ce serait à tester.Mais,je pense que ça peut peut-êtremarcher comme ça.Mais dans tous les cas,il faut un framework frontendpour l'afficher.
00:47:48 :Parce que tu veux vraimentl'avoir, quoi,sur ton interface.Mais tu peux quand mêmela gérer sans l'avoir.Ça,ça ne m'empêche pas l'autre.D'accord.
00:47:56 :Parce que je fais du Djangoet je me poseun peu de questionslà-dessus.Et je voudrais bienme lancer sur Django REST.Et face à pays,ce n'est pasassez différentd'un pays.
00:48:06 :Donc,c'est pas assez différentnon plus.Non,en soi,face à pays,c'est une API REST.Donc,non,c'est pas si différent.Face à pays,c'est des API RESTque ça produit.
00:48:19 :Donc,non,c'est pas si différent.Tu ne seras passi perdu sur Django.Ça ne doit pas différerà 100% de ça.Comme je disais tout à l'heureque ça,ça ne diffère pas de Flask.
00:48:29 :Moi,je suis un utilisateur de Flask.Je n'utilise pas Django.Mais après,tu peux demander à Gabrielsur Discord,je pense.C'est un petit peule pro Django.
00:48:38 :Et sinon,la formation Django,ça doit être abordé aussi,je pense,dans un projet.Je pense qu'il y a des projetse-commerce,ce genre de choses.
00:48:46 :Donc,s'il y a des produits,il doit y avoir des images.Je pense que tu peuxregarder un petit peucomment c'est fait.Ça devrait pouvoirt'aiguiller sur Djangocomment le faireen API REST.
Aucune occurrence trouvée pour « ».
00:00:30
Définition et avantages de FastAPI
00:01:09
Comparaison avec Django et Flask
00:01:43
Étapes pour installer FastAPI et Uvicorn
00:02:33
Structure de base d’une application FastAPI
00:03:04
Exemple de routes et gestion des requêtes
00:07:38
Introduction à Pydantic
00:08:30
Définition des modèles de données avec Pydantic
00:12:25
Question sur l’architecture des fichiers (Guillaume)
00:14:44
Question sur les variables globales et locales (Nahir)
00:16:24
Génération de documentation interactive
00:17:57
Introduction à Docker et exemple de Dockerfile
00:19:34
Présentation d’un projet de gestionnaire de tâches
00:25:53
Démonstration de l'interface et l'API
00:30:06
Question sur l'utilisation en entreprise de FastAPI (Nahir)
00:32:06
Question sur la logique de programmation (Nahir)
00:37:21
Conseils pour structurer son code (Guillaume)
00:40:54
Discussion générale et conclusion
00:43:32
Question sur la gestion des images dans FastAPI et Django REST (Arcel)