Frontend et backend
Commençons par ordre. Que sont frontend et backend? Le site a deux côtés: avant et intérieur, respectivement. Le premier est généralement responsable de la disposition visuelle des objets sur la page (où sont quelles images, où est quel texte et où sont quels boutons). Le second est responsable des «actions». Il s'agit généralement de clics sur les mêmes boutons ou sur d'autres «choses» du site. Par exemple, vous allez sur la page de votre réseau social préféré et vous devez d'abord vous connecter à votre compte. Sur la face avant (frontend), vous entrez votre nom d'utilisateur et votre mot de passe et cliquez sur le bouton "Connexion". À ce moment, la demande est envoyée à la base de données pour vérifier la présence d'un tel utilisateur, et en cas de succès, vous serez redirigé vers le réseau social sous votre compte, sinon, vous verrez un message d'erreur. Dans ce cas, le backend est essentiellement responsable de l'envoi de la requête à la base de données.Il est généralement divisé en trois sous-parties:
- API Web pour accepter les demandes
- Logique métier pour le traitement des demandes
- Interaction avec la base de données
Dans cet article, nous parlerons principalement d'API ou d'interface de programmation d'application et un peu de logique métier. Mais d'abord, créons un serveur.
Créer votre propre serveur
Voici à quoi ressemble l'application serveur python la plus simple en utilisant le framework flask:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello, World!"
app.run()
Il existe déjà une route vide («/») et si vous exécutez cette application et ouvrez le navigateur à la page 127.0.0.1 : 5000, vous verrez l'inscription «Hello, World!». Du côté serveur, vous verrez le message suivant:
127.0.0.1 - - [07 / août / 2020 20:32:16] "GET / HTTP / 1.1" 200 - Ainsi, en allant sur ce lien dans le navigateur (client), on fait Une requête GET à notre serveur et nous entrons dans la fonction d'index - à partir d'ici "Hello, World!" Est prise. Vous pouvez ajouter d'autres requêtes (beaucoup plus complexes) le long d'autres routes (ou pas nécessairement). Comme je l'ai dit, dans ce cas, nous avons utilisé une requête GET - la valeur par défaut standard. Mais il y en a beaucoup d'autres, dont les plus populaires sont POST, PUT, DELETE. Mais pourquoi est-ce nécessaire?
Créer une mise à jour en lecture Supprimer
Premièrement, REST signifie REpresentational State Transfer (ou, de manière plus simple, REpresentational State Transfer). En fait, la définition de REST elle-même n'est pas si importante, mais elle est généralement associée à un autre acronyme - CRUD - Create Read Update Delete. Au tout début, j'ai donné un exemple lié à une base de données et ces quatre opérations font partie intégrante du travail avec elle (enfin, ou juste avec des données).
Deuxièmement, une API REST ou RESTfull doit prendre en charge la gestion de ces quatre actions. C'est là que les méthodes GET, POST, PUT, DELETE sont utiles. En règle générale (pas nécessairement!) La méthode POST est utilisée pour ajouter de nouvelles données (Create), GET - pour lire (Read), PUT - pour mettre à jour les données existantes (Update) et DELETE, respectivement, pour supprimer (Delete). Par exemple, la même application flask peut être repensée comme ceci:
from flask import Flask, request
app = Flask(__name__)
@app.route("/", methods=["POST", "GET", "PUT", "DELETE"])
def index():
if request.method == "POST":
#
if request.method == "GET":
#
if request.method == "PUT":
#
if request.method == "DELETE":
#
app.run()
Il s'agit de l'API REST primitive. Le frontend peut désormais envoyer des demandes et, en fonction de leur type, nous prendrons d'autres mesures.
Travailler avec des données
Notre application actuelle n'est pas du tout intéressante - ce serait bien de travailler avec certaines données. Pour ce faire, vous devez réfléchir à la manière de les transférer. Le moyen le plus courant est le format JSON (mais vous pouvez en utiliser d'autres, par exemple, XML). Il est analogue à un dictionnaire en python et est très simple à utiliser. J'utiliserai des données primitives pour un exemple avec autorisation sur un réseau social:
data = {
1: {
"login": "login1",
"password": "Qwerty1"},
2: {
"login": "login2",
"password": "Ytrewq2"}
}
Nous avons une donnée dans laquelle il y a jusqu'à présent deux utilisateurs (login1 et login2) et nous CRUD cette date. Il vaut la peine de dire que les quatre méthodes fonctionnent rarement sur la même route et le font généralement: pour les méthodes GET (renvoyer tous les utilisateurs) et POST, la route est utilisée, par exemple, "/ users", et pour les méthodes GET (donner un utilisateur par son id), PUT et SUPPRIMER "/ users / id". Il convient également de noter que pour mettre à jour et créer de nouveaux utilisateurs, nous recevons des données à leur sujet dans le corps de la requête (request.json). Maintenant, notre programme peut être réécrit comme suit:
from flask import Flask, request
app = Flask(__name__)
data = {
1: {
"login": "login1",
"password": "Qwerty1"},
2: {
"login": "login2",
"password": "Ytrewq2"}
}
@app.route("/users", methods=["POST", "GET"])
def work_with_users():
if request.method == "POST":
data[max(data.keys())+1] = request.json
return {"message": "User was created"}, 201
if request.method == "GET":
return data, 200
@app.route("/users/<int:user_id>", methods=["GET", "PUT", "DELETE"])
def work_with_user_by_id(user_id):
if request.method == "GET":
return data[user_id], 200
if request.method == "PUT":
data[user_id]["login"] = request.json["login"]
data[user_id]["password"] = request.json["password"]
return {"message": "User was updated"}, 200
if request.method == "DELETE":
data.pop(user_id)
return {"message": "User was deleted"}, 200
app.run()
Il existe de nombreux programmes pour tester les demandes (Postman, Fiddler, Insomnia ...) et je vous recommande de vous familiariser avec l'un d'entre eux (personnellement, Postman est mon préféré). Avec leur aide, vous pouvez voir ce qui résulte de la demande et avec quel code de statut (numéros 200/201 en retour). Et vous pouvez également organiser l'envoi de données en les ajoutant au corps de la requête.
Il convient également de noter que cette approche n'est pas utilisée actuellement et que la bibliothèque flask-restplus (ou le flask-restx qui l'a remplacée) est généralement utilisée, mais je pense que vous devez d'abord vous familiariser avec pure flask. Il faut également vérifier la disponibilité des données et leur exactitude et prévoir le retour d'une erreur dans les cas opposés.
Conclusion
Les API REST sont simplement des méthodes CRUD auxquelles accède le côté client du site via des itinéraires spécifiques. À l'oreille et au regard, cela peut être difficile à percevoir, je vous recommande donc d'écrire votre propre serveur par analogie avec l'exemple. Personnellement, je trouve flask l'un des frameworks les plus simples pour cela, et si vous êtes débutant, je vous conseille de l'essayer.