用Python Tornado发起Ajax请求时出现405错误
我有一些JavaScript代码,它通过JavaScript(不使用任何库)向一个在不同端口上运行的本地网站发送“POST”请求。如果那个网站运行的是mod_python的应用程序,那一切都正常。但如果它运行的是Tornado的应用程序,就会出现405错误。我已经确保在处理程序中实现了post()和options()方法,但仍然出错。既然在mod_python下可以正常工作,那在Tornado下也应该可以。有谁知道怎么让Tornado接受来自同一个IP但不同端口的请求吗?(我只是为了测试在本地做这个,完全不在乎安全问题)。
2 个回答
这里发生了一些奇怪的事情,但不是你想的那样。
对于Ajax来说,同源策略实际上会阻止向任何不同的地址发送请求,即使那个地址只是端口号不同。你可以查看维基百科对这个策略的定义。
所以问题实际上是,为什么看起来mod_python版本可以正常工作?比如说,你确定mod_python在你认为的那个端口上监听吗?你的Javascript代码是什么样的,它是如何确定要发送到哪里去的?
我们需要看看你的RequestHandler对象,以及你在Tornado中是如何处理URL的。根据我的了解,只有缺少HTTP方法的实现或者没有定义options(),才会导致Tornado返回405错误。
也许问题不是你没有实现正确的方法,而是你调用的URL并没有按照你想的方式被处理。
日志里有什么信息?你是在调试模式下运行Tornado吗?顺便问一下,你用的是什么版本的Tornado?
试着把Tornado放在调试模式下,并添加一些logging.debug的信息,以确保你的请求确实到达了你的RequestHandler,并且能看到更多发生了什么。
要在调试模式下运行Tornado 1.1(可能是1.0?我记不清了),你只需要用'--logging=debug'启动你的应用。如果你的处理器里有logging.debug的调用,你就会看到相关的信息了 :)
这里有一个使用内置的helloworld.py示例的处理器:
class MainHandler(tornado.web.RequestHandler):
def get(self):
logging.debug("I'm in ur hndlrz, runnin yr codez")
self.write("Hello, world")
这是日志输出:
furby:helloworld jonesy$ ./helloworld.py --logging=debug
[D 101207 16:12:34 helloworld:28] I'm in ur hndlrz, runnin yr codez
[I 101207 16:12:34 web:849] 200 GET / (127.0.0.1) 1.03ms
[W 101207 16:12:34 web:849] 404 GET /favicon.ico (127.0.0.1) 0.34ms