Création WebApi avec Python (création CRUD) Pour les débutants

Objectif de cet article

Créez un serveur Web qui peut effectuer des opérations CRUD sur la base de données. Je l'ai expliqué soigneusement. Nous vous souhaitons la bienvenue.

Introduction et hypothèses

○ Local -Créer un type de liste en tant que DB temporaire et effectuer une opération CRUD dessus. Je pense que vous devriez réécrire l'opération pour la base de données temporaire en l'opération pour la base de données réelle. -Il est supposé que python et pip (gestionnaire de packages python) sont installés. ○ Présentation Comme motivation pour créer webApi avec python, ・ Parce que je veux utiliser la bibliothèque numpy pour gérer mathématiquement les données DB Cependant, lorsque j'ai enquêté plus tard, il était plus rapide de laisser la communication Web elle-même à js etc. et de ne laisser que le traitement des données à python + numpy. Référence: https://qiita.com/KatsunoriNakamura/items/dd567ea7cfaa99685453

mot

-Flask: un framework d'application Web qui s'exécute sur python. J'ai pu créer facilement une application Web. -WebApi: dans cet article, il fait référence à un serveur Web qui fonctionne sur la base de données lorsque vous atteignez l'URI.

Aperçu

  1. Installez Flask
  2. Créez un fichier Api

1. Installez Flask

À partir de la ligne de commande, tapez la commande suivante.

pip install Flask

2. Créez un fichier Api

En guise d'explication, nous allons d'abord montrer le code entier, puis expliquer brièvement chaque code.

Vue d'ensemble du fichier API Web

Le serveur commencera par créer et exécuter le fichier suivant. Vous pouvez utiliser la base de données en appuyant sur l'URI défini dans la méthode CRUD pendant le démarrage du serveur.

sampleapp.py


from flask import Flask, jsonify, request, render_template

app = Flask(__name__)

# DB
stores = [
    {
        'name': 'my_store',
        'items': [
            {
            'name': 'chocolate',
            'price': 120
            }
        ]
    }
]

#CRUD pour le magasin--------------
# GET /store/<string:name>
@app.route('/stores/<string:name>') # 'http://127.0.0.1:5000/store/some_name'
def get_store(name):
    for store in stores:
        if store["name"] == name:
            return jsonify(store)
    return jsonify({"message": "no store named {} found.".format(name)})

# POST /store data: {name:}
@app.route('/stores', methods=['POST'])
def create_store():
    request_data = request.get_json()
    store = next(filter(lambda x: x["name"]==request_data["name"], stores), None)
    if store != None:
        return jsonify({"message": "store named {} already exist.".format(request_data["name"])})
    else:
        new_store = {
            "name": request_data["name"],
            "items": request_data["items"]
        }
        stores.append(new_store)
        return jsonify({"message": "{} store is added.".format(request_data["name"])})

# PUT /store data: {name:}
@app.route('/stores/<string:name>', methods=['PUT'])
def update_store(name):
    request_data = request.get_json()
    store = next(filter(lambda x: x["name"] == name, stores), None)
    if store == None:
        return jsonify({"message": "no store named {} found.".format(name)})
    else:
        store["items"] = request_data["items"]
        return jsonify({"message": "{} is updated.".format(name)})

# DELETE /stores/<string:name>
@app.route('/stores/<string:name>', methods=['DELETE'])
def delete_store(name):
    global stores
    stores = list(filter(lambda x: x["name"] != name, stores))
    return jsonify({"message": "Delete store named {}".format(name)})

# --------------------CRUD pour le magasin

# GET /stores
@app.route('/stores')
def get_stores():
    return jsonify({'stores': stores})

#Essayez de charger html sur l'écran d'accueil.
# GET /
@app.route('/')
def home():
    return render_template("index.html")

app.run(port=5000)

Commentaire

sampleapp.py


from flask import Flask, jsonify, request, render_template

J'importe les modules requis de la bibliothèque Flask.

sampleapp.py


app = Flask(__name__)

Créez le corps de l'application. En python, il existe une variable spéciale par défaut entourée d'un trait de soulignement et le nom correspond au nom du fichier, donc dans ce cas, il correspond à sampleapp. Cependant, le nom du fichier exécutable (le fichier exécuté par python ~ depuis le terminal) renvoie main. Flask ne peut fonctionner correctement que sur les exécutables, nous nous assurons donc que name = main pour le fichier appelé.

sampleapp.py


# DB
stores = [
    {
        'name': 'my_store',
        'items': [
            {
            'name': 'chocolate',
            'price': 120
            }
        ]
    }
]

C'est une base de données temporaire. On suppose que plusieurs magasins sont stockés et que chaque magasin contient un nom de magasin et plusieurs données produit.

sampleapp.py


# GET /store/<string:name>
@app.route('/stores/<string:name>') # 'http://127.0.0.1:5000/store/some_name'
def get_store(name):
    for store in stores:
        if store["name"] == name:
            return jsonify({"stores": store})
    return jsonify({"message": "no store named {} found.".format(name)})

Méthode GET. Le nom du magasin est spécifié et s'il existe, il est renvoyé sous la forme d'une réponse de type json. Même si le magasin n'existe pas, le message est renvoyé avec une réponse de type json.

L'URI est enregistré dans l'application avec @ app.route ('/ stores / << string: name >>'). (L'adresse IP par défaut est automatiquement spécifiée comme 'http: //127.0.0.1: 5000'.) Lorsque cet URI est atteint, la méthode ci-dessous sera appelée. La << chaîne: nom >> dans l'URI est affectée à l'argument. jsonify () est une méthode pour créer un type json à partir d'un type de dictionnaire.

sampleapp.py


# POST /store data: {name:}
def create_store():
    request_data = request.get_json()
    store = next(filter(lambda x: x["name"]==request_data["name"], stores), None)
    if store != None:
        return jsonify({"message": "store named {} already exist.".format(request_data["name"])})
    else:
        new_store = {
            "name": request_data["name"],
            "items": request_data["items"]
        }
        stores.append(new_store)
        return jsonify({"message": "{} store is added.".format(request_data["name"])})

Méthode POST. POST est spécifié lors de la spécification de l'URI. (GET est spécifié par défaut.) Vous pouvez obtenir le corps de la requête avec request.get_json (). S'il n'y a pas de magasin avec le même nom, ajoutez le magasin avec les données du corps de la demande à la base de données.

J'omettrai la méthode PUT et la méthode DELETE car il n'y a pas d'informations supplémentaires.

sampleapp.py


# GET /stores
@app.route('/stores')
def get_stores():
    return jsonify({'stores': stores})

J'ai créé une API pour obtenir l'ensemble de la base de données pour vérifier les opérations CRUD.

sampleapp.py


#Essayez de charger html sur l'écran d'accueil.
# GET /
@app.route('/')
def home():
    return render_template("index.html")

Vous pouvez appeler un fichier html. L'appelé est configuré pour appeler la méthode GET pour l'ensemble de la base de données. スクリーンショット 2020-10-06 1.45.12.png

sampleapp.py


app.run(port=5000)

Enfin, écrivez la description pour démarrer l'application. La valeur par défaut 5000 est la valeur par défaut même si vous ne spécifiez pas le numéro de port, mais j'ose l'écrire par souci de clarté. Bien sûr, vous pouvez spécifier d'autres numéros de port.

Contrôle de fonctionnement

Courir

$ python sampleapp.py
 * Serving Flask app "sampleapp" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Vérification

J'ai vérifié en utilisant Postman (un outil qui facilite les requêtes HTTP). J'ai pu confirmer le fonctionnement de CRUDapi.

GET (stores) Obtenez des données pour l'ensemble des magasins スクリーンショット 2020-10-05 23.49.29.png

POST Enregistrez le nouveau magasin en le mettant dans le corps de la quête. スクリーンショット 2020-10-06 0.15.22.png Confirmation (GET (magasins)) スクリーンショット 2020-10-06 0.15.41.png

Écran d'accueil

スクリーンショット 2020-10-06 0.25.41.png

Les autres CRUD fonctionnent de la même manière.

Impressions

Si vous utilisez python / Flask Il semble que vous puissiez créer une API Web avec un code simple en peu de temps.

Je ne vais pas l'utiliser pour le but initial, je voudrais donc le pleurer en tant que bot webApi.

Recommended Posts

Création WebApi avec Python (création CRUD) Pour les débutants
INSÉRER dans MySQL avec Python [Pour les débutants]
[Python] Lire des images avec OpenCV (pour les débutants)
[Pour les débutants] Essayez le web scraping avec Python
Manuel python pour les débutants
OpenCV pour les débutants en Python
Raisonnement causal et recherche causale par Python (pour les débutants)
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ① ~
~ Conseils pour les débutants de Python donnés avec amour par Pythonista ② ~
[Introduction pour les débutants] Manipuler MySQL avec Python
Construction de l'environnement Python3 (pour les débutants)
Grammaire de base Python pour les débutants
Pandas 100 coups pour les débutants en Python
Python #function 1 pour les super débutants
#List Python pour les super débutants
~ Conseils pour les débutants de Python présentés avec amour par Pythonista ③ ~
[Pour les débutants] Résumé de l'entrée standard en Python (avec explication)
[Python] Introduction à la création de graphiques à l'aide de données de virus corona [Pour les débutants]
Résoudre les problèmes d'AtCoder Boot camp pour les débutants (moyen 100) avec python
Exercices Python pour les débutants # 2 [pour instruction / instruction while]
Premiers pas avec Python pour les classes PHPer
Python #index pour les super débutants, tranches
<Pour les débutants> bibliothèque python <Pour l'apprentissage automatique>
Script de création de couche AWS pour python
Fonction Python #len pour les super débutants
Web scraping pour les débutants en Python (1)
Exécutez unittest en Python (pour les débutants)
Web scraping pour les débutants en Python (4) -1
Python #Hello World pour les super débutants
Python pour les super débutants Super débutants Python # dictionnaire type 2
Premiers pas avec Python pour les fonctions PHPer
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
Extraction de mots-clés facile avec TermExtract pour Python
Grattage WEB avec Python (pour mémo personnel)
[Python] Compte-rendu de la réunion d'étude pour les débutants (7/15)
Enregistrement SSH manuel pour coreserver avec python
Utiliser DeepL avec python (pour la traduction d'articles)
Mémo pour demander des KPI avec python
Amplifiez les images pour l'apprentissage automatique avec Python
[Épisode 2] Les débutants ont essayé Numeron AI avec python
[Épisode 3] Les débutants ont essayé Numeron AI avec python
Conseils pour gérer les binaires en Python
Mettons ensemble Python pour les super débutants
[Shakyo] Rencontre avec Python pour l'apprentissage automatique
Traiter plusieurs listes avec for en Python
[Épisode 0] Un débutant a essayé Numeron AI avec python
Premiers pas avec Python pour PHPer-Super Basics
[Épisode 1] Un débutant a essayé Numeron AI avec python
déboguer la connexion mysql avec python mysql.connector
Création de tableaux Excel avec Python [Table de gestion des progrès]
Comment les débutants en Python commencent avec Progete
Ensemble d'entrées standard Atcoder pour les débutants (python)
Préparation au grattage au python [Saveur chocolat]
Un manuel pour les débutants réalisé par des débutants Python
Web scraping par les débutants avec Python (4) -3 Création d'instances de VM GCE et scraping sur VM
Explication facile à comprendre de l'application Web Python (Django) même pour les débutants (2) [Création de projet]
Janken Poi avec Python Exécutons sur un serveur local Windows pour les débutants
Erreur due à UnicodeDecodeError lors de la lecture d'un fichier CSV avec Python [Pour les débutants]
Notes pour les débutants en Python ayant de l'expérience dans d'autres langues 12 (+1) éléments par fonction
30/10/2016 else pour Python3> pour: