Falcon 解析 json 错误

Falcon parsing json error

我正在为一个小型 api 项目试用 Falcon。不幸的是,我被困在 json 文档示例中的解析内容和代码不起作用。

我已经尝试了很多在 Stack 和 Google 上找到的东西,但没有任何改变。 我尝试了以下导致以下错误的代码

import json
import falcon

class JSON_Middleware(object):
    def process_request(self, req, resp):
       raw_json = json.loads(req.stream.read().decode('UTF-8'))
       """Exception: AttributeError: 'str' object has no attribute 'read'"""

       raw_json = json.loads(req.stream.read(), 'UTF-8')
       """Exception: TypeError: the JSON object must be str, not 'bytes'"""

       raw_json = json.loads(req.stream, 'UTF-8')
       """TypeError: the JSON object must be str, not 'Body'"""

我快要放弃了,但如果有人能告诉我为什么会这样,以及如何在 Falcon 中解析 JSON,我将非常感激。

谢谢

环境: OSX 塞拉利昂 Python 3.5.2 Falcon 和其他是 Pip

的最新版本

如果有其他代码片段,您的代码应该可以工作。快速测试(文件名 app.py):

import falcon
import json

class JSON_Middleware(object):
    def process_request(self, req, resp):
       raw_json = json.loads(req.stream.read())
       print raw_json

class Test:
    def on_post(self,req,resp):
        pass

app = application = falcon.API(middleware=JSON_Middleware())
t = Test()
app.add_route('/test',t)

运行 与:gunicorn app
$ curl -XPOST 'localhost:8000' -d '{"Hello":"wold"}'

您必须对 read() 返回的字节调用 encode(),例如 req.stream.read().encode('utf-8')

通过这种方式,字节将按照 json.loads() 的预期转换为 str。

另一种不用担心所有这些无聊且容易出错的 encode/decode 和 bytes/str 东西(顺便说一句,Py2 和 Py3 不同)的方法是使用简单的 json 作为json 的替代品。它与 API 兼容,所以唯一的变化是在您的代码中将 import json 替换为 import simplejson as json

此外,它简化了代码,因为阅读正文可以用 json.load(req.bounded_stream) 完成,它比 json.loads(req.bounded_stream.read().encode('utf-8')).

更短且更易读

我现在就是这样做的,不再使用标准的json模块。