【问题标题】:Ajax Request with Python Tornado Getting a 405使用 Python Tornado 的 Ajax 请求获得 405
【发布时间】:2011-05-20 20:57:21
【问题描述】:

我有一些 javascript 通过 javascript(无库)向在不同端口上运行的本地站点发出“POST”调用。如果该站点正在使用 mod_python 运行应用程序,它就可以工作。如果它正在使用 Tornado 运行应用程序 - 它会失败并出现 405 错误。我已经确定在处理程序上实现了 post() 和 options() 方法,但它仍然出错。由于这适用于 mod_python,因此这必须是可能的。任何人都知道如何让 Tornado 接受来自相同 IP 但不同端口的请求? (我只是在本地进行测试,完全不关心安全问题)。

【问题讨论】:

    标签: python ajax tornado http-status-code-405


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 2019-03-25
      • 1970-01-01
      相关资源
      最近更新 更多