Я хочу реализовать команду, которая может остановить приложение колбы, используя флажок script. Я некоторое время искал решение. Поскольку структура не предоставляет API-интерфейс app.stop(), мне интересно, как это кодировать. Я работаю над Ubuntu 12.10 и Python 2.7.3.
Как остановить приложение колбы без использования ctrl-c
Ответ 1
Если вы просто запускаете сервер на своем рабочем столе, вы можете предоставить конечную точку для уничтожения сервера (подробнее см. " Завершение работы простого сервера"):
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()
Позвольте мне знать, если это помогает.
Ответ 2
Я сделал это немного иначе, используя потоки
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()
Я использую его для завершения тестов конца для restful api, где я могу отправлять запросы с помощью библиотеки запросов python.
Ответ 3
Мой метод можно продолжить с помощью bash terminal/console
1) запустите и получите номер процесса
$ ps aux | grep yourAppKeywords
2a) убить процесс
$ kill processNum
2b) убить процесс, если выше не работает
$ kill -9 processNum
Ответ 4
Как уже отмечали другие, вы можете использовать werkzeug.server.shutdown
только из обработчика запросов. Единственный способ, которым я нашел, чтобы выключить сервер в другое время, - это отправить запрос самому себе. Например, обработчик /kill
в этом фрагменте завершит работу сервера 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..."
Ответ 5
Это старый вопрос, но поиск в Google не дал мне никакого представления о том, как этого добиться.
Потому что я не прочитал код здесь должным образом! (Doh!)
Он поднимает RuntimeError
, когда в request.environ
нет werkzeug.server.shutdown
...
То, что мы можем сделать, когда нет 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
...
Не нужно отправлять себе запрос.
Ответ 6
Это немного старая тема, но если кто-то экспериментирует, изучает или тестирует базовое приложение фляги, запускается из скрипта, который работает в фоновом режиме, самый быстрый способ остановить это - убить процесс, запущенный на порте, на котором вы запускаете приложение на. Примечание. Мне известно, что автор ищет способ не убивать и не останавливать приложение. Но это может помочь тому, кто учится.
sudo netstat -tulnp | grep :5001
Вы получите что-то вроде этого.
tcp 0 0 0.0.0.0:5001 0.0.0.0:* LISTEN 28834/python
Чтобы остановить приложение, убейте процесс
sudo kill 28834
Ответ 7
Вы можете использовать метод ниже
app.do_teardown_appcontext()
Ответ 8
Для Windows довольно легко остановить/убить флеш-сервер -
- Перейти к диспетчеру задач
- Найти flask.exe
- Выбрать и завершить процесс