플라스크 스크립트를 사용하여 플라스크 응용 프로그램을 중지 할 수있는 명령을 구현하고 싶습니다. 나는 잠시 동안 해결책을 찾았습니다. 프레임 워크는 “app.stop ()”API를 제공하지 않기 때문에 코드 작성 방법이 궁금합니다. Ubuntu 12.10 및 Python 2.7.3에서 작업 중입니다.
답변
데스크톱에서 서버를 실행하는 경우 엔드 포인트를 노출하여 서버를 종료 할 수 있습니다 (자세한 내용은 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()
이것이 도움이되는지 알려주세요.
답변
실을 사용하여 약간 다르게했습니다
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에 대한 종단 간 테스트를 수행하는 데 사용합니다.
답변
이것은 약간 오래된 스레드이지만, 누군가가 백그라운드에서 실행되는 스크립트에서 시작된 기본 플라스크 앱을 실험, 학습 또는 테스트하는 경우이를 중지하는 가장 빠른 방법은 앱을 실행중인 포트에서 실행중인 프로세스를 종료하는 것입니다. 의 위에. 참고 : 저자가 앱을 종료하거나 중지하지 않는 방법을 찾고 있다는 것을 알고 있습니다. 그러나 이것은 배우는 사람에게 도움이 될 수 있습니다.
sudo netstat -tulnp | grep :5001
당신은 이와 같은 것을 얻을 것입니다.
tcp 00 0.0.0.0:5001 0.0.0.0:* LISTEN 28834 / python
앱을 중지하려면 프로세스를 종료하십시오.
sudo kill 28834
답변
내 방법은 bash 터미널 / 콘솔을 통해 진행할 수 있습니다.
1) 실행하고 프로세스 번호 얻기
$ ps aux | grep yourAppKeywords
2a) 프로세스 종료
$ kill processNum
2b) 위가 작동하지 않으면 프로세스를 종료하십시오.
$ kill -9 processNum
답변
다른 사람들이 지적했듯이 werkzeug.server.shutdown
요청 핸들러 에서만 사용할 수 있습니다 . 다른 시간에 서버를 종료하는 유일한 방법은 자신에게 요청을 보내는 것입니다. 예를 들어, /kill
이 스 니펫 의 핸들러는 다음 1 초 동안 다른 요청이 들어오지 않는 한 dev 서버를 종료합니다.
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..."
답변
이것은 오래된 질문이지만 인터넷 검색은 이것을 수행하는 방법에 대한 통찰력을주지 못했습니다.
여기서 코드를 제대로 읽지 않았기 때문에 ! (DOH는!) 그것이 무엇을하는 것은 인상하지 않는 것입니다 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