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.
○ 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
-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.
À partir de la ligne de commande, tapez la commande suivante.
pip install Flask
En guise d'explication, nous allons d'abord montrer le code entier, puis expliquer brièvement chaque code.
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)
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.
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.
$ 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)
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
POST Enregistrez le nouveau magasin en le mettant dans le corps de la quête. Confirmation (GET (magasins))
Les autres CRUD fonctionnent de la même manière.
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.