Maison >développement back-end >Tutoriel Python >Exemples pour expliquer l'utilisation de Python et Flask pour implémenter l'API Web RESTful
L'éditeur suivant vous présentera un exemple d'utilisation de Python & Flask pour implémenter l'API Web RESTful. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur pour jeter un œil
Installation de l'environnement :
sudo pip install flask
Flask est un Python A framework de microservices basé sur Werkzeug, une bibliothèque de classes WSGI.
Avantages de Flask :
Écrit en Python (cela peut être un avantage);
Simple à utiliser;
Flexible;
Plusieurs bonnes options de déploiement;
RESTful répartition des demandes
RESSOURCES
Un service API qui répond à /articles et /articles/:id :
from flask import Flask, url_for app = Flask(__name__) @app.route('/') def api_root(): return 'Welcome' @app.route('/articles') def api_articles(): return 'List of ' + url_for('api_articles') @app.route('/articles/<articleid>') def api_article(articleid): return 'You are reading ' + articleid if __name__ == '__main__': app.run()
Demande :
curl http://127.0.0.1:5000/
Réponse :
GET /
Bienvenue
GET /articles
Liste des /articles
GET /articles/123
Vous lisez 123
DEMANDES
GET Paramètres
from flask import request @app.route('/hello') def api_hello(): if 'name' in request.args: return 'Hello ' + request.args['name'] else: return 'Hello John Doe'
Demande :
GET /hello
Bonjour John Doe
GET /hello?name=Luis
Bonjour Luis
Méthodes de requête (verbes HTTP)
@app.route('/echo', methods = ['GET', 'POST', 'PATCH', 'PUT', 'DELETE']) def api_echo(): if request.method == 'GET': return "ECHO: GET\n" elif request.method == 'POST': return "ECHO: POST\n" elif request.method == 'PATCH': return "ECHO: PACTH\n" elif request.method == 'PUT': return "ECHO: PUT\n" elif request.method == 'DELETE': return "ECHO: DELETE"
Demande précisez le type de requête :
curl -X PATCH http://127.0.0.1:5000/echo
GET /echo
ECHO : GET
POST /ECHO
ECHO : POST
Demande de données et d'en-têtes
from flask import json @app.route('/messages', methods = ['POST']) def api_message(): if request.headers['Content-Type'] == 'text/plain': return "Text Message: " + request.data elif request.headers['Content-Type'] == 'application/json': return "JSON Message: " + json.dumps(request.json) elif request.headers['Content-Type'] == 'application/octet-stream': f = open('./binary', 'wb') f.write(request.data) f.close() return "Binary message written!" else: return "415 Unsupported Media Type ;)"
Demande du type de contenu spécifié :
curl -H "Type de contenu : application/json"
-X POST http://127.0 0.1:5000/messages -d '{"message":"Hello Data"}'
curl -H "Type de contenu : application/octet-stream"
-X POST http://. 127.0 .0.1:5000/messages --data-binary @message.bin
RÉPONSES
from flask import Response @app.route('/hello', methods = ['GET']) def api_hello(): data = { 'hello' : 'world', 'number' : 3 } js = json.dumps(data) resp = Response(js, status=200, mimetype='application/json') resp.headers['Link'] = 'http://luisrei.com' return resp
Afficher les en-têtes HTTP de réponse :
curl -i http://127.0.0.1:5000/hello
Optimiser le code :
from flask import jsonify
Remplacez
resp = jsonify(data) resp.status_code = 200
Codes d'état et erreurs par
resp = Response(js, status=200, mimetype='application/json')
@app.errorhandler(404) def not_found(error=None): message = { 'status': 404, 'message': 'Not Found: ' + request.url, } resp = jsonify(message) resp.status_code = 404 return resp @app.route('/users/<userid>', methods = ['GET']) def api_users(userid): users = {'1':'john', '2':'steve', '3':'bill'} if userid in users: return jsonify({userid:users[userid]}) else: return not_found()
Demande :
GET /users/2
HTTP/1.0 200 OK
{
"2": "steve"
}
GET /users/4
HTTP/1.0 404 INTROUVABLE
{
"status": 404,
" message": "Introuvable : http://127.0.0.1:5000/users/4"
}
AUTORISATION
from functools import wraps def check_auth(username, password): return username == 'admin' and password == 'secret' def authenticate(): message = {'message': "Authenticate."} resp = jsonify(message) resp.status_code = 401 resp.headers['WWW-Authenticate'] = 'Basic realm="Example"' return resp def requires_auth(f): @wraps(f) def decorated(*args, **kwargs): auth = request.authorization if not auth: return authenticate() elif not check_auth(auth.username, auth.password): return authenticate() return f(*args, **kwargs) return decorated
remplacement de la fonction check_auth et utilisation du décorateur require_auth :
@app.route('/secrets')
@requires_auth
def api_hello( ) :
return "Chut, c'est un truc d'espionnage top secret !"
Authentification de base HTTP:
curl -v -u "admin:secret" http://127.0.0.1:5000/secrets
DÉBUGAGE ET JOURNALISATION SIMPLES
Débogage :
app.run(debug=True)
Journalisation :
import logging file_handler = logging.FileHandler('app.log') app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) @app.route('/hello', methods = ['GET']) def api_hello(): app.logger.info('informing') app.logger.warning('warning') app.logger.error('screaming bloody murder!') return "check your logs\n"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!