Cet exercice est destiné à vous familiariser avec la programmation fondamentale du backend / serveur de manière interactive, ainsi que de vous développer à l'aise dans un environnement Python / Flash moderne.
La lecture de ce qui suit vous aidera à avoir une idée de la vue d'ensemble lorsqu'il s'agit de développer un code côté API / d'écriture du serveur, et comment il s'intègre dans le contexte d'une application Web plus grande:
Ce projet sera décomposé en plusieurs parties. Après avoir terminé ce projet, vous devez le soumettre en suivant les instructions ci-dessous.
Cet exercice est dû avant ce lundi 17 septembre à 23 h 59. Si vous avez passé plus de 10 heures au total, y compris votre travail avec React-Exercise, soumettez ce que vous avez!
Pour toute question, n'hésitez pas à envoyer un e-mail à [email protected].
Instructions d'installation pour Mac et Windows.
Une autre excellente ressource pour tout sur Python, y compris l'installation est le guide de l'auto-stoppeur sur Python.
Vérifiez si vous avez les versions correctes en exécutant les commandes suivantes dans votre terminal:
python3 -V
pip3 -V
pipenv --version
Tout d'abord, fourchez ce référentiel. Le bouton de la fourche en haut à droite. Ce que cela fait, c'est copier ce référentiel sur votre compte. Maintenant, vous devriez avoir un référentiel avec le nom <yourusername>/flask-exercise .
Cela devrait ressembler à ceci (mon nom d'utilisateur est TKO22): 
Ensuite, clonez ce référentiel (cliquez sur le bouton vert disant "cloner ou télécharger", choisissez HTTP et copiez et collez-le à l'emplacement <url> ) et entrez-y:
$ git clone <url>
$ cd flask-exercise
Ensuite, configurez votre environnement virtuel et installez les dépendances Python requises pour exécuter cette application. Nous utilisons PiPenv, qui définit automatiquement tout, étant donné un pipfile et pipfile.lock. Pipfile utilise VirtualEnv, qui est un environnement Python virtuel isolé de d'autres projets Python, incapable d'interférer avec ou d'être affecté par d'autres programmes Python sur la même machine. Vous êtes donc capable d'exécuter différentes versions du même package ou même de différentes versions Python.
pipenv install --skip-lock
Vous devez être dans cet environnement virtuel pour démarrer ce serveur. Pour ce faire:
pipenv shell
Ensuite, pour démarrer l'exécution du serveur:
(backend-exercise-o4dc6oDL)$ python app.py
Remarque: Cela restera un processus en cours d'exécution dans votre terminal, vous devrez donc ouvrir un nouvel onglet ou une nouvelle fenêtre pour exécuter d'autres commandes.
Pour arrêter le serveur, appuyez sur Control-C .
Pour quitter votre environnement virtuel, qui est nommé backend-exercise-[something here] , exécutez:
(backend-exercise-o4dc6oDL)$ deactivate
Vous pouvez également ajouter pipenv run avant n'importe quelle commande au lieu d'avoir à exécuter pipenv shell . par exemple pipenv run python app.py
Avant d'apporter des modifications au code, assurez-vous de créer une nouvelle branche. Les branches sont généralement nommées en fonction de la fonctionnalité ou du bugfix abordé, mais pour ce projet, nommez votre branche avec votre propre nom afin que votre critique puisse facilement suivre:
git checkout -b <YOUR_NAME>
Les noms de branche doivent être tous minuscules et ne peuvent pas contenir d'espaces. Au lieu d'espaces, utilisez des traits de traits. Par exemple:
git checkout -b varun-munjeti
Le démarrage du serveur en fera un processus en cours d'exécution en continu sur localhost:5000 . Afin de faire des demandes à votre serveur, utilisez Postman.
Tout d'abord, faites une demande GET au / de terminaison. Étant donné que le serveur s'exécute sur localhost:5000 , l'URL complète du point de terminaison est localhost:5000/ .

Essayez d'appeler le point de terminaison /mirror . Tout d'abord, regardez le code pour le point de terminaison pour voir comment vous pouvez spécifier les paramètres d'URL. Ensuite, faites une demande sur Postman à localhost:5000/mirror/<name> :

Ces exercices vous guideront à travers la création d'une API RESTful en utilisant Flask! Nous ne voulons pas que vous passiez par tous les tracas de la configuration d'une instance de base de données, nous avons donc créé des données factices et une interface de base de données simulée pour interagir avec elle. Par souci de facilité, la logique de l'application entière moins la logique mockdb sera implémentée dans app.py Pour les projets plus grands, les points de terminaison API seront généralement séparés en différents fichiers appelés views .
Avant de commencer, jetez un aperçu de la fonction create_response et de son fonctionnement. Assurez-vous de suivre les directives pour utiliser cette fonction, sinon votre API ne suivra pas les conventions appropriées!
Jetez également un œil à la base de données simulée. Les données factices initiales sont définies dans mockdb/dummy_data.py . C'est ce qui "existera" dans la "base de données" lorsque vous démarrez le serveur.
Les fonctions définies dans mockdb/mockdb_interface.py sont comment vous pouvez interroger le MockDB. Dans app.py , où vous rédigerez votre API, cela a été importé avec le nom db . Par conséquent, lorsque vous écrivez le code pour vos points de terminaison, vous pouvez appeler les fonctions d'interface DB comme db.get('users') .
Lorsque vous modifiez votre code, le serveur mettra à jour automatiquement, à moins que votre code ne se compile, auquel cas le serveur cessera d'exécuter et que vous devrez le redémarrer manuellement après avoir corrigé votre code.
Définissez le point final:
GET /users
Cela devrait renvoyer une réponse JSON correctement formatée qui contient une liste de tous les user dans le MockDB. Si vous appelez ce point de terminaison immédiatement après le démarrage du serveur, vous devriez obtenir cette réponse dans Postman:
{
"code": 200,
"message": "",
"result": {
"users": [
{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
},
{
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
},
{
"age": 23,
"id": 3,
"name": "Varun",
"team": "NNB"
},
{
"age": 24,
"id": 4,
"name": "Alex",
"team": "C2TC"
}
]
},
"success": true
}
Définissez le point final:
GET /users/<id>
Cela devrait récupérer un seul utilisateur qui a l' id fourni à partir de la demande.
S'il n'existe pas d'utilisateur avec l' id fourni, renvoyez un 404 avec un message descriptif.
Étendez le premier /users en point en ajoutant la possibilité d'interroger les utilisateurs en fonction de l'équipe sur laquelle ils se trouvent. Vous ne devez pas utiliser un paramètre URL comme vous l'avez fait dans la partie 2. Au lieu de cela, utilisez une chaîne de requête.
Si team est fournie en tant que paramètre de chaîne de requête, renvoyez uniquement les utilisateurs qui sont dans cette équipe. S'il n'y a pas d'utilisateurs dans l' team fournie, retournez une liste vide.
Pour cet exercice, vous pouvez ignorer tous les paramètres de chaîne de requête autre que team .
Dans Postman, vous pouvez fournir des paramètres de chaîne de requête en écrivant la chaîne de requête dans votre URL de demande ou en appuyant sur le bouton Params Suivant à Send . Cela remplira automatiquement l'URL de demande.
Ce qui suit devrait se produire
GET /users?team=LWB
{
"code": 200,
"message": "",
"result": {
"users": [{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
}, {
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
}]
},
"success": true
}

Définissez le point final:
POST /users
Ce point de terminaison devrait créer un nouvel utilisateur. Chaque demande doit également envoyer un name , age et un paramètre team dans le body de la demande. La propriété id sera créée automatiquement dans le MockDB.
Une demande réussie doit renvoyer un code d'état de 201 et renvoyer l'utilisateur nouvellement créé.
Si l'un des trois paramètres requis n'est pas fourni, ne créez pas un nouvel utilisateur dans la base de données et renvoyez un 422 avec un message utile. En général, vos messages devraient fournir à l'utilisateur / développeur des commentaires utiles sur ce qu'ils ont fait de mal et comment il peut le réparer.
C'est ainsi que vous pouvez envoyer des paramètres body de Postman. Assurez-vous de ne pas confondre cela avec les paramètres de requête! 
Définissez le point final:
PUT /users/<id>
Ici, nous devons fournir id d'un utilisateur car nous devons spécifier quel utilisateur à mettre à jour. Le body de cette demande doit contenir les mêmes attributs que la demande POST de la partie 4.
Cependant, la différence avec cette demande PUT est que seules les valeurs avec les clés fournies ( name , age , team ) seront mises à jour, et que les paramètres non fournis ne modifieront pas l'attribut correspondant dans l'utilisateur mis à jour.
Vous n'avez pas besoin de tenir compte des paramètres body fournis qui ne sont pas name , age ou team .
Si l'utilisateur avec l' id fourni ne peut être trouvé, renvoyez un 404 et un message utile.
Définissez le point final:
DELETE /users/<id>
Cela supprimera l'utilisateur avec l' id associé. Renvoyez un message utile, bien que rien ne soit spécifié dans le result de la réponse.
Si l'utilisateur avec l' id fourni ne peut être trouvé, renvoyez un 404 et un message utile.
Écrivons des tests unitaires! Les tests unitaires sont très importants pour le développement de logiciels. Il permet de vérifier automatiquement si nos fonctionnalités fonctionnent ou non, car le test manuellement tout est très lent et sujet aux erreurs. Le développement piloté par les tests est un processus de développement de logiciels dans lequel nous définissons une spécification, écrivons des tests à cette spécification, puis mettons en œuvre les fonctionnalités et utilisons les tests pour valider s'il fonctionne. Nous en avons fait un peu pour vous car les tests de la partie 1-3 sont écrits. Pour les tester:
pipenv install --dev
pipenv run pytest
Si vos modifications fonctionnaient, vous devriez voir une ligne verte disant que 5 passed . S'ils ne le font pas, suivez les traces de pile et fixez votre implémentation. Une fois qu'ils fonctionnent, écrivons des tests pour les pièces 3-6 .
Nous utilisons PyTest, un framework de test Python utile qui trouve automatiquement et exécute des méthodes Python qui commencent par test , telles que test_get_index . Dans notre cas, nous avons un fichier de test nommé test_app.py , qui détient tous les tests pour les pièces 1-3.
Chaque méthode accepte également un objet client , qui est automatiquement injecté par PyTest. client est un luminaire de test, ce que vous pouvez utiliser dans plusieurs tests, vous offrant une base de référence fixe pour vos tests. Lors de l'initialisation, Pytest regarde dans conftest.py et collecte tous les luminaires. Dans notre cas, nous avons un luminaire client , qui donne un client de test Flask, que nous pouvons utiliser pour tester facilement notre API. Recherchez comment vous pouvez utiliser le client Flask Test pour faire d'autres types de demandes et comment vous pouvez utiliser la charge utile de la demande.
Lorsque vous avez terminé avec toutes les étapes, appuyez vos modifications à votre dépôt GitHub!
Exploitons Black, un formateur Python, avant de vous soumettre. Cela supprime tous les arguments sur la façon dont nous voulons styliser votre code Python et donne aux examinateurs un style standardisé à examiner. Vous devez l'installer avec pipenv install --dev
pipenv run black .
Avant de pouvoir soumettre un PR, vous devrez pousser votre branche vers une branche éloignée (celle qui est sur Github, pas local).
Vérifiez que vous êtes sur votre succursale:
git branch
Si vous voulez vous assurer que tous vos commits sont dans:
git log
Appuyez sur Q pour quitter l'écran git log .
Poussez vos engagements vers votre branche éloignée:
git push
La première fois que vous faites cela, vous pourriez obtenir une erreur car votre branche distante n'existe pas encore. Habituellement, il vous dira la bonne commande à utiliser:
git push --set-upstream origin <YOUR_BRANCH_NAME>
Remarque: cela ne doit être fait que la première fois que vous poussez une nouvelle branche. Vous pouvez utiliser juste git push par la suite.
Une fois cela fait, veuillez envoyer un e-mail à [email protected] avec le lien vers votre référentiel fourchu et votre nom de branche. Nous aurons besoin de ces deux choses pour voir votre soumission.