无法连接到Flask Web服务,连接被拒绝。

88

我尝试在树莓派上用Flask运行一个简单的Web服务器。当我运行Flask应用程序时,它会显示:

正在运行:http://127.0.0.1:5000/

但是,当我在我的笔记本电脑中的Chrome浏览器中输入此地址时,我会得到:

ERR_CONNECTION_REFUSED

我可以在树莓派的浏览器中打开127.0.0.1:5000。 我需要怎么做才能连接另一台计算机?


2
127.0.0.1 是本地主机地址,只能从树莓派上访问。如果要从您的笔记本电脑上获取访问权限,请在树莓派上打开终端,并尝试使用 ifconfig 命令获取IP地址,该地址应类似于 192.168.0.XX:5000。这假设它们都在同一局域网中。 - jmunsch
1
@jm_____ ifconfig 返回了 192.168.1.103,我尝试使用 :5000,但仍然无法连接。是的,它们都在同一个网络上。 - Yashar
12个回答

211

像这样运行您的应用程序:

if __name__ == '__main__':
    app.run(host='0.0.0.0')

这将使服务器在外部可见。如果机器的IP地址为192.168.X.X,那么在同一网络中,您可以通过5000端口访问它。例如,http://192.168.X.X:5000


4
如果您想从同一台计算机访问该应用程序,请仍然使用 http://127.0.0.1:5000 - Nuhman
3
对于那些想要使用socketio实现此操作的人:socketio.run(app, host='0.0.0.0') - Dribbler
14
因某些原因,在 Windows 操作系统上,使用 flask run --host=0.0.0.0 命令可以运行 Flask 应用,但是使用 app.run(host='0.0.0.0',port=5000) 或者 flask run 命令则不行。请注意保持翻译后的内容原意不变。 - Sankalp
2
@Sankalp,我理解你的问题是当你运行flask run时,__name__不是'__main__'。因此,服务器启动了,但并没有按照你在app.run()中传递的参数来运行。而在flask run --host=0.0.0.0中,主机被明确指定了。 - paradocslover
3
另一种方法是通过运行“python <服务器文件名>.py”来实现-这将使用您提供的参数运行服务器(为什么?因为这一次“__name__”是“ 'main'”)。 - paradocslover
显示剩余4条评论

16

当你通过flask run运行服务器时,将其更改为flask run --host=0.0.0.0。 要连接,请查找您的脚本正在运行的服务器的IPv4地址。在同一网络上,转到http://[IPV4地址]:5000


7
з”ұдәҺжҹҗз§ҚеҺҹеӣ пјҢеңЁWindowsж“ҚдҪңзі»з»ҹдёҠдҪҝз”Ёе‘Ҫд»Өflask run --host=0.0.0.0еҸҜд»ҘиҝҗиЎҢпјҢдҪҶжҳҜдҪҝз”Ёapp.run(host='0.0.0.0', port=5000)жҲ–иҖ…flask runеҚҙдёҚиЎҢгҖӮ - Sankalp

15

原因可能是防火墙拒绝了端口5000上的入站连接。请尝试:

sudo ufw allow 5000

2
树莓派没有预装 ufw - Mausy5043

7
app.run(host='0.0.0.0',port=5000)

如果按照以下方式运行您的应用程序,那么您的服务器将在外部可见。

  1. 使用以下命令来运行您的应用程序

    app.run(host='0.0.0.0',port=5000)

  2. 打开窗口 cmd。键入ipconfig 并获取 IPV4 地址,假设您的 IPV4 地址为 192.168.X.X

  3. 在移动浏览器中键入 192.168.X.X:5000


1
为什么我必须使用IPv4地址而不是本地主机地址? - Alex F
@AlexF 我无法证明,因为我不是 Flask 开发者。但是当我在项目上工作时,这个配置对我有效。 - Muhammad Usman
@Alex_F localhost地址只能是127.0.0.1或localhost。IP地址0.0.0.0有特殊含义,即“在所有可用的IP地址上运行”。Flask端口设置为5000只是出于某种我不知道的标准原因。 - Stev

5
如果你在你的app.run()里面设置了debug = True,那么其他机器也无法看到它。可以在app.run()中指定hostport,但不能设置debug = True

这不是正确的。在调试模式下运行的应用程序可以被网络上的其他计算机看到,只要提供host='0.0.0.0',就像其他回答中提到的那样。 - FreelanceConsultant

2

您需要运行开发服务器,使其监听所有接口而不仅仅是本地接口

请让Flask监听0.0.0.0:PORT_NUMBER或您选择的任何其他端口


2
在 MacOS 12.4 (Monterey) 上,我无法加载本地主机名或本地IP地址,但使用以下两个地址可以成功访问:

  • 0.0.0.0
  • 127.0.0.1

如果在浏览器中使用“localhost”无法加载,请更改URL。


0

与普遍观念相反,127.0.0.1并不等同于localhost。 我通过在两端明确设置127.0.0.1来解决了上述问题。


0
  • 两台设备必须连接到相同的网络。
  • 使用 app.run(host='0.0.0.0',port=5000) 并且以你自己的IPv4地址运行,像这样 http://[Your IPv4 地址]:5000
  • 如果您要将其与 Android 应用程序连接,请不要忘记在清单文件中添加 INTERNET 权限。

嗨,我仍然有同样的问题。尽管我尝试了所有ipv4地址2、127.0.0.1、0.0.0.1、localhost等等,但仍无法将Flutter连接到本地主机上的Flask后端 :/。你能告诉我如何解决这个问题吗? - user14713384

0
在您的 API 调用中,请使用托管您的服务器的机器的 IP 地址,而不是 localhost。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接