使用瓶子处理应用程序/json数据

xdnvmnnf  于 2023-03-09  发布在  其他
关注(0)|答案(4)|浏览(136)

我正在尝试使用基于JSON的restful协议为python3应用程序编写一个简单的服务器前端。到目前为止,bottle似乎是最适合这项任务的框架(它支持python3,以一种很好的方式处理方法调度,并且很容易返回JSON)。问题是解析输入请求中的JSON。
文档中只提到了request.fieldsrequest.files,我认为这两个都是指multipart/form-data数据,没有提到直接访问请求数据。
查看源代码,我可以看到一个BytesIO类型的request.body对象。json.load拒绝直接作用于它,在json库中使用can't use a string pattern on a bytes-like object终止。正确的方法可能是首先根据Content-Type HTTP头中指定的字符集将字节解码为unicode字符。我可以看到一个StringIO类,并假设它可能保存字符缓冲区,而不是字节缓冲区,但看不到将BytesIO解码为StringIO的方法,如果这是可能的话。
当然,也可以将BytesIO对象读入字节串,然后在将其传递给JSON解码器之前将其解码为字符串,但如果我理解正确的话,这会破坏整个过程的良好缓冲行为。
或者有没有更好的办法?

x8goxv8g

x8goxv8g1#

下面是我在使用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 =请求会话()
  • r =s.post(“http://youserver.com:8080/location/API?json {"标识号”:“540 a16663 dafb 492 a0 a7626 c”,“值”:“测试”}“)
  • 使用r.text来验证返回的内容。
e7arh2l6

e7arh2l62#

我写了一个助手来使用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

感谢所有人

fjnneemd

fjnneemd3#

如注解(and in a similar SO answer)中所述,request.json方法可从瓶0.1.0中获得。
比如:

@route('/endpoint', method='POST')
def parse():
    body = request.json
    name = body.get('name')
    age = body.get('age')
at0kjp5o

at0kjp5o4#

看起来标准库中的io.TextIOWrapper就能做到这一点!

def parse(request):
    encoding = ... #get encoding from headers
    return json.load(TextIOWrapper(request.body, encoding=encoding))

相关问题