Flaskバックエンド実践連載三インターフェースの標準化とグローバル化


Flaskインタフェースの標準化とグローバル化
tips:
  • 本文は主にプロジェクトの中で歴史が残した問題を解決し、製品を正規化し、統一インタフェースを返し、グローバル化を実現する.
  • python 3に基づいて
  • を記述する
  • コードウェアハウス
  • プロジェクトシーン
    ある日、私はついに前の人が穴を掘ることに耐えられなくて、怒っています!!!V 1バージョンのプロジェクトrestfulインタフェースはめちゃくちゃで、固定的なフォーマットがなく、フロントエンドの大物も何度も文句を言っている.私の積極的な誘いの下で、プロジェクトマネージャーはプロジェクトを書き直して、多くの歴史の残した問題を解決することにしました(泣きたいほど多くて、自分で探しています).
    インタフェース統合戻り形式
  • ネットワーク上には、エラー符号化、情報、およびデータ
  • を含む一般的なインタフェース応答メッセージが多数含まれる.
  • 類似定義は、
    {
    	"code":0,
    	"msg":"  ",
    	"data":null
    }
    
  • code:応答状態コード
  • を表す
  • msg:応答メッセージを表す
  • data:応答データ
  • を表す
    レスポンスステータスコードおよびレスポンスメッセージ
  • 成功クラス、0および200の先頭の数字
  • を含む
    エンコーディング
    意味
    0
    成功
    20001
    ログイン成功

  • エラークラス、400先頭の数字
  • エンコーディング
    意味
    -1
    失敗
    40000
    カスタムエラー("{model}not have{key}")
    40001
    アカウントまたはパスワードエラー
    40002
    無効なパラメータ
    40003
    関連リソースが見つかりません

  • サーバエラークラス、500先頭の数値
  • エンコーディング
    意味
    50001
    サーバーエラー、管理者に連絡してください
    50002
    計算エラー


    Flaskインタフェースリターン設計
  • 応答コードクラスおよび応答メッセージクラス(code.py)
    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 =  "       "
    
  • を記述する
  • Flaskインタフェースリターンインスタンス(app.py)
    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":" "}
  • を返します.
  • 応答テキスト(response.py)をさらにカプセル化し、重複コードの記述量を低減し、コードクリーニング
    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":" "}
  • を返します.
  • グローバル化構成実装構想は、2つの異なる応答メッセージを作成し、フロントエンドが言語を選択することによって、バックエンドが対応する言語のメッセージを返すことである.従ってyamlを用いて応答メッセージを記述し,Flaskアプリケーションにロードし,言語選択により異なる言語メッセージを返す.私の別の記事「Flaskバックエンド実践連載一ロードyamlプロファイル」では、Flaskロード構成yamlファイルを紹介しています.
  • 作成msg.yaml,中国語応答メッセージ(zh_CN),英語応答メッセージ(en)
    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"
    
    
  • 修正(response.py)、ResponseMessageクラス
    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
    
    
  • を使用しない
  • (app.py)コンテンツを変更し、読み出し応答メッセージ構成
    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"}注意:
  • headersのlangパラメータ値とmsg.yamlの言語設定は同じ
  • msg.yamlの応答状態コードはResponseCode符号化と一致する
  • まとめ
  • は、統一リターンインタフェースをカスタマイズすることにより、プロジェクトにおけるインタフェース応答テキストの混乱を解決し、前後端の開発効率を向上させる
  • .
  • は応答メッセージの構成化を実現し、他の言語バージョンのインタフェース
  • を開発するのに極めて便利である.
  • は応答テキストの統一パッケージを実現し、重複コードを減らし、コードの簡潔度を高める
  • を実現した.
  • 次の記事では、FlaskRestful応答インタフェースのカプセル化とカスタムjson戻りタイプ
  • の実装方法について説明します.