Flaskバックエンド実践連載三インターフェースの標準化とグローバル化
28678 ワード
Flaskインタフェースの標準化とグローバル化
tips:本文は主にプロジェクトの中で歴史が残した問題を解決し、製品を正規化し、統一インタフェースを返し、グローバル化を実現する. python 3に基づいて を記述するコードウェアハウス プロジェクトシーン
ある日、私はついに前の人が穴を掘ることに耐えられなくて、怒っています!!!V 1バージョンのプロジェクトrestfulインタフェースはめちゃくちゃで、固定的なフォーマットがなく、フロントエンドの大物も何度も文句を言っている.私の積極的な誘いの下で、プロジェクトマネージャーはプロジェクトを書き直して、多くの歴史の残した問題を解決することにしました(泣きたいほど多くて、自分で探しています).
インタフェース統合戻り形式ネットワーク上には、エラー符号化、情報、およびデータ を含む一般的なインタフェース応答メッセージが多数含まれる.類似定義は、 code:応答状態コード を表す msg:応答メッセージを表す data:応答データ を表す
レスポンスステータスコードおよびレスポンスメッセージ成功クラス、0および200の先頭の数字 を含む
エンコーディング
意味
0
成功
20001
ログイン成功
…
…エラークラス、400先頭の数字 エンコーディング
意味
-1
失敗
40000
カスタムエラー("{model}not have{key}")
40001
アカウントまたはパスワードエラー
40002
無効なパラメータ
40003
関連リソースが見つかりません
…
…サーバエラークラス、500先頭の数値 エンコーディング
意味
50001
サーバーエラー、管理者に連絡してください
50002
計算エラー
…
…
Flaskインタフェースリターン設計応答コードクラスおよび応答メッセージクラス(code.py) を記述する Flaskインタフェースリターンインスタンス(app.py) を返します.応答テキスト(response.py)をさらにカプセル化し、重複コードの記述量を低減し、コードクリーニング を返します.グローバル化構成実装構想は、2つの異なる応答メッセージを作成し、フロントエンドが言語を選択することによって、バックエンドが対応する言語のメッセージを返すことである.従ってyamlを用いて応答メッセージを記述し,Flaskアプリケーションにロードし,言語選択により異なる言語メッセージを返す.私の別の記事「Flaskバックエンド実践連載一ロードyamlプロファイル」では、Flaskロード構成yamlファイルを紹介しています. 作成msg.yaml,中国語応答メッセージ(zh_CN),英語応答メッセージ(en) 修正(response.py)、ResponseMessageクラス を使用しない(app.py)コンテンツを変更し、読み出し応答メッセージ構成 を追加する
appの実行、アクセスhttp://127.0.0.1:5000/、postmanで異なるリクエストヘッダを設定し、中国語(headers中lang=zh_CN): headersのlangパラメータ値とmsg.yamlの言語設定は同じ msg.yamlの応答状態コードはResponseCode符号化と一致する まとめは、統一リターンインタフェースをカスタマイズすることにより、プロジェクトにおけるインタフェース応答テキストの混乱を解決し、前後端の開発効率を向上させる .は応答メッセージの構成化を実現し、他の言語バージョンのインタフェース を開発するのに極めて便利である.は応答テキストの統一パッケージを実現し、重複コードを減らし、コードの簡潔度を高める を実現した.次の記事では、FlaskRestful応答インタフェースのカプセル化とカスタムjson戻りタイプ の実装方法について説明します.
tips:
ある日、私はついに前の人が穴を掘ることに耐えられなくて、怒っています!!!V 1バージョンのプロジェクトrestfulインタフェースはめちゃくちゃで、固定的なフォーマットがなく、フロントエンドの大物も何度も文句を言っている.私の積極的な誘いの下で、プロジェクトマネージャーはプロジェクトを書き直して、多くの歴史の残した問題を解決することにしました(泣きたいほど多くて、自分で探しています).
インタフェース統合戻り形式
{
"code":0,
"msg":" ",
"data":null
}
レスポンスステータスコードおよびレスポンスメッセージ
エンコーディング
意味
0
成功
20001
ログイン成功
…
…
意味
-1
失敗
40000
カスタムエラー("{model}not have{key}")
40001
アカウントまたはパスワードエラー
40002
無効なパラメータ
40003
関連リソースが見つかりません
…
…
意味
50001
サーバーエラー、管理者に連絡してください
50002
計算エラー
…
…
Flaskインタフェースリターン設計
class ResponseCode(object):
SUCCESS = 0 #
FAIL = -1 #
NO_RESOURCE_FOUND = 40001 #
INVALID_PARAMETER = 40002 #
ACCOUNT_OR_PASS_WORD_ERR = 40003 #
class ResponseMessage(object):
SUCCESS = " "
FAIL = " "
NO_RESOURCE_FOUND = " "
INVALID_PARAMETER = " "
ACCOUNT_OR_PASS_WORD_ERR = " "
from flask import Flask,jsonify
from code import ResponseCode,ResponseMessage
app =Flask(__name__)
@app.route("/",methods=["GET"])
def test():
test_dict = dict(name="zhang",age=18)
data=dict(code=ResponseCode.SUCCESS,
msg=ResponseMessage.SUCCESS,
data=test_dict)
return jsonify(data)
if __name__=="__main__":
app.run()
appを実行し、アクセスhttp://127.0.0.1:5000/{"code":0,"data":{"age":18,"name":"zhang"},"msg":" "}
class ResMsg(object):
"""
"""
def __init__(self, data=None, code=ResponseCode.SUCCESS,
msg=ResponseMessage.SUCCESS):
self._data = data
self._msg = msg
self._code = code
def update(self, code=None, data=None, msg=None):
"""
:param code:
:param data:
:param msg:
:return:
"""
if code is not None:
self._code = code
if data is not None:
self._data = data
if msg is not None:
self._msg = msg
def add_field(self, name=None, value=None):
"""
,
:param name:
:param value:
:return:
"""
if name is not None and value is not None:
self.__dict__[name] = value
@property
def data(self):
"""
:return:
"""
body = self.__dict__
body["data"] = body.pop("_data")
body["msg"] = body.pop("_msg")
body["code"] = body.pop("_code")
return body
appにおいて応答テキストカプセルfrom flask import Flask, jsonify
from code import ResponseCode, ResponseMessage
from response import ResMsg
app = Flask(__name__)
@app.route("/", methods=["GET"])
def test():
res = ResMsg()
test_dict = dict(name="zhang", age=18)
res.update(data=test_dict)
return jsonify(res.data)
if __name__ == "__main__":
app.run()
を用いてappを実行し、アクセスするhttp://127.0.0.1:5000/{"code":0,"data":{"age":18,"name":"zhang"},"msg":" "}
zh_CN: &zh
0: " "
-1: " "
40001: " "
40002: " "
40003: " "
en:
<<: *zh
#
0: "success"
-1: "fail"
40001: "No resources found"
40002: "Invalid argument"
40003: "Incorrect account or password"
from code import ResponseCode
from flask import request, current_app
class ResMsg(object):
"""
"""
def __init__(self, data=None, code=ResponseCode.SUCCESS, rq=request):
# , , , ,
self.lang = rq.headers.get("lang",
current_app.config.get("LANG", "zh_CN")
)
self._data = data
self._msg = current_app.config[self.lang].get(code, None)
self._code = code
def update(self, code=None, data=None, msg=None):
"""
:param code:
:param data:
:param msg:
:return:
"""
if code is not None:
self._code = code
# , None
self._msg = current_app.config[self.lang].get(code, None)
if data is not None:
self._data = data
if msg is not None:
self._msg = msg
def add_field(self, name=None, value=None):
"""
,
:param name:
:param value:
:return:
"""
if name is not None and value is not None:
self.__dict__[name] = value
@property
def data(self):
"""
:return:
"""
body = self.__dict__
body["data"] = body.pop("_data")
body["msg"] = body.pop("_msg")
body["code"] = body.pop("_code")
return body
from flask import Flask, jsonify
import yaml
from code import ResponseCode
from response import ResMsg
app = Flask(__name__)
with open("msg.yaml", encoding="utf-8") as f:
msg_conf = yaml.safe_load(f)
app.config.update(msg_conf)
@app.route("/", methods=["GET"])
def test():
res = ResMsg()
test_dict = dict(name="zhang", age=18)
# ,
res.update(code=ResponseCode.SUCCESS, data=test_dict)
return jsonify(res.data)
if __name__ == "__main__":
app.run()
appの実行、アクセスhttp://127.0.0.1:5000/、postmanで異なるリクエストヘッダを設定し、中国語(headers中lang=zh_CN):
{ "code": 0,"data": {"age": 18,"name": "zhang"},"lang": "zh_CN","msg": " "}
英語(headers中lang=en):{ "code": 0,"data": {"age": 18,"name": "zhang"},"lang": "en","msg": "success"}
注意: