首頁  >  文章  >  後端開發  >  實例講解使用Python & Flask 實作RESTful Web API

實例講解使用Python & Flask 實作RESTful Web API

巴扎黑
巴扎黑原創
2017-09-20 09:56:502665瀏覽

下面小編就為大家帶來一篇使用Python & Flask 實作RESTful Web API的實例。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧

環境安裝:

sudo pip install flask

Flask 是一個Python的微服務的框架,基於Werkzeug, 一個WSGI 類別庫。

Flask 優點:

Written in Python (that can be an advantage);
Simple to use;
Flexible;
Multiple good deployment options;
RESTful request dispatching

RESOURCES

一個回應/articles 和/articles/:id的API 服務:


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

請求:

##curl http://127.0.0.1:5000/

回應:

GET /

Welcome

GET /articles

List of /articles

GET /articles/123

You are reading 123

#REQUESTS

GET Parameters


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;

請求:

GET /hello

Hello John Doe

GET /hello?name=Luis

Hello Luis

Request Methods (HTTP Verbs)


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

請求指定request type:

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

GET /echo
ECHO: GET

POST /ECHO

ECHO: POST

Request Data & Headers


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

請求指定content type:

curl -H "Content-type: 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

RESPONSES


#

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

查看response HTTP headers:

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

優化程式碼:

from flask import jsonify

#使用


#

resp = jsonify(data)
resp.status_code = 200

取代


resp = Response(js, status=200, mimetype=&#39;application/json&#39;)

Status Codes & Errors


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

請求:

GET /users/2

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

GET /users/4

HTTP/1.0 404 NOT FOUND
{
"status": 404,
"message": "Not Found: 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

#replacing the check_auth function and using the requires_auth decorator:

@app.route('/secrets')

@requires_auth
def api_hello():
return "Shhh this is top secret spy stuff!"
HTTP basic authentication:

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

#SIMPLE DEBUG & LOGGING

Debug:

app.run(debug=True)

Logging:

##

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"

以上是實例講解使用Python & Flask 實作RESTful Web API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn