Tornado POST 405: метод не разрешен

По какой-то причине я не могу использовать методы POST в торнадо.

Даже пример hello_world не работает, когда я меняю GET на POST.

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def post(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Выдает 405, метод не разрешен. Какие-либо предложения?


person Divyanshu Das    schedule 25.09.2013    source источник


Ответы (4)


Вам по-прежнему нужен get, если вы хотите получить доступ к странице, потому что доступ к странице осуществляется с помощью запроса браузера с методом GET.

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def post(self):
        self.write("Hello, world")
    get = post # <--------------

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
person falsetru    schedule 25.09.2013
comment
Мне часто приходится делать так, чтобы get и post вели себя одинаково. Является ли написание get = post правильным способом сделать это? - person andy boot; 30.09.2013
comment
@andyboot, если поведение обоих методов одинаковое, да. - person falsetru; 30.09.2013
comment
это все еще не работает для меня WARNING:tornado.access:405 OPTIONS проверено как с file://, так и с localhost - person Seph Reed; 04.07.2017
comment
@SephReed, пожалуйста, напишите отдельный вопрос с подробностями. Кстати, OPTIONS, а не GET? Попробуйте get = options = post, если вам нужен метод HTTP OPTIONS. - person falsetru; 04.07.2017
comment
Да, это довольно странно. У меня слова ВАРИАНТЫ буквально нигде нет. Создан вопрос: stackoverflow.com/questions/44900282/ - person Seph Reed; 04.07.2017
comment
Я не могу поверить, что это действительно работает... Но это работает, и это просто сэкономило мне несколько жалких часов отладки... - person Kalin Varbanov; 07.03.2019

Ответ Falsetru - полезный совет, и да, вам нужен именно метод get. Но нет, я не думаю, что методы get и post должны вести себя одинаково. Семантика этих двух методов различна. Пожалуйста, ознакомьтесь со спецификациями HTTP http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html и рассмотреть ответ Брабстера на этот вопрос В чем разница между HTTP-Get и HTTP-POST и почему HTTP-POST слабее с точки зрения безопасности .

(извините, мое предложение должно быть лучше комментария к фальшивому ответу, но моя репутация не позволяет)

person Marco De Paoli    schedule 27.01.2014

недавно, я столкнулся с той же проблемой. следующие коды являются моими решениями:

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def set_default_headers(self):
    print('set headers!!')
    self.set_header('Access-Control-Allow-Origin', '*')
    self.set_header('Access-Control-Allow-Headers', '*')
    self.set_header('Access-Control-Max-Age', 1000)
    self.set_header('Content-type', 'application/json')
    self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
    self.set_header('Access-Control-Allow-Headers',
                    'Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, X-Requested-By, Access-Control-Allow-Methods')


def OPTIONS(self):
    pass

def post(self):
    self.write("Hello, world")

application = tornado.web.Application([
(r"/", MainHandler),
])

if __name__ == "__main__":`enter code here`
 application.listen(8888)
 tornado.ioloop.IOLoop.instance().start()
person LeeT    schedule 11.06.2018
comment
Я попробовал это - и теперь страница отображает html-страницу как text вместо ее отображения. у меня хром на айфоне 7 - person WestCoastProjects; 13.02.2020
comment
Для моего приложения строка Content-type, 'application-json' неверна: обратите внимание, что в вашем ответе ее не следует включать для некоторых приложений. - person WestCoastProjects; 13.02.2020

введите описание изображения здесьПример кода, который вы указали в своем вопросе, РАБОТАЕТ. Просто не забудьте отправить POST вместо GET, используя, например, Curl или Postman. Если вы укажете веб-браузеру URL-адрес, он попытается выполнить GET, который вы не определили.

Вы можете не захотеть определять GET для URL. Совершенно законно иметь URL-адрес только для POST, и Tornado, безусловно, позволяет вам это сделать. URL-адрес POST может быть общей точкой отправки для форм, загруженных из многих других мест.

person ChrisCantrell    schedule 20.04.2015
comment
Это не работает. Пожалуйста, перестаньте говорить, что это работает, потому что это не так, эта проблема уже очень раздражает. Запросы POST от Postman или cURL также не работают. Это глубокая проблема в Tornado. - person Sebastialonso; 28.08.2017
comment
Что ж, я проверил это еще раз на еще одной машине. Я скопировал/вставил код из блока вопросов. Затем я запустил его. Затем я запустил POST с Postman в Chrome. Выглядит хорошо. Когда я меняю почтальона, чтобы сделать GET в примере, я получаю ошибку 405. Я попытаюсь вставить изображение в свой исходный ответ. - person ChrisCantrell; 06.09.2017