如果在配置文件中更改了服务器端口,我想要重启一个简单的烧瓶应用程序。我有以下代码:
#!/usr/bin/env python
from flask import Flask, jsonify
import sys, time, os
app = Flask(__name__,static_url_path='')
HTTPPort = 8080
#------------------------------------------------------------
@app.route("/cmd/<command>")
def command(command):
if command == "restart":
Reload()
return jsonify("OK")
#------------------------------------------------------------
def Reload():
# reload python script
os.execl(sys.executable, 'python', __file__, *sys.argv[1:])
#------------------------------------------------------------
if __name__ == "__main__":
# load options from file, which change HTTPPort value
# LoadConfig()
while True:
try:
app.run(host="0.0.0.0", port=HTTPPort)
except Exception as e1:
print("Error in app.run:" + str(e1))
time.sleep(2)
Reload()
问题是当调用os.execl时会重新加载python脚本但是app.run失败并且“[Errno 98]地址已经在使用”
加载应用程序后,您可以通过输入浏览器的地址窗口在浏览器中触发命令例程:8080 / cmd / restart。这将导致烧瓶应用程序接受“重启”命令,这将导致调用os.exec()。此时,应用程序将终止并重新加载。在重新加载app.run()将通过异常错误输出“Address in in use”,它将尝试每2秒重新加载一次,每次都会出现相同的错误。
我尝试在app.run参数列表中设置reload = True但是这不允许更改端口。这可能是完成还是我做错了什么?
由于
答案 0 :(得分:1)
在尝试自己之后完全不同的答案。我想你可能要做两个部分的过程。
首先保存所需的端口号,秒更新文件的时间戳,以便内置的重新加载器为您重新启动应用程序。
将其与重定向结合到您的新地址,操作几乎是无缝的。这不会检查端口号是否正在使用,因此如果您选择一个现有端口,您可能已经死了,但是代码非常简单。
#!/usr/bin/env python
from flask import Flask, redirect
import os
import configparser
config = configparser.ConfigParser()
config.read('portnumber.ini')
app = Flask(__name__,static_url_path='')
HTTPPort = config['MAIN'].getint('portnumber')
def touchMe():
with open(__file__, 'a'):
print(" - setting timestamp of " + __file__ )
os.utime(__file__, None)
@app.route("/newport/<newport>")
def changeRoute(newport):
HTTPPort = newport
name = newport
config['MAIN']['portnumber'] = newport
with open('portnumber.ini', 'w') as configfile:
config.write(configfile)
touchMe()
newurl = "http://localhost:" + HTTPPort + "/"
print("Redirecting to " + newurl)
return redirect(newurl, code=302)
#------------------------------------------------------------
if __name__ == "__main__":
# load options from file, which change HTTPPort value
# LoadConfig()
while True:
app.run(host="0.0.0.0", port=HTTPPort, debug=True, use_reloader=True)