远程机器上的 Bottle 服务器
Bottle server on remote machine
我正在尝试测试简单的 Bottle 前端和后端之间的通信。我可以在我机器上的本地主机上运行,但是当我 运行 在远程 azure 机器上使用相同的代码时,我遇到了意外行为。
我将三个文件放在一个文件夹中,frontend_server.py
、backend_server.py
和index.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.
我正在尝试测试简单的 Bottle 前端和后端之间的通信。我可以在我机器上的本地主机上运行,但是当我 运行 在远程 azure 机器上使用相同的代码时,我遇到了意外行为。
我将三个文件放在一个文件夹中,frontend_server.py
、backend_server.py
和index.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
、
<!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.