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模块。
我正在为一个小型 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模块。