pythonで汎用restful api serviceを書く(一)


ずっとnodeを使っています.jsはバックエンドをして、徐々に大きなデータの範囲を渉猟して、pythonを迂回することができないことを運命付けて、そのためいくつかの成熟したものをpythonで書き換えることを決定して、1つは構想を開拓して、比較を通じてpythonを深く学ぶことです;二つ目は目標があって、動力があって、根気よく堅持することを望んでいます.
プロジェクト紹介
python言語でrestful api serviceを書き、データベースはmysqlを使用します.バックエンドマイクロサービスのみを行い、ORMの実装方式はSQLを自動的に生成する方式で完了するため、軽量級のflaskをwebフレームワークとして選択した.このような選択は、主な目的は中小規模のネットワーク応用に対して、関係データベースの様々な優位性を十分に利用し、豊富な現代のインターネット応用を実現することである.
restful api
restful apiの概念は紹介しません.ここでは、プロトコル形式を実装します.
[GET]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen         
[POST]/rs/user[/{id}]         
[PUT]/rs/user/{id}
[DELETE]/rs/user/{id}/key1/value1/key2/value2/.../keyn/valuen

説明:
  • rsはリソース識別である.
  • 第2節、userは、データベーステーブル名として解析されます.
  • クエリーの場合、idが空または0の場合、idは無視されます.すなわち、リストクエリーです.
  • の新規作成と変更により、formフォームの受信に加えてurlのidパラメータもパラメータセットにマージされます.
  • 同じクエリを削除します.

  • flaskに正規表現をサポートさせる
    flaskのデフォルトのルーティングは正規表現をサポートしていませんが、完全なURLを切り取って自分で解析する必要があります.クエリーを経て、以下の手順で簡単にタスクを完了することができます.
  • 使用werkzeugライブラリ:from werkzeug.routing import BaseConverter
  • 定義変換器:
  • class RegexConverter(BaseConverter):
        def __init__(self, map, *args):
            self.map = map
            self.regex = args[0]
  • 登録変換器:app.url_map.converters['regex'] = RegexConverter
  • url:@appを正則で切り取る.route('/rs/', methods=['PUT', 'DELETE', 'POST', 'GET'])

  • 質問:
  • 正則(.*)理論的には任意の除車のすべての文字に一致するはずですが、なぜか、ここでは疑問符(?)が認識されません.
  • 私はrequestを使います.Dataはフォームデータを取得します.なぜrequestですか.form取れないの?
  • '/rs/"):query_url>'の後にスラッシュ('/rs/"):query_url>/'),request.dataではデータが取れません.なぜですか.

  • 解析jsonデータ
    jsonデータの解析は簡単ですが、クライアントから送られてきたデータを検証する必要があります.次は異常処理で一度だけ解析するソリューションです.
    def check_json_format(raw_msg):
        try:
            js = json.loads(raw_msg, encoding='utf-8')
        except ValueError:
            return False, {}
        return True, js

    URL解析
    既定プロトコルに従ってURLを解析し、テーブル名を抽出し、sql組合せパラメータセットを生成します.
    @app.route('/rs/', methods=['PUT', 'DELETE', 'POST', 'GET'])
    def rs(query_url):
        (flag, params) = check_json_format(request.data)
    
        urls = query_url.split('/')
        url_len = len(urls)
        if url_len < 1 or url_len > 2 and url_len % 2 == 1:
            return "The params is wrong."
    
        ps = {}
        for i, al in enumerate(urls):
            if i == 0:
                table = al
            elif i == 1:
                idd = al
            elif i > 1 and i % 2 == 0:
                tmp = al
            else:
                ps[tmp] = al
    
        ps['table'] = table
        if url_len > 1:
            ps['id'] = idd
        if request.method == 'POST' or request.method == 'PUT':
            params = dict(params, **{'table': ps.get('table'), 'id': ps.get('id')})
        if request.method == 'GET' or request.method == 'DELETE':
            params = ps
        return jsonify(params)

    pycharmプロジェクト構成
    Run/Debug Configurationsを構成しておくと、IDEで実行して単一ステップでデバッグすることができ、flaskフレームワークの動作原理を熟知することができます.
  • Script path :/usr/local/bin/flask
  • Parameters : run
  • 環境変数
  • FLASK_APP = index.py
  • LC_ALL = en_US.utf-8
  • LANG = en_US.utf-8


  • 上の3つを配置すれば動作すると思っていたが、端末シミュレータで正常に動作しているからだ.その結果、IDEには不思議なエラーが山積し、よく見ると、符号化構成の問題かもしれません.検索すると、pythonバージョン2と3の違いのため、次の2つの環境変数を構成する必要があります.
    完全なコード
    git clone https://github.com/zhoutk/pyrest.git
    cd pyrest
    export FLASK_APP=index.py
    flask run

    小結
    今日flaskを利用してwebインフラストラクチャを完成して、URLを正しく解析することができて、クライアントが提出したデータを抽出して、要求の異なる方式によって私達の必要なデータを組み合わせます.