[英]Bottle server on remote machine
我正在嘗試測試簡單的瓶子前端和后端之間的通信。 我能夠在我的機器上的 localhost 上運行,但是當我在遠程 azure 機器上運行相同的代碼時遇到意外行為。
我將三個文件放在一個文件夾中,分別是frontend_server.py
、 backend_server.py
和index.html
。 在本地,如果我在終端中運行前兩個服務器,則導航到localhost:4040
會在開發人員控制台中顯示預期的 output (它會打印 object {"test_backend": "test"}
)。 我想做的是在遠程機器上運行相同的服務器(比如 12.123.123.123),當我導航到http://12.123.123.123:4040
時,看到相同的 output 打印到開發人員控制台但是,在這種情況下,我看到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意思是“監聽所有接口”,它實際上不是您正在與之交談的 IP 地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.