Maison  >  Article  >  développement back-end  >  Exemples pour expliquer l'utilisation de Python et Flask pour implémenter l'API Web RESTful

Exemples pour expliquer l'utilisation de Python et Flask pour implémenter l'API Web RESTful

巴扎黑
巴扎黑original
2017-09-20 09:56:502689parcourir

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(&#39;/articles/<articleid>&#39;)
def api_article(articleid):
 return &#39;You are reading &#39; + articleid

if __name__ == &#39;__main__&#39;:
 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(&#39;/hello&#39;)
def api_hello():
 if &#39;name&#39; in request.args:
  return &#39;Hello &#39; + request.args[&#39;name&#39;]
 else:
  return &#39;Hello John Doe&#39;

Demande :

GET /hello
Bonjour John Doe

GET /hello?name=Luis
Bonjour Luis

Méthodes de requête (verbes HTTP)


@app.route(&#39;/echo&#39;, methods = [&#39;GET&#39;, &#39;POST&#39;, &#39;PATCH&#39;, &#39;PUT&#39;, &#39;DELETE&#39;])
def api_echo():
 if request.method == &#39;GET&#39;:
  return "ECHO: GET\n"

 elif request.method == &#39;POST&#39;:
  return "ECHO: POST\n"

 elif request.method == &#39;PATCH&#39;:
  return "ECHO: PACTH\n"

 elif request.method == &#39;PUT&#39;:
  return "ECHO: PUT\n"

 elif request.method == &#39;DELETE&#39;:
  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(&#39;/messages&#39;, methods = [&#39;POST&#39;])
def api_message():

 if request.headers[&#39;Content-Type&#39;] == &#39;text/plain&#39;:
  return "Text Message: " + request.data

 elif request.headers[&#39;Content-Type&#39;] == &#39;application/json&#39;:
  return "JSON Message: " + json.dumps(request.json)

 elif request.headers[&#39;Content-Type&#39;] == &#39;application/octet-stream&#39;:
  f = open(&#39;./binary&#39;, &#39;wb&#39;)
  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(&#39;/hello&#39;, methods = [&#39;GET&#39;])
def api_hello():
 data = {
  &#39;hello&#39; : &#39;world&#39;,
  &#39;number&#39; : 3
 }
 js = json.dumps(data)

 resp = Response(js, status=200, mimetype=&#39;application/json&#39;)
 resp.headers[&#39;Link&#39;] = &#39;http://luisrei.com&#39;

 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=&#39;application/json&#39;)


@app.errorhandler(404)
def not_found(error=None):
 message = {
   &#39;status&#39;: 404,
   &#39;message&#39;: &#39;Not Found: &#39; + request.url,
 }
 resp = jsonify(message)
 resp.status_code = 404

 return resp

@app.route(&#39;/users/<userid>&#39;, methods = [&#39;GET&#39;])
def api_users(userid):
 users = {&#39;1&#39;:&#39;john&#39;, &#39;2&#39;:&#39;steve&#39;, &#39;3&#39;:&#39;bill&#39;}
 
 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 == &#39;admin&#39; and password == &#39;secret&#39;

def authenticate():
 message = {&#39;message&#39;: "Authenticate."}
 resp = jsonify(message)

 resp.status_code = 401
 resp.headers[&#39;WWW-Authenticate&#39;] = &#39;Basic realm="Example"&#39;

 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(&#39;app.log&#39;)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)

@app.route(&#39;/hello&#39;, methods = [&#39;GET&#39;])
def api_hello():
 app.logger.info(&#39;informing&#39;)
 app.logger.warning(&#39;warning&#39;)
 app.logger.error(&#39;screaming bloody murder!&#39;)
 
 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn