使用 Python Tornado 的 Ajax 请求获得 405
Posted
技术标签:
【中文标题】使用 Python Tornado 的 Ajax 请求获得 405【英文标题】:Ajax Request with Python Tornado Getting a 405 【发布时间】:2011-05-20 20:57:21 【问题描述】:我有一些 javascript 通过 javascript(无库)向在不同端口上运行的本地站点发出“POST”调用。如果该站点正在使用 mod_python 运行应用程序,它就可以工作。如果它正在使用 Tornado 运行应用程序 - 它会失败并出现 405 错误。我已经确定在处理程序上实现了 post() 和 options() 方法,但它仍然出错。由于这适用于 mod_python,因此这必须是可能的。任何人都知道如何让 Tornado 接受来自相同 IP 但不同端口的请求? (我只是在本地进行测试,完全不关心安全问题)。
【问题讨论】:
【参考方案1】:这里发生了一些奇怪的事情 - 但它不是你想的那样。
Ajax 的同源策略实际上阻止了对任何不同地址的请求,即使该地址只是端口号不同。请参阅政策的wikipedia's definition。
所以问题实际上是,为什么它看起来好像 mod_python 版本有效?例如,您确定 mod_python 正在侦听您认为的端口吗? Javascript 是什么样子的,它如何确定发布的位置?
【讨论】:
它看起来好像不起作用,但它确实起作用。 mod_python 正在侦听端口 9000。测试 js 正在从端口 8000 提供服务。Tornado 代码正在侦听 9001。我唯一能想到的是,由于测试代码正在通过同一个 apache 实例,尽管它仍在工作端口差异。但这对我来说是在黑暗中的疯狂刺伤。【参考方案2】:这将有助于查看您的 RequestHandler 对象,以及您如何在 Tornado 中调度 URL。据我所知,只有缺少 HTTP 方法实现或缺少 options() 定义才会导致 tornado 发出 405。
也许问题不在于您没有实现正确的方法,而是您调用的 url 没有按照您认为的方式发送。
日志是怎么说的?你在调试模式下运行龙卷风吗?当我问问题时,你在运行什么版本的龙卷风?
尝试将 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
【讨论】:
以上是关于使用 Python Tornado 的 Ajax 请求获得 405的主要内容,如果未能解决你的问题,请参考以下文章
websocket[tornado] 的单个实例可以处理不同的请求吗?