龙卷风 Post 未找到方法

Tornado Post Method Not Found

我正在尝试 post 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):

有什么建议吗?

唯一有效的方法是 GET,因为您在处理程序子类上定义的唯一方法是 get()。要处理 POST,定义一个 post() 方法来代替(或补充)get().

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

首先,原来的 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

如果您希望 POST 可用于 /login,最简单的方法是像这样在 LoginHandler 中添加 POST:

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

# or this
post = get

经过长时间的 window 聊天,我认为最适合您的方法是通过 cookie 传输数据。

这里有教程:http://www.w3schools.com/js/js_cookies.asp

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

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