ホームページ  >  記事  >  バックエンド開発  >  Python と Flask を使用した RESTful Web API の実装を説明する例

Python と Flask を使用した RESTful Web API の実装を説明する例

巴扎黑
巴扎黑オリジナル
2017-09-20 09:56:502616ブラウズ

以下のエディターは、Python と Flask を使用して RESTful Web API を実装する例を示します。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。エディターに従って見てみましょう。

環境のインストール:

sudo pip install flask

Flask は、WSGI クラス ライブラリである Werkzeug に基づく Python マイクロサービス フレームワークです。

Flask の利点:

Python で書かれている (それが利点になる可能性があります);
使い方が簡単;
柔軟性;
/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()
リクエスト: curl http://127.0.0.1:5000/

Response:

GET /

ようこそ

GET /articles

/記事リスト

GET /articles/123

123件を読んでいます


リクエスト




GETパラメータ

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 /helloHello John DoeGET / hello?name=Luis

Hello Luis


リクエストメソッド(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"

リクエストはリクエストタイプを指定します:

curl -X PATCH http://127.0.0.1:5000/echoGET /echoECHO: GET

POST /ECHO

ECHO: POST

データとヘッダーをリクエストします




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

指定されたコンテンツタイプをリクエストします:

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


レスポンス



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

レスポンスHTTPヘッダーの表示:

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

ステータスコードとエラー


@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/2HTTP/1.0 200 OK {"2": "スティーブ"

}


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

check_auth 関数を置き換え、requires_auth デコレーターを使用します:

@app.route(' /secrets')@requires_authdef api_hello():return "しー、これは極秘のスパイもの!"

HTTP 基本認証:


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

簡単なデバッグとログ



デバッグ:

app.run(debug=True)

ロギング:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。