如何关闭 Flask 服务器并使用同一 Python 脚本中的不同 IP 重新启动它?

问题描述 投票:0回答:2

这是问题的 Flask 设置。

import threading
from flask import Flask, request

app = Flask(__name__)

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

@app.route('/restart', methods=['GET'])
def restart():
    shutdown() # How do I shutdown the Flask server?
    flask_thread.join()
    flask_thread = threading.Thread(target=start_flask, args=(new_IP,))
    flask_thread.start()
    return 'Hello again, World!'

def start_flask(ip):
    app.run(host=ip)

old_IP = '123.123.123.123'
new_IP = '234.234.234.234'

flask_thread = threading.Thread(target=start_flask, args=(old_IP,))
flask_thread.start()

如何关闭 Flask 服务器,并使用不同的 IP 重新启动它?

python flask
2个回答
0
投票

抱歉,但我想您可能对从哪里获取 IP 服务器地址有误解。

简化为三个IP地址:

  • 您的计算机环回地址(127.x.x.x)
  • 您的专用网络 IP 地址,例如您的员工有自己的专用网络,您是其中的一部分(10.x.x.x 或 192.x.x.x )
  • 全球互联网 IP 地址(任何上述未提及的地址)

那么IP地址是如何分配的:

  • 环回地址不执行任何操作,并且始终重定向到您的计算机。无需分配它。通常,您只需使用
    http://127.x.x.x
    ,而不是使用完整形式的环回地址(如
    http://localhost
    )。
  • 内网IP地址用于查找专用网络中的计算机。该 IP 地址由网络路由器/网络管理员分配。在这种情况下,Flask 和 python 都无法影响 IP 地址的选择。
  • 全球网络 IP 地址由您的互联网提供商分配。不是通过 Flask 或 python 实现的。通常您不能要求提供商更改分配给您的 IP(很可能这是非常官僚的程序)。不过,您可以使用 VPN 或代理隐藏您的 IP 地址。如果 IP 地址被代理隐藏,您可能会说 IP 地址已更改。
  • 云提供商给出的全球网络IP地址。如果 Flask 应用程序托管在云上,您可以使用云 API 发布和重新分配新的 IP 地址。例如,您可以使用 AWS API 定期更改托管 Flask 应用程序的实例(EC2 实例)的 IP 地址(在 AWS 中称为弹性 IP)。但是,根据您的问题,我无法确定这是您的任务范围。

DNS 记录

另一个可能与您的问题相关的主题是编辑 DNS 记录。所以基本上 DNS 记录是一个站点名,例如主机名“https://spokentutor.com”有多个与之关联的 DNS 记录(在此处检查它们:https://dnschecker.org/all-dns-records-of-domain .php?query=spokentutor.com&rtype=ALL&dns=google)。其中一条记录是

A
记录,其中存储站点 IP 地址
76.76.21.21
。因此,当 smn 想要访问主机名时,Firefox/Chrome/Safari 将请求 DNS 记录并获取 IP 地址。因此,基本上,如果该网站的托管名称为“http://mylongsite.org”,您可以通过编辑 DNS 记录来更改其 IP 地址。

总结一下:

Flask 确实有一个选项可以在运行应用程序时设置

host
IP 地址
app.run(host='XX.XX.XX.XX')
。但是,此选项不会更改您的 IP 地址,无论是本地 IP 地址、专用网络 IP 地址还是全局 IP 地址。此选项的作用是控制谁可以看到该应用程序:1)仅您的计算机(
host = 'localhost'
); 2)您的私人网络(
host='10.x.x.x'
); 3)到整个互联网(
host='0.0.0.0'
)。

请发表评论并告诉我这些信息是否有意义。抱歉发了这么长的帖子。


-1
投票

可以使用

os.execl
来实现这一目标:

ip_addr.py

IP = '123.123.123.123'

应用程序.py

import os
import sys
from flask import Flask

from ip_addr import ip

new_IP = '0.0.0.0'

app = Flask(__name__)

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

@app.route('/restart', methods=['GET'])
def restart():
    with open('IP.py', 'w') as f:
        f.write(f'ip = "{new_IP}"\n')
    os.execl(sys.executable, sys.executable, sys.argv[0])

app.run(host=ip)

服务器收到请求后会以指定的新IP重新启动。

© www.soinside.com 2019 - 2024. All rights reserved.