Python est un langage de programmation doté d'une riche bibliothèque dans des domaines tels que l'IoT, l'analyse, l'apprentissage en profondeur et le traitement du langage naturel. Un traitement spécialisé dans ces domaines peut être développé en tant que micro service en Python par une équipe spécialisée, et peut être appelé et utilisé comme API REST à partir d'une application frontale hautement productive sur l'écran Web PHP. Une productivité et une maintenabilité élevées sont attendues.
De plus, l'API de Watson renvoie une réponse au format JSON, donc en connectant Cloudant, qui est une base de données de type document au format JSON, au runtime Node.js, qui est bon pour traiter JSON, Watson construit un corpus. Vous pouvez développer le système d'application de ce qui précède avec une productivité élevée. Et, de la même manière, vous pouvez ajouter des fonctions en l'utilisant comme service REST depuis le frontal PHP.
Comme le montre la figure suivante, la structure qui appelle les microservices écrits en Node.js et Python à partir de l'application PHP frontale vous permet d'ajouter des fonctions sans affecter de manière significative l'application écran Web. Je vais. En d'autres termes, en adoptant une telle architecture de microservices, l'écran web est PHP, le calcul numérique est Python, Watson est Node.js, etc., chacun étant le meilleur langage de programmation, et une bonne productivité mutuelle. Vous pouvez étendre les fonctions du système tout en conservant ce qui précède.
En tant que fonction de prise en charge d'une telle architecture de micro-services, Bluemix a une fonction qui permet aux services REST fournis par l'utilisateur d'être liés et utilisés à partir d'autres applications. En utilisant cela, il est possible de construire un système à grande échelle qui est faiblement couplé en unités de fonctions et d'organisations.
Dans cet article, j'aimerais créer un service Web Python RESTful qui se connecte et utilise à partir d'une application PHP. Bien entendu, dans ce processus de développement, HTTPS et l'authentification sont considérés en supposant un environnement dans lequel REST est appelé à partir de l'environnement de développement local et le fonctionnement est confirmé. De plus, en liant le service Python à l'application PHP, vous pouvez obtenir l'URL de destination d'accès et les informations d'identification, et éviter le codage en dur dans l'application PHP.
Construisez la pile d'environnement de développement localement avec Vagrant + VirtualBox. Un Vagrantfile est préparé à l'adresse de GitHub https://github.com/takara9/bluemix-dev, vous pouvez donc l'utiliser pour préparer un environnement de développement Python sur le serveur virtuel de votre PC. Je peux le faire. Vous pouvez également utiliser ce Vagrantfile pour créer un environnement de développement pour PHP, Ruby et Node.js en même temps.
$ git clone https://github.com/takara9/bluemix-dev bluemix-rest
$ cd bluemix-rest/
$ vagrant up
$ vagrant ssh
$ pyenv install 2.7.13
$ pyenv versions
* system (set by /home/vagrant/.pyenv/version)
2.7.13
$ pyenv global 2.7.13
$ python --version
Python 2.7.13
Maintenant, l'environnement de développement Python est prêt.
Nous écrirons un serveur REST minimal pour Python. La fonction de ce code est la suivante:
L'exemple de code ci-dessous est disponible sur GitHub https://github.com/takara9/REST_Sample_Python.
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3 import os
4 from flask import Flask
5 from flask_restful import Resource, Api, reqparse
6 from flask_httpauth import HTTPBasicAuth
7
8 # for Health Check
9 class HelloWorld(Resource):
10 def get(self):
11 return {'message': 'Hello World'}
12
13 # for POST
14 class Calc(Resource):
15 auth = HTTPBasicAuth()
16 @auth.login_required
17 def post(self):
18 args = parser.parse_args()
19 ans = float(args['a']) * float(args['b'])
20 return {'ans': ans }
21
22 @auth.verify_password
23 def verify_password(username, password):
24 return username == 'user' and password == 'pass'
25
26
27 if __name__ == '__main__':
28
29 app = Flask(__name__)
30 api = Api(app)
31 api.add_resource(Calc, '/calc')
32 api.add_resource(HelloWorld, '/')
33
34 parser = reqparse.RequestParser()
35 parser.add_argument('a')
36 parser.add_argument('b')
37
38 bx_port = os.getenv("PORT")
39 listen_port = int(bx_port if bx_port else 5000)
40 app.run(host='0.0.0.0', port=listen_port, debug=True)
La première ligne est une déclaration qui utilise python comme interpréteur. / usr / bin / env est la spécification pour l'exécution de Python défini dans pyenv. Vous pouvez vous référer au manuel avec man env. La deuxième ligne est une déclaration d'utilisation de UTF-8.
Nous utilisons le framework FLASK de Python pour créer un serveur REST. Vous pouvez en savoir plus sur les trois modules que vous importez à l'URL suivante.
Code pour répondre aux vérifications de l'état lors du déploiement sur Bluemix. Étant donné que le contenu à répondre n'est pas spécifié, «Hello World» est renvoyé. La spécification de rappel pour cette classe se trouve à la ligne 32.
Il s'agit de la partie centrale du service REST. Les lignes 15 et 16 spécifient que l'authentification BASIC est requise. Aux lignes 17 à 20, les données reçues par POST sont converties (analysées) en une variable, multipliées et renvoyées. Je pense que le cadre Python consistant à renvoyer une réponse avec une variable qui revient d'un rappel applaudit.
Les lignes 22 à 24 correspondent à l'ID utilisateur et au mot de passe. S'il s'agit d'une application réelle, vous accéderez au système de gestion des identifiants et à la base de données à partir d'ici.
C'est la partie principale de la routine. Instanciez le framework, définissez la classe de rappel, spécifiez les paramètres à analyser, obtenez le numéro de port à partir des variables d'environnement et démarrez le serveur.
Dans cette section, nous allons écrire sur la façon de tester le code cloné à partir de GitHub localement. Vous pouvez soudainement le déployer sur Bluemix et l'exécuter, mais comme il est pratique d'avoir un environnement de développement local, vérifiez le fonctionnement sur votre propre Mac, puis déployez-le.
Tout d'abord, clonez le code comme suit:
git clone https://https://github.com/takara9/REST_Sample_Python
Accédez au répertoire du serveur REST où se trouve la liste des modules Python requis requirements.txt.
cd REST_Sample_Python/restServerPython
Exécutez la commande suivante pour installer en bloc les packages prérequis Python.
pip install -r requirements.txt
Le serveur REST est démarré de la manière suivante. Si vous le définissez à l'avance sur chmod + x app.py, vous pouvez également l'exécuter directement en tant que ./app.py.
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restServerPython$ python app.py
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 267-639-962
*
Ouvrez un autre terminal, connectez-vous au serveur virtuel dans votre environnement de développement avec vagrant ssh, puis exécutez le client REST. Le client REST est également inclus dans le code cloné depuis GitHub, alors déplacez le répertoire.
cd REST_Sample_Python/restClientPython
Comme le montre la figure ci-dessus, le client est écrit en PHP car nous procédons à l'appel d'un service écrit en Python depuis une application PHP. Le code client est conçu pour obtenir l'URI et les informations d'authentification de la destination de connexion à partir de vcap-local.json, alors réécrivez ce fichier et essayez de vous connecter au service REST démarré localement.
Le changement est uri sur la 7ème ligne, réécrivez-le en "http: // localhost: 5000 / calc".
1 {
2 "VCAP_SERVICES": {
3 "user-provided": [
4 {
5 "credentials": {
6 "password": "pass",
7 "uri": "https://pycalcxx.mybluemix.net/calc", <-Fixer cette ligne
8 "username": "user"
9 },
10 "label": "user-provided",
11 "name": "pycalcxxu",
12 "syslog_drain_url": "",
13 "tags": [],
14 "volume_mounts": []
15 }
16 ]
17 }
18 }
Ensuite, installez PHP avec phpenv et vérifiez la version.
phpenv install 5.6.31
phpenv global 5.6.31
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ php -v
PHP 5.6.31 (cli) (built: Aug 14 2017 05:28:21)
Maintenant que vous disposez d'un environnement dans lequel vous pouvez exécuter du code PHP, exécutez-le.
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ php client.php
Result = 2130.951794
C'est une bonne idée de changer les valeurs des variables de tableau a et b de manière appropriée dans le code client.
Je voudrais d'abord présenter l'intégralité du code pour compléter les points clés.
1 <?php
2 include "cfenv.php";
3
4 $ch = curl_init();
5 $vcap = new Cfenv();
6 $vcap->byInstName('pycalcxxu');
7
8 // POST
9 $form = array(
10 'a' => 391.345,
11 'b' => 5.4452
12 );
13
14 $options = array(
15 CURLOPT_POST => 1,
16 CURLOPT_HEADER => 0,
17 CURLOPT_URL => $vcap->uri,
18 CURLOPT_FRESH_CONNECT => 1,
19 CURLOPT_RETURNTRANSFER => 1,
20 CURLOPT_FORBID_REUSE => 1,
21 CURLOPT_TIMEOUT => 4,
22 CURLOPT_USERPWD => $vcap->user.":".$vcap->pass,
23 CURLOPT_POSTFIELDS => http_build_query($form)
24 );
25
26 curl_setopt_array($ch, $options);
27 $resp = curl_exec($ch);
28 $result = json_decode($resp);
29 print "Result = ".$result->{'ans'}."\n";
30
31 curl_close($ch);
32 ?>
Ce module est un module permettant d'obtenir les informations de destination de connexion en éditant l'environnement lorsqu'il est déployé sur Bluemix et en lisant les informations de destination de connexion à partir de vcap-local.json lors des tests dans l'environnement local.
Pour les données POST, l'exemple de serveur Python REST renvoie le résultat de la multiplication de a et b.
Les paramètres requis pour POST, tels que l'URI, l'utilisateur et le mot de passe d'authentification de base, les données de formulaire, etc. sont définis.
Exécutez HTTP POST pour obtenir le résultat et l'afficher à l'écran.
Les fichiers de déploiement du module d'exécution Python sur Bluemix sont les quatre fichiers suivants.
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restServerPython$ ls
app.py manifest.yml requirements.txt runtime.txt
1 ---
2 applications:
3 - buildpack: https://github.com/cloudfoundry/python-buildpack
4 name: python-rest-svc
5 memory: 64MB
6 disk_quota: 256MB
7 random-route: false
8 domain: mybluemix.net
9 name: pyCalcxx
10 command: python app.py
Le point est le pack de build sur la troisième ligne, qui spécifie le dernier pack de build pour Cloud Foundry. Spécifiez ensuite python app.py comme commande de démarrage pour démarrer python à la ligne 10.
Enfin, exécutez la commande suivante pour permettre à Bluemix de déployer les modules requis au moment du déploiement, par exemple lorsque des modules supplémentaires se produisent.
pip freeze > requirements.txt
Un fichier qui spécifie la version Python. Veuillez consulter le manuel de Cloud Foundry pour plus de détails, car il existe une plage qui peut être utilisée avec le pack de construction.
python-2.7.13
Connectez-vous avec la CLI Blumiex et déployez l'application.
bx login
bx cf push
Une fois le déploiement réussi, essayez de modifier l'URI du client de test et de tester. Pour connaître l'URL du service REST déployé:
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restServerPython$ bx cf a
Invoking 'cf a'...
name requested state instances memory disk urls
pyCalcxx started 1/1 64M 256M pycalcxx.mybluemix.net
Dans ce cas, nous savons qu'il s'agit de pycalcxx.mybluemix.net, donc modifiez et testez la ligne 7 de vcap-local.json sur le client.
7 "uri": "https://pycalcxx.mybluemix.net/calc",
Si vous obtenez le même résultat que lorsque vous l'exécutez localement, le déploiement du serveur REST est terminé.
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ php client.php
Result = 2130.951794
Enfin, le service fourni par l'utilisateur peut être exécuté. Nous le définirons comme un service fourni par l'utilisateur.
Vérifiez le nom et l'adresse de ce service REST Python.
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ bx cf a
Invoking 'cf a'...
name requested state instances memory disk urls
pyCalcxx started 1/1 64M 256M pycalcxx.mybluemix.net
Définissez le nom du service séparément du nom de l'application mentionné ci-dessus et spécifiez l'adresse des informations d'identification -p.
vagrant@vagrant-ubuntu-trusty-64:~/REST_Sample_Python/restClientPython$ bx cf cups pycalcxxu -p '{"username":"user", "password":"pass", "uri": "https://pycalcxx.mybluemix.net/calc"}'
Cela fournira les informations d'identification fournies à l'application lorsque vous liez le service. Et lorsqu'ils sont visualisés à partir de l'écran de la console Bluemix, le service Bluemix et le service fourni par l'utilisateur apparaîtront sur la même ligne, comme indiqué ci-dessous.
Par exemple, vous pouvez vous connecter à partir d'une autre application et l'utiliser comme suit.
Bien sûr, vous pouvez lier et dissocier non seulement de l'écran GUI du Web, mais également de la commande CLI Bluemix.
bx cf bs phpSamplexx pycalcxxu
Si vous faites référence aux informations d'identification du service du côté de l'application, vous pouvez voir qu'elles sont fournies à l'application comme suit.
bx cf env phpSamplexx
<Omis>
System-Provided:
{
"VCAP_SERVICES": {
"user-provided": [
{
"credentials": {
"password": "pass",
"uri": "https://pycalcxx.mybluemix.net/calc",
"username": "user"
},
"label": "user-provided",
"name": "pycalcxxu",
"syslog_drain_url": "",
"tags": [],
"volume_mounts": []
}
]
}
}
J'ai mis le code PHP qui fonctionne avec ce service Python REST sur GitHub, donc je pense que vous pouvez approfondir votre compréhension en vous y référant également. https://github.com/takara9/php_sample_apl/tree/db2
Ceci est un exemple simple, mais je pense qu'il peut être appliqué à des applications telles que l'utilisation d'un modèle d'apprentissage automatique utilisant Python.
Cette fois, l'histoire est limitée à une étape, mais dans des cas tels que DevOps où le développement et le fonctionnement de la production sont parallèles, le côté environnement peut fournir les informations de destination de connexion du micro-service à l'application, donc pendant le développement chargé. Puisqu'il est possible d'éviter des accidents tels qu'une erreur accidentelle dans la destination de connexion et la destruction des données de production, je pense qu'il peut être utilisé comme un environnement DevOps sûr et sécurisé.
Ensuite, en production, si les performances du micro service sont insuffisantes, il y a un avantage en ce que le nombre d'instances peut être facilement augmenté. Étant donné que le gorouter qui gère la répartition de la charge est inclus dans le routage du micro service, vous pouvez augmenter le nombre d'instances et évoluer en cliquant simplement sur + comme indiqué sur la figure.
Vous voudrez des fonctionnalités un peu plus utiles. Vient ensuite Bluemix API Connect.
(1) Flask Micro Framework http://flask.pocoo.org/ (2) Flask RESTful https://flask-restful.readthedocs.io/en/0.3.5/ (3) Flask-BasicAuth https://flask-basicauth.readthedocs.io/en/latest/ (4) Python Buildpack http://docs.cloudfoundry.org/buildpacks/python/index.html (5) Manuel PHP curl exec http://php.net/manual/ja/function.curl-exec.php (6) La clé pour déployer des applications Flask à l'aide de Python Buildpack dans Cloud Foundry (Diego) http://qiita.com/yuta_h3/items/4798ec83a26391c5627f (7) Cloud Foundry Documentation Python Buildpack https://docs.cloudfoundry.org/buildpacks/python/index.html (8) Bluemix App Development and Management # 21.5 Instance de service fournie par l'utilisateur http://qiita.com/MahoTakara/items/9d03414689fe1b2b9cd2
Recommended Posts