API REST сокол python ПОЧТОВЫЙ МЕТОД - PullRequest
0 голосов
/ 20 января 2020

Я пытался написать 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'

Я использую Почтальон для тестирования API. Я попытался использовать следующее тело в POSTMAN (raw -> JSON)

{
"email":"test"
}

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Как указано в документации

Вы можете использовать необработанное тело запроса JSON, используя media, а также прикрепить 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

Предупреждение:

После вызова медиа по запросу, он будет использовать поток запроса.

1 голос
/ 20 января 2020

сначала используйте req.media для извлечения данных (предложение).
секунду, для ответа используйте resp.body = json.dumps({"test": "answer"})

...