我正在为一个小型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,我会非常感激的。
谢谢
环境:OSXSieryPython3.5.2 Falcon和其他是Pip的最新版本
发布于 2016-10-10 09:14:11
如果其他代码已经到位,您的代码应该可以工作。快速测试(文件名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"}'
发布于 2017-07-30 15:50:37
您必须在read()返回的字节上使用类似于req.stream.read().encode('utf-8')的内容调用req.stream.read().encode('utf-8')。
这样,字节就会像json.loads()所期望的那样转换为str。
另一种不去理会所有这些无聊和容易出错的编码/解码和字节/str( BTW在Py2和Py3中不同)的方法是使用simplejson作为json的替代品。它与API兼容,所以唯一的改变就是在代码中用import simplejson as json替换import simplejson as json。
此外,它还简化了代码,因为可以使用json.load(req.bounded_stream)来读取正文,这比json.loads(req.bounded_stream.read().encode('utf-8'))短得多,可读性强得多。
现在我这样做了,不再使用标准的json模块了。
https://stackoverflow.com/questions/39946770
复制相似问题