Cours de production d'applications Web appris avec Flask of Python Partie 2 Chapitre 1 ~ Échange JSON ~

Qu'est-ce que l'API Web?

A partir de ce moment, ce sera l'édition Web API. Jusqu'à présent, nous avons créé des applications Web en partant du principe que les gens les navigueront et les utiliseront avec un navigateur. Cependant, dans les temps modernes, l'utilisation d'applications autres que les navigateurs, telles que les applications pour smartphone, est devenue courante. En plus de l'application officielle, il est concevable que la fonction soit ouverte au public et utilisée par le programme. Dans un tel cas, l'API Web est l'interface entre l'application Web et le programme selon certaines règles, c'est-à-dire l'interface entre l'application Web et le programme. Il est également possible de créer une application Web à partir d'une application côté client à l'aide de l'API Web, même dans une application Web normale. Dans ce cas, la fonction côté serveur et la fonction côté client sont séparées et la visibilité du programme est améliorée.

Qu'est-ce que JSON

Jusqu'à présent, le processus de retour du code HTML en réponse à une demande a été effectué. html est généralement conçu pour être affiché sur un navigateur et exploité par une personne. Par conséquent, il est possible d'utiliser html avec WebAPI, mais il est souvent gênant et inefficace de l'utiliser par programme. Par conséquent, de nombreuses API Web [^ 1] utilisent souvent un format appelé JSON (JavaScript Object Notation). Le format exact de JSON est défini dans la RFC 8259. Fondamentalement, vous pouvez comprendre les nombres et les chaînes en Python, les valeurs booléennes (vrai, faux), les listes pouvant contenir des valeurs nulles et les dictionnaires. Le style d'écriture est presque le même. Un exemple de json est illustré ci-dessous.

{
"id": 3,
"name": "hoge",
"ref": [1, 2, 4],
}

Dans cet exemple, l'id est la clé, la valeur numérique est 3, le nom est la chaîne de caractères hoge et le "ref" est le tableau [1, 2, 3].

Renvoyer JSON

Pour renvoyer le json avec le contenu ci-dessus à partir de Flask, procédez comme suit.

from flask import Flask, jsonify

app = Flask(__name__)

#Pouvoir utiliser le japonais
app.config['JSON_AS_ASCII'] = False

books = [{'name': 'EffectivePython', 'price': 3315}, {'name': 'Expert Python Programming', 'price': 3960}]


@app.route('/')
def get_json():
    data = {
        "id": 3,
        "name": "hoge",
        "ref": [1, 2, 4],
    }
    return jsonify(data)


if __name__ == '__main__':
    app.run()

Tout d'abord

app.config['JSON_AS_ASCII'] = False

J'ai rendu possible l'utilisation du japonais en JSON (cette fois ce n'est pas grave, mais il vaut mieux l'inclure). Ensuite, créez l'objet à renvoyer.

    data = {
        "id": 3,
        "name": "hoge",
        "ref": [1, 2, 4],
    }

Il utilise des dictionnaires et des listes Python.

Ensuite, ces données sont converties en json et renvoyées.

return jsonify(data)

Utilisez la fonction jsonify pour cela.

Pour résumer ce qui précède, vous pouvez exprimer JSON à l'aide d'un dictionnaire et d'une liste Python normaux, et le convertir en JSON à l'aide de la fonction jsonify.

Comment déboguer l'API Web de PyCharm

Jusqu'à présent, je vérifiais et déboguais des pages Web à partir d'un navigateur. Cependant, lors du débogage de l'API Web, il est pratique de pouvoir déboguer à partir de PyCharm ou autre. Surtout pour POST, nous utilisions des formulaires, mais dans le cas de l'API Web, il est difficile de fonctionner depuis le navigateur car le POST se fait directement. PyCharm (version professionnelle) dispose d'une fonction (client HTTP) pour créer et envoyer des requêtes HTTP sur PyCharm. Je vais vous présenter sa fonction. Vous pouvez probablement le faire avec des IDE autres que PyCharm. Vous pouvez également utiliser un outil appelé cURL. Si vous utilisez autre chose que PyCharm, veuillez le vérifier.

Le client HTTP de PyCharm propose deux méthodes, l'une consiste à envoyer une requête HTTP ad hoc et l'autre à enregistrer la requête HTTP dans un fichier et à l'envoyer. Cette fois, je vais vous présenter comment enregistrer une requête HTTP réutilisable dans un fichier.

Tout d'abord, sélectionnez Nouveau dans le menu Fichier et cliquez sur Requête HTTP (voir la figure ci-dessous). スクリーンショット 2020-02-12 18.12.58.png

Ensuite, il vous sera demandé d'entrer le nom du fichier, alors entrez un nom approprié (ou get_test s'il est propre). スクリーンショット 2020-02-12 18.13.36.png

Puisque nous enverrons une demande GET cette fois, sélectionnez "GET Request" dans "Add Request" en haut à droite (voir la figure ci-dessous). スクリーンショット 2020-02-12 18.14.03.png

Cela insérera le modèle de demande GET. Réécrivez le modèle inséré comme suit en fonction de cette heure.

GET http://localhost:5000/
Accept: application/json

###

La signification de ceci est d'abord

GET http://localhost:5000/

Indique qu'une demande GET sera envoyée à "http: // localhost: 5000 /".

Accept: application/json

Indique que le type de contenu à envoyer est "application / json" (puisqu'il s'agit d'une phrase fixe, vous ne devez pas trop vous inquiéter).

###

Affiche le délimiteur de requête lors de l'écriture de plusieurs requêtes HTTP dans la notation spécifique au client HTTP de PyCharm. Il y a beaucoup d'autres choses que je peux écrire, mais c'est le minimum. D'autres fonctions suivent essentiellement la syntaxe de l'en-tête HTTP. Je veux que vous vérifiiez chacun d'eux.

Ensuite, envoyons réellement cette demande. Tout d'abord, exécutez l'exemple de programme. Après cela, vous pouvez envoyer la demande en retournant à HTTPClient et en cliquant sur le vert ▶ (illustré ci-dessous) à gauche de GET dans l'éditeur. スクリーンショット 2020-02-12 18.15.12.png

Ensuite, le résultat de l'exécution sera affiché ci-dessous.

Recevoir JSON sur demande POST

Jusqu'à présent, le processus de renvoi de JSON à la requête GET a été effectué. Ensuite, je présenterai le processus de réception d'une requête POST et le json qu'il contient.

Le programme principal (app.py) est le suivant.

from flask import Flask, request, jsonify

app = Flask(__name__)

#Pouvoir utiliser le japonais
app.config['JSON_AS_ASCII'] = False

books = [{'name': 'EffectivePython', 'price': 3315}, {'name': 'Expert Python Programming', 'price': 3960}]


@app.route('/books', methods=['POST'])
def post_json():
    #Recevoir JSON
    json = request.get_json()

    #Analyser JSON
    name = json['name']
    price = json['price']
    book = {'name': name, 'price': price}
    book_id = len(books)
    books.append(book)

    #Construire un dictionnaire de retour
    book['id'] = book_id
    return jsonify(book)  #Réponse JSON


@app.route('/books/<book_id>', methods=['GET'])
def get_json_from_dictionary(book_id):
    return jsonify(books[int(book_id)])


if __name__ == '__main__':
    app.run()

Un exemple de demande est ci-dessous.

POST http://localhost:5000/books
Content-Type: application/json

{
  "name": "hoge",
  "price": 1000
}

###

GET http://localhost:5000/books/2
Content-Type: application/json

###

Après avoir reçu la demande POST, vous pouvez convertir JSON en objet Python en utilisant get_json comme indiqué ci-dessous.

request.get_json()

L'objet converti par get_json peut être traité comme un dictionnaire ou une liste Python (la partie ci-dessous).

    #Analyser JSON
    name = json['name']
    price = json['price']

De plus, vous pouvez définir des URL qui ont le même nom mais qui ont des méthodes HTTP différentes (GET et POST ici), qui n'ont pas été expliquées jusqu'à présent. Les API Web (en particulier celles appelées API REST) le font souvent. Cela indique clairement que vous l'obtiendrez dans le cas de GET et que vous l'enverrez dans le cas de POST.

problème

Dans le problème de la partie 1, chapitre 5, nous avons examiné le système de gestion des stocks pour les produits. Je souhaite implémenter cette fonction en tant qu'API Web. Implémentez une API Web pour ajouter / supprimer / acquérir des produits. Utilisez DB. Cette fois, à cause des indications, il y a presque la même partie que le problème dans la partie 1, chapitre 5. Vous pouvez détourner la réponse.

-Créer un tableau avec (ID produit, nom du produit, prix) comme colonne

développement

--Créez une API de modification de produit (/ api / 1.0 / items / id). Puisqu'il s'agit d'une mise à jour, utilisez la méthode PUT. --Créez une page de suppression de produit (/ api / 1.0 / items / id). Puisqu'il s'agit d'une suppression, utilisez la méthode DELETE.

[^ 1]: "Beaucoup", pas tous. Dans le passé, un format appelé XML, qui est proche du html, était utilisé. Récemment, un protocole appelé gRPC qui permet une communication plus rapide est également apparu.

Recommended Posts

Cours de production d'applications Web appris avec Flask of Python Partie 2 Chapitre 1 ~ Échange JSON ~
Application Web avec Python + Flask ② ③
Application Web avec Python + Flask ④
Analyser et visualiser JSON (application Web ⑤ avec Python + Flask)
Application Web réalisée avec Python3.4 + Django (Construction de l'environnement Part.1)
Développement d'applications Web avec Flask
Développement d'applications avec Docker + Python + Flask
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 1
Application Web réalisée avec Python + Flask (en utilisant VScode) # 1-Construction d'environnement virtuel-
Python x Flask x PyTorch Construction facile d'une application Web de reconnaissance numérique
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 2
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 3
Faisons une application WEB pour l'annuaire téléphonique avec flacon Partie 4
100 traitements de langage avec Python (chapitre 2, partie 2)
[Python] Une application web rapide avec Bottle!
100 traitements de langage avec Python (chapitre 2, partie 1)
[GCP] Procédure de création d'une application Web avec Cloud Functions (Python + Flask)
Application Web facile avec Python + Flask + Heroku
1. Statistiques apprises avec Python 1-3. Calcul de diverses statistiques (statistiques)
Exécutez une application Web Python avec Docker
Acquisition de données à partir de l'API d'analyse avec l'application Web Client API Google pour python Partie 2
Deep Learning from scratch La théorie et la mise en œuvre de l'apprentissage profond appris avec Python Chapitre 3
Gagnez l'application Web Python + Flask avec Jenkins
1. Statistiques apprises avec Python 1-2. Calcul de diverses statistiques (Numpy)
Lancer un serveur Web avec Python et Flask
Apprenez lentement avec Python "Principe de l'inversion des dépendances"
[Part.3] Exploration avec Python! C'est JSON plutôt que CSV! ??
Comment télécharger avec Heroku, Flask, Python, Git (Partie 3)
Dérivés appris en utilisant Python- (1) Calcul du taux de change à terme-
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
Lancer une application Web Python sur Nginx + Gunicorn avec Docker
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
Comment télécharger avec Heroku, Flask, Python, Git (Partie 1)
Comment télécharger avec Heroku, Flask, Python, Git (Partie 2)
Création de "Web Tools" BINGO avec Python (Table of Contents)
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Bases des statistiques mathématiques modernes avec python] Chapitre 1: Probabilité
Hobby Web Engineer développe une application Web avec Vue.js + Flask (& GCP)
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
[Python] Utiliser JSON avec Python
Application de Python 3 vars
Programmation avec Python Flask
Application Web Python x Flask x Tensorflow.Keras qui prédit les races de chats 2
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
[Part.2] Exploration avec Python! Cliquez sur la page Web pour vous déplacer!
[CleanArchitecture with Python] Partie 2: Couche Frameworks & Drivers: Présentation du Web
Application Web avec Python3.3.1 + Bottle (1) - Changer le moteur de modèle en jinja2
1. Statistiques apprises avec Python 2. Distribution des probabilités [Compréhension approfondie de scipy.stats]
Exemple d'analyse HTTP GET et JSON avec Pepper Python
Explication facile à comprendre de l'application Web Python (Django) même pour les débutants (5) [Introduction au fonctionnement de la base de données avec le shell Django]
Créez rapidement un environnement d'exécution d'application Web Python3.4 + Nginx + uWSGI + Flask en utilisant pyenv sur Ubuntu 12.04