Возврат ответа на запрос Tornado POST

Я видел документацию и примеры Tornado, где метод self.write широко используется для отображения некоторого значения в HTML, где запрос POST выполнялся в обработчике. Но я не мог найти ясности в том, как вернуть ответ клиенту.

Например, я вызываю POST-запрос на сервере Tornado со своего клиента. Код, который принимает почтовый запрос:

class strest(tornado.web.RequestHandler):
    def post(self):
        value = self.get_argument('key')
        cbtp = cbt.main(value)

С помощью этого я могу найти значение cbtp, а с помощью self.write(cbtp) я могу распечатать его в HTML. Но вместо этого я хочу вернуть это значение клиенту в формате JSON, например {'cbtp':cbtp} Я хочу знать, как изменить свой код, чтобы этот ответ был отправлен клиенту, или дать мне какую-нибудь документацию, где это подробно объясняется.

Делать что-то вроде

res = {cbtp: cbtp}
return cbtp

бросает BadYieldError: yielded unknown object


person harshvardhan    schedule 20.06.2018    source источник


Ответы (2)


Вам просто нужно установить тип вывода как JSON, и json.dumps ваш вывод.

Обычно у меня есть set_default_headers в родительском классе с именем RESTRequestHandler. Если вам нужен только один запрос, который возвращает JSON, вы можете установить заголовки в почтовом вызове.

class strest(tornado.web.RequestHandler):
    def set_default_headers(self):
        self.set_header("Content-Type", 'application/json')

    def post(self):
        value = self.get_argument('key')
        cbtp = cbt.main(value)
        r = json.dumps({'cbtp': cbtp})
        self.write(r)
person Michael Robellard    schedule 20.06.2018
comment
В дополнение к этому ответу я хотел бы упомянуть, что если вы хотите отправить dict только как JSON, вы можете просто использовать self.write({'cbtp': cbtp}), и Tornado автоматически отправит его как JSON, позаботившись о заголовках и все такое. Код будет короче. Но если вы также хотите отправлять списки в формате JSON, то этот ответ — единственный выход. Источник: tornadoweb.org/en/stable/ - person xyres; 20.06.2018

Если данный фрагмент является словарем, мы пишем его как JSON и устанавливаем Content-Type ответа как application/json. (если вы хотите отправить JSON как другой Content-Type, вызовите set_header после вызова write()).

Его использование должно дать вам именно то, что вы хотите:

self.write(json.dumps({'cbtp': cbtp}))
person Milovan Tomašević    schedule 08.02.2021