龙卷风(Post方法未找到)

3

我正在尝试在 Tornado Web 服务器中提交表单,但每当我单击提交按钮时,就会生成以下错误:

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

有什么建议吗?

你需要为你的表单提供一个端点(<form method="post" action="/whatever">),然后在请求处理程序中创建该端点(def post(self):)。否则,表单将无法与处理程序通信,或者服务器将无法监听。 - LSerni
你想使用哪个处理程序来处理你的POST请求?(r"/",MainHandler), (r"/room/([a-zA-Z0-9] *)$”,MainHandler), (r"/login",LoginHandler), (r"/logout",LogoutHandler), (r"/socket",ChatSocketHandler), (r"/socket/([a-zA-Z0-9] *)$”,ChatSocketHandler), - jms
3个回答

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方法不允许

如果你想让/login可用于POST,最简单的方法就是像这样在LoginHandler中添加POST:

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

# or this
post = get

@KingAlfredChameleon 如果你想让 LoginHandler 能够处理 POST 请求,你应该修改 LoginHandler。这是你想要的吗? - ljk321
是的!这正是我想要的,但我不知道如何编写代码。 - KingAlfredChameleon
@KingAlfredChameleon 嗯...如果你想简单地实现它,只需要在auth.py中LoginHandler所在的位置调用get(self)方法。查看我编辑后的答案获取代码。 - ljk321
用户登录后,他们将被发送到/room/x。在每个房间中,我都制作了一个表单,用户可以提交内容,我该如何使POST方法在这个表单中起作用? - KingAlfredChameleon
@KingAlfredChameleon 或者你可以创建一个新的 Handler。 - ljk321
显示剩余9条评论

3
唯一可用的方法是 GET,因为您在处理程序子类上定义的唯一方法是 get()。要处理 POST,请定义一个 post() 方法,而不是(或者除了)get()

谢谢Ben,那么我应该如何定义post方法呢? - KingAlfredChameleon
def post(self, room=None):(可能带有异步装饰器),就像您使用“get”一样。 - Ben Darnell
你确定你正在调用正确的处理程序吗?你的表单提交到demo_form.asp,但这并不在你发布的完整代码中。 - Ben Darnell
我忘记编辑demo_form.asp文件了,除此之外,表单的其他方面都很好,而且我肯定是在正确的处理程序中。不过还是感谢你的帮助。 - KingAlfredChameleon

1

在那长时间的聊天后,我已经想到了最适合您的方法,那就是通过cookies传输数据。

以下是教程: http://www.w3schools.com/js/js_cookies.asp

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接