猎鹰无法阅读请求体

时间:2018-02-07 12:18:29

标签: python-3.x rest gunicorn

我正在尝试使用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.11

app.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,但这对我没有帮助。

1 个答案:

答案 0 :(得分:3)

行为发生是因为你的

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''