繁体   English   中英

Tornado POST 405:不允许的方法

[英]Tornado POST 405: Method Not Allowed

出于某种原因,我无法在龙卷风中使用 POST 方法。

当我将 GET 更改为 POST 时,即使hello_world示例也不起作用。

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 方法不允许”。 有什么建议吗?

如果您想访问该页面,您仍然需要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()

Falsetru 答案是一个有用的提示,是的,您需要的正是 get 方法。 但是不,我认为 get 和 post 方法的行为不应该相同。 这两种方法的语义是不同的。 请查看 HTTP 规范http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html并考虑 Brabster 对此问题的回答HTTP-Get 和 HTTP-POST 之间有什么区别,为什么是HTTP-POST 在安全性方面较弱

(对不起,我的句子应该更好地评论 falsetru 答案,但我的声誉不允许)

最近,我遇到了同样的问题。 以下代码是我的解决方案:

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()

在此处输入图片说明 您在问题中给出的示例代码确实有效。 例如,请务必使用 Curl 或 Postman 发送 POST 而不是 GET。 如果您将 Web 浏览器指向 URL,它将尝试您尚未定义的 GET。

您可能不想为 URL 定义 GET。 拥有仅 POST 的 URL 是完全合法的,Tornado 当然允许您这样做。 POST url 可能是从许多其他位置加载的表单的常见提交点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM