远程机器上的 Bottle 服务器

Bottle server on remote machine

我正在尝试测试简单的 Bottle 前端和后端之间的通信。我可以在我机器上的本地主机上运行,​​但是当我 运行 在远程 azure 机器上使用相同的代码时,我遇到了意外行为。

我将三个文件放在一个文件夹中,frontend_server.pybackend_server.pyindex.html。在本地,如果我 运行 终端中的前两个服务器,然后导航到 localhost:4040 会在开发人员控制台中显示预期的输出(它打印一个对象 {"test_backend": "test"})。我想做的是 运行 远程机器上的相同服务器(比如 12.123.123.123),当我导航到 http://12.123.123.123:4040 时看到相同的输出打印到开发者控制台。但是,在这种情况下,我看到 POST http://0.0.0.0:8080/test net::ERR_CONNECTION_REFUSED。我还尝试将 POST URL 更改为远程计算机的地址——在这种情况下,连接在大约 10 秒后超时。

我怀疑远程服务器的配置有问题。但是,我已将端口 4040 和 8080 的入站规则设置为 *

这是我的后端。我认为可能存在 CORS 问题,因此包含 after_request 挂钩。但是,它似乎从未执行过(没有消息打印到 python 控制台)。

#! /usr/bin/env python3
import beaker.middleware
import bottle
import json
app = bottle.Bottle()


@app.hook("after_request")
def enable_cors():
    '''From https://gist.github.com/richard-flosi/3789163

    This globally enables Cross-Origin Resource Sharing (CORS) headers for every response from this server.
    '''
    print("after request")
    bottle.response.headers['Access-Control-Allow-Origin'] = '*'
    bottle.response.headers['Access-Control-Allow-Methods'] = 'PUT, GET, POST, DELETE, OPTIONS'
    bottle.response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'


@app.post("/test")
def test():
    print("this is just a test")
    bottle.response.content_type = "application/json"
    return json.dumps({"test_backend": "test"})

bottle.run(app, host="0.0.0.0", port="8080")

这是我的前端,

#! /usr/bin/env python
import sys
import os
import bottle
import argparse


@bottle.get("/")
def root_app():
    return bottle.static_file("index.html", root="./")


def main():
    parser = argparse.ArgumentParser(description="Frontend Server")
    parser.add_argument("--host", action="store", dest="host", type=str, help="Host to bind to", default="0.0.0.0")
    parser.add_argument("--port", action="store", dest="port", type=int, help="Port to listen on", default="4040")
    args = parser.parse_args(sys.argv[1:])

    bottle_server_kwargs = {
        "host": args.host,
        "port": args.port,
        "server": "tornado",
        "reloader": False
    }
    bottle.run(**bottle_server_kwargs)
    return


if __name__ == '__main__':
    main()

这就是我在 index.html

中发出 POST 请求的方式
<!doctype html>
<html>
  <head>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js"></script>
  </head>
  <body>
  </body>
  <script type="text/javascript">
   $.ajax({
       type: 'POST',
       crossDomain:'true',
       url: "http://0.0.0.0:8080/test",
       success: function(response){
           console.log("success");
           console.log(response);
       }
   });
  </script>
</html>

对可能发生的事情有什么想法吗?

@Joran Beasley 的评论解决了问题,将其添加为关闭问题的答案:

in your ajax call url: http://0.0.0.0:8080/test should be url: http://64.243.2.11:8080/test (or whatever the actual IP of the host is ...) 0.0.0.0 just means "listen on all interfaces", its not actually the IP address you are talking to.