簡體   English   中英

遠程機器上的 Bottle 服務器

[英]Bottle server on remote machine

我正在嘗試測試簡單的瓶子前端和后端之間的通信。 我能夠在我的機器上的 localhost 上運行,但是當我在遠程 azure 機器上運行相同的代碼時遇到意外行為。

我將三個文件放在一個文件夾中,分別是frontend_server.pybackend_server.pyindex.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM