0

我尝试使用 falcon 编写 API REST。

on_get 方法效果很好,但是在使用 on_post 时,我无法获取 POST 请求的正文,我不知道为什么

class ProfileUpdate(object):
    def on_post(self, req, resp):
        data = json.load(req.stream)
        print(data)
        resp.body = {"test": "answer"}
        resp.status = falcon.HTTP_200
        return resp


def setup_profile():
    app = falcon.API()

    profile_update = ProfileUpdate()
    app.add_route('/profiles', profile_update)

    return app

我收到以下错误

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 135, in handle
    self.handle_request(listener, req, client, addr)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 176, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/usr/local/lib/python3.7/site-packages/falcon/api.py", line 318, in __call__
    body, length = self._get_body(resp, env.get('wsgi.file_wrapper'))
  File "/usr/local/lib/python3.7/site-packages/falcon/api.py", line 820, in _get_body
    body = body.encode('utf-8')
AttributeError: 'dict' object has no attribute 'encode'

我正在使用 Postman 来测试 API。我尝试在 POSTMAN 中使用以下正文(原始-> JSON)

{
"email":"test"
}

我错过了什么?

4

2 回答 2

5

文档中所述

您可以使用请求原始正文 JSONmedia并附media加到响应。

如果您要创建 JSON API,则需要零配置。只需根据需要访问或设置媒体属性,让 Falcon 为您完成繁重的工作。

class EchoResource:
    def on_post(self, req, resp):
        message = req.media.get("message")
        resp.media = {
            "message": message
        }
        resp.status = falcon.HTTP_200

警告:

一旦对请求调用媒体,它将使用请求的流。

于 2020-01-24T14:37:11.217 回答
1

首先,req.media用于检索数据(建议)。
其次,对于响应,使用resp.body = json.dumps({"test": "answer"})

于 2020-01-20T10:44:55.383 回答