【问题标题】:Reload python flask server by function按功能重新加载python烧瓶服务器
【发布时间】:2015-02-27 16:06:12
【问题描述】:
我正在编写一个 python/flask 应用程序,并希望添加重新加载服务器的功能。
我目前正在使用以下选项运行服务器
app.run(debug=True)
每次发生代码更改时都会导致以下结果
* Running on http://127.0.0.1:5000/
* Restarting with reloader
然而,在生产环境中,我宁愿不设置debug=True,而是只能在需要时重新加载应用程序服务器。
我正在尝试让两件事发挥作用:
-
if reload_needed: reload_server(),和
- 如果用户单击管理面板中的“重新加载服务器”按钮,则应调用
reload_server() 函数。
然而,尽管服务器在代码更改后重新加载,但我找不到让我完全做到这一点的函数。
如果可能,我想使用 flask/werkzeug 内部功能。我知道我可以通过添加 gunicorn/nginx/apache 等内容来实现类似的目标。
【问题讨论】:
标签:
python
flask
server
restart
【解决方案1】:
我想我也遇到了同样的问题。
所以客户端上有一个 python/flask 应用程序 (XY.py)。我编写了一个构建步骤(Teamcity),将这个 python 代码部署到客户端。假设 XY.py 已经在客户端上运行。部署这个新的/修复的/更正的 XY.py 后,我必须重新启动它才能将更改应用于正在运行的代码。
我遇到的问题是,在使用精细重启 oneliner os.execl(sys.executable, *([sys.executable]+sys.argv)) 后,我的应用程序使用的端口仍然繁忙/已建立,因此重启后我无法访问它。
这就是我解决问题的方法:
我把我的应用程序放在一个单独的进程上运行,并为它创建了一个队列。为了更清楚地看到它,这里有一些代码。
global some_queue = None
@app.route('/restart')
def restart():
try:
some_queue.put("something")
return "Quit"
def start_flaskapp(queue):
some_queue = queue
app.run(your_parameters)
将此添加到您的主目录:
q = Queue()
p = Process(target=start_flaskapp, args=[q,])
p.start()
while True: #wathing queue, sleep if there is no call, otherwise break
if q.empty():
time.sleep(1)
else:
break
p.terminate() #terminate flaskapp and then restart the app on subprocess
args = [sys.executable] + [sys.argv[0]]
subprocess.call(args)
希望它足够简洁,并且对您有所帮助!
【解决方案2】:
如何在 Python 代码中执行以下操作以终止服务器:
@app.route('/quit')
def _quit():
os._exit(0)
当进程被杀死时,它会在while循环中重复自己。
app_run.sh:
#!/bin/bash
while true
do
hypercorn app_async:app -b 0.0.0.0:5000
sleep 1
done