7

我正在尝试在 Vagrant 环境中自学 Flask。我了解 Flask 默认在端口 5000 上运行服务器。在我的 Vagrantfile 中,我有:

config.vm.network :forwarded_port, guest: 80, host: 8080
config.vm.network :forwarded_port, guest: 5000, host: 5000

我有一个简单的教程 Flask 应用程序:

from flask import Flask 
app = Flask(__name__)

@app.route('/hello')
def hello_world():
    return 'Hello world!'

if __name__ == '__main__':
    app.run(debug=True)

然而,当我python hello.py在我的 Vagrant 环境中运行并随后127.0.0.1:5000/hello在桌面上的 Chrome 中运行时,我无法连接。

我对网络的了解还不够。我错过了什么?

4

6 回答 6

16

如果您从桌面上的 Chrome 访问,从技术上讲,您是从另一台计算机访问(因此您需要放置host='0.0.0.0'作为参数app.run()来告诉来宾操作系统接受来自所有公共(外部)IP 的连接。

这对我有用(适用于 Chrome127.0.0.1:5000/hellolocalhost:5000/helloChrome):

from flask import Flask
app = Flask(__name__)

@app.route("/hello")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')
于 2014-09-27T14:13:49.297 回答
12

您可能需要让 Flask 在外部可见的 URL 上提供服务:请参阅文档

于 2014-04-22T21:47:13.703 回答
2

这可能是由于 Vagrant (VirtualBox) NAT 端口转发无法正常工作(端口冲突)造成的。

为了缩小问题的范围,您可能需要确保端口 5000 在两端都正确打开,这可以通过使用 nmap、nc (netcat) 或 netstat 等来完成。

例如在主机上

nmap 127.0.0.1

nc -vz 127.0.0.1 5000

curl http://127.0.0.1:5000

客人内

nmap GUEST_IP

nc -vz GUEST_IP 5000

curl http://GUEST_IP:5000

注意:GUEST_IP 最有可能在 10.0.2.0/24 网络中(vbox NAT 引擎默认)。

在您的主机和虚拟机(guest box)中运行这些命令将告诉您端口是否打开。

确保您的 python hello world 不仅绑定到环回设备,以便它可以服务来自外部客户端的请求。

使用lsof -i :5000netstat -nap | grep :5000确定哪个程序正在绑定端口以进行进一步的故障排除。

于 2014-04-23T00:56:56.193 回答
1

你的流浪者盒子里安装了 curl 吗?如果没有安装它并尝试curl http://127.0.0.1:5000/hello。如果您收到响应并Hello world!在控制台中看到,那么在烧瓶方面一切都很好。回到虚拟框 - 当您打开网络设置时,根据您上面所说的,我假设您使用的是 NAT 地址。在这种情况下,您需要将主机地址设置为 127.0.0.1,端口 5000,将访客地址留空并再次设置端口 5000,这样就可以解决问题(端口转发)。在这些情况下,我注意到关于 vagrant 的一件事是,如果您使用虚拟主机,它的效果最好。看看这里

于 2014-04-22T21:45:00.417 回答
0

更改 Vagrantfile 后确保“vagrant reload”

于 2016-02-24T02:08:54.163 回答
0

我正在使用 Vagrant 并通过将这行代码添加到 Vagrantfile 来解决它:

  config.vm.network "forwarded_port", guest: 5000, host: 5000, host_ip: "127.0.0.1"
于 2018-04-15T06:50:46.783 回答