【发布时间】:2020-10-23 16:09:23
【问题描述】:
我正在尝试测试简单的瓶子前端和后端之间的通信。我可以在我的机器上的 localhost 上运行,但是当我在远程 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>
对可能发生的事情有什么想法吗?
【问题讨论】:
-
在你的ajax调用中
url: "http://0.0.0.0:8080/test"应该是url: "http://64.243.2.11:8080/test"(或者无论主机的实际IP是什么......)0.0.0.0只是意味着“监听所有接口”,它实际上并不是您正在与之通话的 IP 地址 -
行得通,谢谢!如果你写这个作为答案,我会接受。
标签: python azure remote-debugging remote-server bottle