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

巴扎黑
Libérer: 2017-09-20 09:56:50
original
2632 Les gens l'ont consulté

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()
Copier après la connexion

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;
Copier après la connexion

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"
Copier après la connexion

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 ;)"
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

Codes d'état et erreurs par

resp = Response(js, status=200, mimetype=&#39;application/json&#39;)
Copier après la connexion


@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()
Copier après la connexion

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
Copier après la connexion

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"
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!