未找到龙卷风邮政方法

时间:2015-01-14 20:15:39

标签: tornado

我正在尝试在Tornado网络服务器上发布表单,但每当我点击提交时都会生成以下错误

405 Method Not Allowed

这是表格

<form method="post">
  First name: <input type="text" name="fname"><br>
  Last name: <input type="text" name="lname"><br>
  <input type="submit" value="Submit">
</form>

我尝试将主要请求处理程序上的“get”方法更改为“post”,但它不起作用。唯一有效的方法是GET,

class MainHandler(BaseHandler):
    """
    Main request handler for the root path and for chat rooms.
    """

    @tornado.web.asynchronous
    def get(self, room=None):

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

唯一有效的方法是GET,因为您在处理程序子类上定义的唯一方法是get()。要处理POST,请定义post()方法,而不是(或除此之外)get()

答案 1 :(得分:3)

我下载了示例项目并自行运行。我想我已经取得了一些进展。

首先,原始的MainHandler无法处理POST请求。根据代码,它处理/room/1/room/2之类的请求。

其次,我认为您正在尝试模仿登录表单。但是,登录表单使用GET方法,/login作为端点:

<form class="form-inline" action="/login" method="get">

我猜您还将表单放在index.html中,其URL实际为/login(如果未登录)或/room/X(已登录)。所以你可能正在登陆LoginHandler。

第三,当我在MainHandler中添加post方法并向/room/1发送POST请求时,它实际上正在工作并触发500内部错误。

我使用curl来测试几个案例。如果您尝试在/上向MainHandler发送POST请求,则它甚至不响应!因为,如前所述,get被定义为get(self,room = None)。它只接受/room/X

如果您在/room/login上试用,则回复为405 Method Not Allowed

如果你想为/login提供POST,最简单的方法是在LoginHandler中添加POST,如下所示:

@tornado.web.asynchronous
def post(self):
    self.get()

# or this
post = get

答案 2 :(得分:1)

在那个漫长的聊天窗口之后,我发现最好的方法是通过cookie传输数据。

这是一个教程:http://www.w3schools.com/js/js_cookies.asp

另一种资源是将您的数据细分为多个部分。

一种方法是向端点发出请求,为您分配唯一ID。然后以?id=XXX&page=1&data=...形式发送一系列请求,然后用?id=XXX&total_pages=27关闭它,此时您将在服务器上组合不同的部分。