For some reason, I am not able to use post methods in torando.
Even the hello_world example does not work when I change get to 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()
It throws 405 method not allowed.
Any suggestions ?
You still need get
if you want access the page, because access the page using browser request with GET
method.
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()
Falsetru answer is a useful hint and yes, what you need is exactly a get method. But no, I don't think get and post method should behave the same. The semantics of the two methods is different. Please have a look at the HTTP specs http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html and consider Brabster answer to this question What is the difference between a HTTP-Get and HTTP-POST and why is HTTP-POST weaker in terms of security.
(sorry, my sentence should be better a comment to falsetru answer but my reputation don't allow)
recently, I have met the same problem. the following codes are my solutions:
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()
The example code you gave in your question DOES work. Just be sure to send a POST instead of GET using Curl or Postman, for instance. If you point a web-browser to the URL it will attempt a GET, which you haven't defined.
You may not want to define a GET for the URL. It is perfectly legal to have a POST-only URL, and Tornado certainly allows you to. The POST url might be a common submission point for forms loaded from many other locations.