我正在尝试读取一个包含JSON数据的简单请求体。
请求正文:
[
{
...data
},
{
...data
}
]当我尝试时(在EventResource中)
def on_post(self, req, resp):
print(req.stream.read())以下内容已登录到控制台:b''
我不知道我做错了什么,也不知道为什么它没有显示我的身体数据。我看到的每个例子,当这样做时,它实际上记录的是数据,而不是我得到的数据。
Requirements.txt (可能有些断章取义,但我已经添加了完整的列表,只是为了确保。)
astroid==1.5.3
bson==0.5.0
cffi==1.11.2
click==6.7
falcon==1.4.1
falcon-auth==1.1.0
falcon-jsonify==0.1.1
Flask==0.12.2
greenlet==0.4.12
gunicorn==19.7.1
isort==4.2.15
itsdangerous==0.24
Jinja2==2.10
lazy-object-proxy==1.3.1
MarkupSafe==1.0
mccabe==0.6.1
mimeparse==0.1.3
mongoengine==0.15.0
pycparser==2.18
PyJWT==1.5.3
pylint==1.7.4
pymongo==3.5.1
python-mimeparse==1.6.0
pytz==2017.3
readline==6.2.4.1
six==1.11.0
Werkzeug==0.12.2
wrapt==1.10.11app.py
api = falcon.API(middleware=[
falcon_jsonify.Middleware(help_messages=settings.DEBUG)
])routes.py
from app import api
from resources.event import EventResource
from resources.venue import VenueResource
# EventResources
api.add_route('/api/event', EventResource())
api.add_route('/api/event/{event_id}', EventResource())
api.add_route('/api/venue/{venue_id}/events', EventResource())
# VenueResources
api.add_route('/api/venue', VenueResource())
api.add_route('/api/venue/{venue_id}', VenueResource())
api.add_route('/api/event/{event_id}/venue', VenueResource())我和gunicorn routes:api --reload一起运行我的项目
POST请求示例(记录b''):
curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:8000/api/event我唯一添加的标头是Content-Type/application/json
我已经通读了this,但它对我没有帮助。
发布于 2018-02-21 01:19:28
这种行为的发生是因为你的
falcon_jsonify.Middleware(help_messages=settings.DEBUG)流已被它读取。在这种情况下,您需要使用req.json。如果删除中间件,则req.stream.read()将正确返回值。如果您查看中间件的process_request方法
def process_request(self, req, resp):
if not req.content_length:
return
body = req.stream.read()
req.json = {}
self.req = req
req.get_json = self.get_json
try:
req.json = json.loads(body.decode('utf-8'))
except ValueError:
self.bad_request("Malformed JSON", "Syntax error")
except UnicodeDecodeError:
self.bad_request("Invalid encoding", "Could not decode as UTF-8")您可以看到,中间件读取主体,然后在req.json中输出与解析对象相同的内容。但原始正文不会保存在其他任何地方。一旦请求流被读取,你就清空了它的缓冲区,不会再得到数据。因此你得到了b''
https://stackoverflow.com/questions/48663623
复制相似问题