将Flask dev服务器配置为在整个网络中可见

时间:2011-08-11 08:40:28

标签: python flask werkzeug

我不确定这是否特定于Flask,但是当我以开发模式(http://localhost:5000)运行应用程序时,我无法从网络上的其他计算机访问它(使用http://[dev-host-ip]:5000)。例如,在开发模式下使用Rails,它可以正常工作。我找不到任何关于Flask开发服务器配置的文档。知道应该配置什么来启用它吗?

16 个答案:

答案 0 :(得分:557)

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


app.run()添加参数。默认情况下,它在localhost上运行,将其更改为app.run(host= '0.0.0.0')以在您的计算机IP地址上运行。

Quickstart page上的“外部可见服务器”下的Flask网站上记录:

  

外部可见服务器

     

如果您运行服务器,您会注意到服务器只是   可以从您自己的计算机上获得,而不是从网络中的任何其他计   这是默认值,因为在调试模式下是用户的   应用程序可以在您的计算机上执行任意Python代码如果你   禁用调试或信任您网络上的用户,您可以   服务器是公开的。

     

只需将run()方法的调用更改为:

     

app.run(host='0.0.0.0')

     

这告诉您的操作系统要监听公共IP。

答案 1 :(得分:82)

如果使用flask可执行文件启动服务器,则可以使用flask run --host=0.0.0.0将默认值从127.0.0.1更改为非本地连接。其他答案描述的配置和app.run方法可能是更好的做法,但这也很方便。

  

外部可见服务器如果您运行服务器,您会注意到这一点   服务器只能从您自己的计算机访问,而不能从任何计算机访问   其他在网络中。这是默认值,因为在调试模式下a   应用程序的用户可以在您的上执行任意Python代码   计算机。

     

如果禁用了调试器或信任网络上的用户,   只需添加即可使服务器公开   --host = 0.0.0.0到命令行:

     

flask run --host = 0.0.0.0这告诉你的操作系统要监听   所有公共IP。

参考:http://flask.pocoo.org/docs/0.11/quickstart/

答案 2 :(得分:17)

如果你的cool应用程序从外部文件加载了它的配置,如下例所示,那么不要忘记用HOST =“0.0.0.0”更新相应的配置文件

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

答案 3 :(得分:12)

在项目中添加以下行

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)

答案 4 :(得分:6)

您还可以通过环境变量设置主机(将其暴露在面向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

请参见How to get all available Command Options to set environment variables?

答案 5 :(得分:5)

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

在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

答案 6 :(得分:4)

对我来说,我遵循以上答案并对它进行了一些修改:

  1. 只需在命令提示符下使用ipconfig来获取您的ipv4地址
  2. 转到存在烧瓶代码的文件
  3. 在主函数中编写app.run(host ='您的ipv4地址')

例如:

enter image description here

答案 7 :(得分:3)

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

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

相反,您应该使用“运行配置”来配置Flask服务器,尤其是将--host 0.0.0.0 --port 5000放入其他选项字段中。

Run cofigurations of Flask server PyCharm

有关configuring Flask server in PyCharm

的更多信息

答案 8 :(得分:3)

在项目根目录中创建文件.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

答案 9 :(得分:2)

我遇到了同样的问题,我使用PyCharm作为编辑器,并且在创建项目时,PyCharm创建了Flask Server。我所做的就是通过以下方式用Python创建服务器;

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

希望对您有帮助

答案 10 :(得分:2)

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

无聊的东西

我亲自进行了很多努力,以使我的应用可以通过本地服务器访问其他设备(笔记本电脑和手机)。我尝试了0.0.0.0方法,但是没有运气。然后,我尝试更改端口,但没有成功。因此,在尝试了一堆不同的组合之后,我找到了这个组合,它解决了将应用程序部署在本地服务器上的问题。

步骤

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

IPv4 (Windows)

请注意:上面的步骤将在提供该应用程序的计算机上执行,而不是在您正在访问该应用程序的计算机上执行。另请注意,如果您断开连接并重新连接到网络,IPv4地址可能会更改。

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

    flask run -h 192.168.X.X

    例如就我而言(参见图片),我将其运行为:

    flask run -h 192.168.1.100

running the flask app

在我的移动设备上

screenshot 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

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

酷。?

答案 11 :(得分:1)

此答案不仅与flask有关,而且应适用于所有无法连接来自其他主机的服务问题。

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

今天,我像往常一样运行烧瓶应用程序,但是我发现它无法从其他服务器连接。然后,我运行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重要数据包。通过删除它们,问题解决了。

答案 12 :(得分:0)

转到项目路径    设置FLASK_APP = ABC.py     SET FLASK_ENV =开发

烧瓶运行-h [yourIP] -p 8080 您将在CMD上关注o / p:- *投放Flask应用“ expirement.py”(延迟加载)  *环境:发展  *调试模式:打开  *用统计重启  *调试器处于活动状态!  *调试器PIN:199-519-700  *在http://[yourIP]:8080/上运行(按CTRL + C退出)

答案 13 :(得分:0)

转到CMD(命令提示符)上的项目路径,然后执行以下命令:-

设置FLASK_APP = ABC.py

SET FLASK_ENV =开发

烧瓶运行-h [yourIP] -p 8080

您将获得有关CMD的o / p:-

  • 正在投放Flask应用程序“ expirement.py”(延迟加载)
    • 环境:发展
    • 调试模式:开
    • 从统计信息重新启动
    • 调试器处于活动状态!
    • 调试器PIN:199-519-700
    • http://[yourIP]:8080/上运行(按CTRL + C退出)

现在,您可以使用http://[yourIP]:8080/网址在另一台计算机上访问flask应用

答案 14 :(得分:0)

如果上述解决方案都不起作用,尝试手动将“http://”添加到网址的开头。

Chrome 可以从搜索查询中区分“[ip-address]:5000”。但有时这会工作一段时间,然后停止连接,似乎我没有改变任何东西。我的假设是浏览器有时可能会自动添加 https://(它不应该,但在我的情况下修复了它)。

答案 15 :(得分:-1)

添加@ Shawn的答案,还有一个内置配置变量SERVER_NAME。我们可以在app.config.from_pyfile(&#34; config.py&#34;)中指定的配置文件中将其设置为0.0.0.0。另请注意,这将覆盖app.run主机名  参考:http://flask.pocoo.org/docs/0.10/config/