Je souhaite implémenter une commande qui peut arrêter l'application flask à l'aide de flask-script. J'ai cherché la solution pendant un certain temps. Parce que la structure ne fournit pas l'API "app.stop ()" Je suis curieux de savoir comment coder ceci. Je travaille sur Ubuntu 12.10 et Python 2.7.3.
Si vous ne faites qu'exécuter le serveur sur votre bureau, vous pouvez exposer un point de terminaison pour le tuer (pour en savoir plus, reportez-vous à la page Arrêtez le serveur simple ):
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...'
Voici une autre approche plus contenue:
from multiprocessing import Process
server = Process(target=app.run)
server.start()
# ...
server.terminate()
server.join()
Faites-moi savoir si cela aide.
Je l'ai fait légèrement différent en utilisant des fils
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()
Je l'utilise pour faire des tests complets pour les api reposants, où je peux envoyer des requêtes en utilisant la bibliothèque de requêtes python.
Ma méthode peut être utilisée via le terminal/la console bash
1) courir et obtenir le numéro de processus
$ ps aux | grep yourAppKeywords
2a) tuer le processus
$ kill processNum
2b) tuer le processus si dessus ne fonctionne pas
$ kill -9 processNum
Comme d'autres l'ont fait remarquer, vous ne pouvez utiliser que werkzeug.server.shutdown
depuis un gestionnaire de demandes. La seule façon que j'ai trouvée d'arrêter le serveur à un autre moment est de vous envoyer une requête. Par exemple, le /kill
Le gestionnaire contenu dans cet extrait tuera le serveur dev à moins qu'une autre requête ne vienne au cours de la seconde suivante:
import requests
from threading import Timer
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..."
C'est une vieille question, mais googler ne m'a pas donné la moindre idée de la façon de procéder.
Parce que je n'ai pas lu le code ici correctement! (Doh!) Cela permet de lever un RuntimeError
quand il n'y a pas de werkzeug.server.shutdown
Dans le request.environ
...
Donc, ce que nous pouvons faire quand il n’ya pas de request
est d’élever un RuntimeError
def shutdown():
raise RuntimeError("Server going down")
et attrape ça quand app.run()
retourne:
...
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
...
Pas besoin de vous envoyer une demande.
C'est un peu un vieux fil, mais si quelqu'un expérimente, apprend ou teste l'application de base flask app, démarrant à partir d'un script exécuté en arrière-plan, le moyen le plus rapide de l'arrêter est de tuer le processus Note: Je suis conscient que l'auteur cherche un moyen de ne pas tuer ou arrêter l'application, mais cela pourrait aider quelqu'un qui apprend.
Sudo netstat -tulnp | grep :5001
Vous obtiendrez quelque chose comme ça.
tcp 0 0 0.0.0.0:5001 0.0.0.0:* ÉCOUTE 28834/python
Pour arrêter l'application, tuez le processus
Sudo kill 28834
Vous pouvez utiliser la méthode ci-dessous
app.do_teardown_appcontext()
Pour Windows, il est assez facile d’arrêter/kill flask server -