配置Flask开发服务器,使其在网络中可见

我不确定这是否是特定的Flask,但当我在dev模式(http://localhost:5000)运行一个应用程序时,我不能从网络上的其他机器(使用http://[dev-host-ip]:5000)访问它。例如,当Rails处于开发模式时,它工作得很好。我找不到任何关于Flask开发服务器配置的文档。你知道应该配置什么来实现这个功能吗?

663852 次浏览

虽然这是可能的,但您不应该在生产中使用Flask开发服务器。Flask开发服务器的设计并不是特别安全、稳定或高效。请参阅部署上的文档以获得正确的解决方案。


--host选项到flask run,或从host参数到app.run(),控制开发服务器侦听的地址。默认情况下,它运行在localhost上,将其更改为flask run --host=0.0.0.0(或app.run(host="0.0.0.0"))以运行在您机器的所有IP地址上。

0.0.0.0是一个不能直接在浏览器中使用的特殊值,您需要在网络中导航到机器的实际IP地址。您可能还需要调整防火墙以允许外部访问该端口。

Flask 快速入门文档在“外部可见服务器”中解释了这一点;部分:

如果你运行服务器,你会注意到服务器只有 可以从您自己的计算机访问,而不能从网络中的任何其他计算机访问。 属性的用户在调试模式中是默认的

.应用程序可以在你的计算机上执行任意Python代码

如果你关闭了调试器或者信任你网络上的用户, 您可以通过添加使服务器公开可用 --host=0.0.0.0到命令行:

$ flask run --host=0.0.0.0

这将告诉您的操作系统侦听所有公共ip。

如果你的cool应用程序从外部文件加载了它的配置,就像下面的例子,那么不要忘记用HOST="0.0.0.0"更新对应的配置文件

cool.app.run(
host=cool.app.config.get("HOST", "localhost"),
port=cool.app.config.get("PORT", 9000)
)

如果您使用flask可执行文件启动服务器,请使用flask run --host=0.0.0.0将默认值从127.0.0.1更改为开放给非本地连接。

如果你运行服务器,你会注意到服务器只有 可以从您自己的计算机访问,而不能从网络中的任何其他计算机访问。 属性的用户在调试模式中是默认的

.应用程序可以在你的计算机上执行任意Python代码

如果你关闭了调试器或者信任你网络上的用户, 您可以通过添加使服务器公开可用 --host=0.0.0.0到命令行:

$ flask run --host=0.0.0.0

这将告诉您的操作系统侦听所有公共ip。

参考:# EYZ0

添加# EYZ0app.run”。

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

如果你在Windows上得到OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions,你要么没有权限使用端口,要么其他东西正在使用它,你可以在netstat -na|findstr 5000中找到。

我也有同样的问题,我使用PyCharm作为编辑器,当我创建项目时,PyCharm创建了一个Flask服务器。我所做的就是用Python创建一个服务器,方法如下:

Config Python Server PyCharm 基本上我所做的是创建一个新的服务器,但flask如果没有python

我希望这对你有所帮助

检查服务器上的特定端口是否打开以服务客户端?

Ubuntu或Linux发行版

sudo ufw enable
sudo ufw allow 5000/tcp //allow the server to handle the request on port 5000

配置应用程序以处理远程请求

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




python3 app.py & #run application in background

这个答案不仅与flask有关,而且应该适用于所有无法从其他主机连接服务问题。

  1. 使用netstat -ano | grep <port>查看地址是否为0.0.0.0或::。如果它是127.0.0.1,那么它仅用于本地请求。
  2. 使用tcpdump查看是否有数据包丢失。如果有明显的不平衡,请通过iptables检查路由规则。

今天我像往常一样运行我的flask应用程序,但我注意到它不能从其他服务器连接。然后我运行netstat -ano | grep <port>,本地地址是::0.0.0.0(我都尝试了,我知道127.0.0.1只允许从本地主机连接)。然后我使用telnet host port,结果像connect to ...。这很奇怪。然后我想我最好检查一下tcpdump -i any port <port> -w w.pcap。我注意到它是这样的:

tcpdump result shows it there is only SYN packets from remote host

然后通过检查iptables --list OUTPUT部分,我可以看到几个规则:

iptables list result

这些规则禁止在握手时输出TCP重要数据包。删除它们,问题就解决了。

如果0.0.0.0方法不起作用,请尝试此方法

无聊的东西

就我个人而言,为了让我的应用通过本地服务器访问其他设备(笔记本电脑和手机),我做了很多努力。我尝试了0.0.0.0方法,但运气不好。然后我尝试改变端口,但它就是不工作。所以,在尝试了一系列不同的组合后,我终于选择了这个组合,它解决了我在本地服务器上部署应用程序的问题。

步骤

  1. 获取您计算机的本地IPv4地址。 这可以通过在Windows上键入ipconfig,在Linux上键入ifconfig来完成 李和Mac。< / >

IPv4 (Windows) < / >

请注意:上述步骤将在您正在提供应用程序的机器上执行,而不是在您正在访问它的机器上执行。还要注意,如果断开连接并重新连接到网络,IPv4地址可能会发生变化。

  1. 现在,只需使用获得的IPv4地址运行flask应用程序。

    # EYZ0

    例:在我的例子中(见图),我运行它为:

    # EYZ0

running the flask app

在我的手机上

截图from my mobile phone

可选的东西

如果你在Windows上执行这个过程,并使用Power Shell作为CLI,但你仍然无法访问网站,请在运行应用程序的Shell中尝试CTRL + C命令。Power Shell有时会冻结,需要捏一下才能恢复。这样做甚至可能会终止服务器,但它有时可以达到目的。

就是这样。如果你觉得这篇文章有用,请点赞。😉

还有一些可选的东西

我已经创建了一个简短的Powershell脚本,当你需要一个IP地址时,它将为你提供:

$env:getIp = ipconfig
if ($env:getIp -match '(IPv4[\sa-zA-Z.]+:\s[0-9.]+)') {
if ($matches[1] -match '([^a-z\s][\d]+[.\d]+)'){
$ipv4 = $matches[1]
}
}
echo $ipv4

将它保存到扩展名为.ps1的文件中(适用于PowerShell),并在启动应用程序之前运行它。你可以将它保存在项目文件夹中并以以下方式运行:

.\getIP.ps1; flask run -h $ipv4

注意:我将上面的shellcode保存在getIP.ps1中。

酷。👌

进入项目路径 设置FLASK_APP = ABC.py 设置FLASK_ENV =发展< / p >

flask run -h [yourIP] -p 8080 您将在CMD上执行o/p:- *服务Flask应用程序“experimental .py”(延迟加载) *环境:发展 *调试模式:打开 *重新启动stat 调试器已激活! *调试器PIN: 199-519-700 *在[yourIP] http://: 8080 /上运行(按CTRL+C退出)

在CMD(命令提示符)上进入您的项目路径,并执行以下命令:-

设置FLASK_APP = ABC.py

设置FLASK_ENV =发展

flask运行-h [yourIP] -p 8080

你会在CMD上得到以下o/p:-

  • Serving Flask app " experimental .py"(延迟加载)
    • 开发环境:
    • 调试模式:开启
    • 使用stat重新启动
    • 调试器已激活!
    • 调试器PIN: 199-519-700
    • [yourIP] http://: 8080 /上运行(按CTRL+C退出)
    • 李< / ul > < / >

    现在你可以在另一台机器上使用[yourIP] http://: 8080 / url访问你的flask应用程序

如果你在访问使用PyCharm部署的Flask服务器时遇到问题,请考虑以下因素:

PyCharm不会直接运行你的主.py文件,所以if __name__ == '__main__':中的任何代码都不会被执行,任何更改(如app.run(host='0.0.0.0', port=5000))都不会生效。

相反,您应该使用Run Configurations配置Flask服务器,特别是将--host 0.0.0.0 --port 5000放入附加选项字段中。

Run configuration of Flask server PyCharm

更多关于在PyCharm中配置Flask服务器

对我来说,我遵循上面的答案,并稍加修改:

  1. 只需在命令提示符上使用ipconfig获取ipv4地址
  2. 转到flask代码所在的文件
  3. 在主函数中写入app.run(host= '你的ipv4地址')

例如:

enter image description here

您还可以通过环境变量设置主机(将其暴露在面向IP地址的网络上)和端口。

$ export FLASK_APP=app.py
$ export FLASK_ENV=development
$ export FLASK_RUN_PORT=8000
$ export FLASK_RUN_HOST=0.0.0.0


$ flask run
* Serving Flask app "app.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on https://0.0.0.0:8000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 329-665-000

看到# EYZ0

在项目根目录中创建文件.flaskenv

这个文件中的参数通常是:

FLASK_APP=app.py
FLASK_ENV=development
FLASK_RUN_HOST=[dev-host-ip]
FLASK_RUN_PORT=5000

如果您有一个虚拟环境,激活它并执行pip install python-dotenv

这个包将使用.flaskenv文件,其中的声明将通过终端会话导入自动

然后您可以执行flask run

如果以上解决方案都不起作用,则尝试手动添加"http://"到url的开头。 . #

Chrome可以区分“;[ip-address]:5000”;从一个搜索查询。但有时候,这种方式会起作用一段时间,然后就停止了联系,似乎我什么都没改变。我的假设是浏览器有时可能会自动前置http<年代trong>年代://(它不应该,但这在我的情况下修复了它)。

这最终对我有用。

import os

然后把它放在你的python app.py或主文件的末尾。

if __name__ == "__main__":
port = int(os.environ.get("PORT", 5000))
app.run(host='0.0.0.0', port=port)
如果你需要从外部网络测试你的应用程序。 简单地用ngrok.com把它提供给整个互联网 它会像开发服务器一样部署它,但在本地,节省了我很多时间,不,我和那家公司没有关系:)

只要确保在你的flask应用程序中改变端口: # EYZ0 < / p >