Я хочу реалізувати команду, яка може зупинити додаток flask за допомогою flask-script. Я шукав рішення деякий час. Оскільки фреймворк не надає API "app.stop ()", мені цікаво, як це кодувати. Я працюю над Ubuntu 12.10 та Python 2.7.3.
Я хочу реалізувати команду, яка може зупинити додаток flask за допомогою flask-script. Я шукав рішення деякий час. Оскільки фреймворк не надає API "app.stop ()", мені цікаво, як це кодувати. Я працюю над 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()
Повідомте мене, якщо це допоможе.
methods='POST'
, я отримую 405 Method not allowed
помилку, тоді як із методами = '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.
Це трохи стара тема, але якщо хтось експериментує, навчається або тестує базову програму-колбу, починаючи зі сценарію, який працює у фоновому режимі, найшвидший спосіб зупинити це - убити процес, що працює на порту, на якому запущена ваша програма на. Примітка. Я усвідомлюю, що автор шукає спосіб не вбити чи зупинити програму. Але це може допомогти тому, хто навчається.
sudo netstat -tulnp | grep :5001
Ви отримаєте щось подібне.
tcp 0 0 0.0.0.0:5001 0.0.0.0:* СЛУХАЙТЕ 28834 / python
Щоб зупинити програму, припиніть процес
sudo kill 28834
Мій метод можна продовжити через термінал / консоль bash
1) запустити і отримати номер процесу
$ ps aux | grep yourAppKeywords
2а) вбити процес
$ kill processNum
2b) вбити процес, якщо вище не працює
$ kill -9 processNum
kill -9 `lsof -i:5000 -t`
лише один додаток може використовувати порт, і це легко.
Як зазначали інші, ви можете використовувати лише 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..."
Це старе запитання, але гуглиння не дало мені жодного розуміння того, як це зробити.
Бо я не прочитав тут код належним чином! (Дох!) Що він робить, це підняти а, 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
os.kill
, повернута відповідь не може бути отримана клієнтом. Для curl
цього виводиться "curl: (56) Recv збої: з'єднання було скинуто". Може бачити також Виконання функції після того, як Flask поверне відповідь для її вирішення.
Якщо ви знаходитесь поза обробкою запиту-відповіді, ви все ще можете:
import os
import signal
sig = getattr(signal, "SIGKILL", signal.SIGTERM)
os.kill(os.getpid(), sig)
Я розмістив свою програму Flask на віртуальній машині Google Cloud Platform. Я запустив програму за допомогоюpython main.py
але проблема в тому, що ctrl + c не спрацював, щоб зупинити сервер.
Ця команда $ sudo netstat -tulnp | grep :5000
припиняє роботу сервера.
Програма My Flask за замовчуванням працює на порту 5000.
Це працює для цього. Не тестував для інших платформ. Не соромтеся оновлювати або коментувати, якщо це працює і для інших версій.
Для Windows досить просто зупинити / убити сервер-колбу -