2

安らかなJSONベースのプロトコルを使用して、python3アプリケーションに単純なサーバーフロントエンドを作成しようとしています。これまでのところ、bottleはタスクに最適なフレームワークのようです(python3をサポートし、メソッドディスパッチを適切に処理し、JSONを簡単に返します)。問題は、入力リクエストでJSONを解析することです。

ドキュメントには言及されているだけrequest.fieldsrequest.files、両方ともマルチパート/フォームデータデータを参照していると思います。リクエストデータに直接アクセスすることについては言及されていません。

ソースコードを覗いてrequest.bodyみると、BytesIO型のオブジェクトが見えます。json.load直接それに基づいて行動することを拒否し、jsonlibで。を使用して死にcan't use a string pattern on a bytes-like objectます。Content-Typeこれを行う適切な方法は、 HTTPヘッダーで指定された文字セットに従って、最初にバイトをUnicode文字にデコードすることです。私はそれを行う方法がわかりません。StringIOクラスを見ることができ、バイトではなく文字のバッファーを保持している可能性があると想定できますが、これが可能であるとしても、BytesIOをStringIOにデコードする方法はわかりません。

もちろん、BytesIOオブジェクトをバイト文字列に読み込んでから文字列にデコードしてからJSONデコーダーに渡すことも可能ですが、正しく理解していれば、全体の優れたバッファリング動作が損なわれます。

それともそれを行うためのより良い方法はありますか?

4

3 に答える 3

2

標準ライブラリのio.TextIOWrapperがうまくいくようです!

def parse(request):
    encoding = ... #get encoding from headers
    return json.load(TextIOWrapper(request.body, encoding=encoding))
于 2011-04-20T12:38:27.013 に答える
0

Python3とBottleを使用したRESTfulサービスでjsonを読み取るために私が行うことは次のとおりです。

bson.json_utilをbson_jsonとしてインポートします

@app.post('/location/API')
def post_json_example():
    """
    param: _id, value
    return: I usually return something like {"status": "successful", "message": "discription"}
    """

    query_string = bottle.request.query.json
    query_dict = bson_json.loads(query_string)
    _id = query_dict['_id']
    value = query_dict['value']

次にテストします

  • python3インタープリターから、インポートリクエスト
  • s = request.Session()
  • r = s.post(' http://youserver.com:8080/location/API?json {"_id": "540a16663dafb492a0a7626c"、 "value": "test"}')
  • r.textを使用して、何が返されたかを確認します。
于 2014-09-09T15:35:30.140 に答える
0

私はb0fhの良いアイデアを使うためにヘルパーを書きました。response.jsonの分析を2週間行った後、StackOver Flowに接続し、回避策が必要であることを理解しました

ここは:

def json_app_rqt():
    # about request
    request.accept = 'application/json, text/plain; charset=utf-8'

def json_app_resp():
    # about response
    response.headers['Access-Control-Allow-Origin'] = _allow_origin
    response.headers['Access-Control-Allow-Methods'] = _allow_methods
    # response.headers['Access-Control-Allow-Headers'] = _allow_headers
    response.headers['Content-Type'] = 'application/json; charset=utf-8'

def json_app():
    json_app_rqt()
    json_app_resp()

def get_json_request(rqt):
    with TextIOWrapper(rqt.body, encoding = "UTF-8") as json_wrap:
        json_text = ''.join(json_wrap.readlines())
        json_data = json.loads(json_text)
        return json_data

使用するために、私たちはすることができます:

if __name__ == "__main__":

    json_app()

    @post("/train_control/:control")
    def do_train_control(control):
        json_app_resp()

        data = get_json_request(request)
        print(json.dumps(data))

        return data

ありがとうございます

于 2017-06-25T07:07:23.173 に答える