我想实现一个可以使用flask-script停止flask应用程序的命令。我已经搜索了一段时间。因为该框架不提供“ app.stop()” API,所以我对如何编写此代码感到好奇。我正在使用Ubuntu 12.10和Python 2.7.3。
我想实现一个可以使用flask-script停止flask应用程序的命令。我已经搜索了一段时间。因为该框架不提供“ app.stop()” API,所以我对如何编写此代码感到好奇。我正在使用Ubuntu 12.10和Python 2.7.3。
Answers:
如果只是在桌面上运行服务器,则可以公开终结点以终止服务器(有关更多信息,请参见Shutdown The Simple Server):
from flask import request
def shutdown_server():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
@app.route('/shutdown', methods=['POST'])
def shutdown():
shutdown_server()
return 'Server shutting down...'
这是另一种包含更多的方法:
from multiprocessing import Process
server = Process(target=app.run)
server.start()
# ...
server.terminate()
server.join()
让我知道是否有帮助。
methods='POST'
,我得到一个405 Method not allowed
错误,而使用methods ='GET'`时,它的工作方式就像@CS建议的那样。
我使用线程做了一点不同
from werkzeug.serving import make_server
class ServerThread(threading.Thread):
def __init__(self, app):
threading.Thread.__init__(self)
self.srv = make_server('127.0.0.1', 5000, app)
self.ctx = app.app_context()
self.ctx.push()
def run(self):
log.info('starting server')
self.srv.serve_forever()
def shutdown(self):
self.srv.shutdown()
def start_server():
global server
app = flask.Flask('myapp')
...
server = ServerThread(app)
server.start()
log.info('server started')
def stop_server():
global server
server.shutdown()
我用它来进行静态API的端到端测试,在这里我可以使用python请求库发送请求。
正如其他人指出的那样,您只能werkzeug.server.shutdown
在请求处理程序中使用。我发现在另一时间关闭服务器的唯一方法是向自己发送请求。例如,/kill
此片段中的处理程序将杀死开发服务器,除非在下一秒内收到另一个请求:
import requests
from threading import Timer
from flask import request
import time
LAST_REQUEST_MS = 0
@app.before_request
def update_last_request_ms():
global LAST_REQUEST_MS
LAST_REQUEST_MS = time.time() * 1000
@app.route('/seriouslykill', methods=['POST'])
def seriouslykill():
func = request.environ.get('werkzeug.server.shutdown')
if func is None:
raise RuntimeError('Not running with the Werkzeug Server')
func()
return "Shutting down..."
@app.route('/kill', methods=['POST'])
def kill():
last_ms = LAST_REQUEST_MS
def shutdown():
if LAST_REQUEST_MS <= last_ms: # subsequent requests abort shutdown
requests.post('http://localhost:5000/seriouslykill')
else:
pass
Timer(1.0, shutdown).start() # wait 1 second
return "Shutting down..."
这是一个古老的问题,但是谷歌搜索并没有给我任何有关如何完成此操作的见识。
因为我在这里没有正确阅读代码!(Do!)它的作用是在……中RuntimeError
不存在时引发一个。werkzeug.server.shutdown
request.environ
因此,如果没有,我们可以做的request
就是提高RuntimeError
def shutdown():
raise RuntimeError("Server going down")
并在app.run()
返回时捕捉到:
...
try:
app.run(host="0.0.0.0")
except RuntimeError, msg:
if str(msg) == "Server going down":
pass # or whatever you want to do when the server goes down
else:
# appropriate handling/logging of other runtime errors
# and so on
...
无需向自己发送请求。
您不必按“ CTRL-C”,但是您可以提供一个可以为您执行此操作的端点:
from flask import Flask, jsonify, request
import json, os, signal
@app.route('/stopServer', methods=['GET'])
def stopServer():
os.kill(os.getpid(), signal.SIGINT)
return jsonify({ "success": True, "message": "Server is shutting down..." })
现在,您只需调用此端点即可正常关闭服务器:
curl localhost:5000/stopServer
我将Flask应用程序托管在Google Cloud Platform虚拟机上。我使用来启动应用程序,python main.py
但是问题是ctrl + c无法停止服务器。
此命令$ sudo netstat -tulnp | grep :5000
终止服务器。
默认情况下,我的Flask应用程序在端口5000上运行。
为此。尚未针对其他平台进行测试。如果它也适用于其他版本,请随时进行更新或评论。