Heim  >  Artikel  >  Backend-Entwicklung  >  Beispiele zur Erläuterung der Verwendung von Python und Flask zur Implementierung der RESTful Web API

Beispiele zur Erläuterung der Verwendung von Python und Flask zur Implementierung der RESTful Web API

巴扎黑
巴扎黑Original
2017-09-20 09:56:502616Durchsuche

Der folgende Editor zeigt Ihnen ein Beispiel für die Verwendung von Python und Flask zur Implementierung der RESTful Web API. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor, um einen Blick darauf zu werfen

Umgebungsinstallation:

sudo pip install flask

Flask ist ein Python A Microservices-Framework basierend auf Werkzeug, einer WSGI-Klassenbibliothek.

Vorteile von Flask:

In Python geschrieben (das kann von Vorteil sein);
Einfach zu verwenden;
Flexibel;
Mehrere gute Bereitstellungsoptionen;
RESTful Anforderungsversand

RESSOURCEN

Ein API-Dienst, der auf /articles und /articles/:id reagiert:


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()

Anfrage:

curl http://127.0.0.1:5000/

Antwort:

GET /
Willkommen

GET /articles
Liste von /articles

GET /articles/123
Sie lesen 123

ANFRAGEN

GET-Parameter


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;

Anfrage:

GET /hello
Hallo John Doe

GET /hello?name=Luis
Hallo Luis

Anfragemethoden (HTTP-Verben)


@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"

Anfrage geben Sie den Anfragetyp an:

curl -X PATCH http://127.0.0.1:5000/echo
GET /echo
ECHO: GET

POST /ECHO
ECHO: POST

Daten & Header anfordern


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 ;)"

Angegebenen Inhaltstyp anfordern:

curl -H "Inhaltstyp: application/json"
-X POST http://127.0 . 0.1:5000/messages -d '{"message":"Hello Data"}'

curl -H "Content-type: application/octet-stream"
-X POST http:// 127.0 .0.1:5000/messages --data-binary @message.bin

ANTWORTEN


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

Antwort-HTTP-Header anzeigen:

curl -i http://127.0.0.1:5000/hello

Code optimieren:

from flask import jsonify

Ersetzen Sie


resp = jsonify(data)
resp.status_code = 200

Statuscodes und Fehler durch

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()

Anfrage:

GET /users/2
HTTP/1.0 200 OK
{
"2": "steve"
}

GET /users/4
HTTP/1.0 404 NICHT GEFUNDEN
{
"status": 404,
„Nachricht“: „Nicht gefunden: http://127.0.0.1:5000/users/4“
}

AUTHORIZATION


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

Ersetzen der check_auth-Funktion und Verwenden des require_auth-Dekorators:

@app.route('/secrets')
@requires_auth
def api_hello( ) :
return „Shhh, das ist streng geheimes Spionagezeug!“
HTTP-Basisauthentifizierung:

curl -v -u "admin:secret" http://127.0.0.1:5000/secrets

EINFACHE DEBUG- UND PROTOKOLLIERUNG

Debug:

app.run(debug=True)
Protokollierung:


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"

Das obige ist der detaillierte Inhalt vonBeispiele zur Erläuterung der Verwendung von Python und Flask zur Implementierung der RESTful Web API. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn