2

我正在尝试使用基于 JSON 的宁静协议为 python3 应用程序编写一个简单的服务器前端。到目前为止,bottle似乎是最适合该任务的框架(它支持 python3,以一种很好的方式处理方法分派,并且很容易返回 JSON。)问题在于解析输入请求中的 JSON。

文档只提到request.fieldsand request.files,我假设两者都指的是 multipart/form-data 数据。没有提到直接访问请求数据。

查看源代码,我可以看到一个request.bodyBytesIO 类型的对象。json.load拒绝直接对其采取行动,在 json 库中以can't use a string pattern on a bytes-like object. Content-Type正确的方法可能是首先根据HTTP 标头中指定的字符集将字节解码为 un​​icode 字符。我不知道该怎么做;我可以看到一个 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']

然后进行测试

于 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 回答