使用 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] 的单个实例可以处理不同的请求吗?

tornado数据库操作怎么异步

抽屉之Tornado实战--分析与架构

Tornado之抽屉实战--分析与架构

tornado之文件上传的几种形式form,伪ajax(iframe)

抽屉之Tornado实战--发帖及上传图片