158 votes

Comment arrêter une application flask sans utiliser ctrl-c

Je veux implémenter une commande qui peut arrêter une application flask en utilisant flask-script. J'ai cherché la solution pendant un certain temps. Parce que le framework ne fournit pas app.stop() API, je suis curieux de savoir comment coder cela. Je travaille sur Ubuntu 12.10 et Python 2.7.3.

0 votes

Pourquoi devez-vous être capable d'arrêter votre application à partir d'un script ? (Le meilleur outil pour ce travail dépend de ce que vous essayez de faire).

0 votes

Sérieusement, qu'est-ce que vous essayez de faire ici ? Si vous parlez de devserver pour le développement, il est tout à fait possible de l'arrêter comme ça. En production, on ne déploie pas comme ça et on peut arrêter une requête à n'importe quel moment, donc "l'application s'arrête de tourner".

0 votes

@SeanVieira Je voudrais savoir s'il existe des solutions pour faire cela.

11voto

jogco Points 246

Il s'agit d'une vieille question, mais la recherche sur Internet ne m'a pas permis de savoir comment y parvenir.

Parce que je n'ai pas lu le code ici correctement ! (Doh !) Ce qu'il fait est de lever un RuntimeError quand il n'y a pas werkzeug.server.shutdown dans le request.environ ...

Donc ce que nous pouvons faire quand il n'y a pas request est de soulever un RuntimeError

def shutdown():
    raise RuntimeError("Server going down")

et attraper que lorsque app.run() retours :

...
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
...

Il n'est pas nécessaire de vous envoyer une demande.

6voto

user1145905 Points 31

Si vous travaillez en CLI et que vous n'avez qu'une seule application/processus flask en cours d'exécution (ou plutôt, si vous souhaitez simplement tuer tout processus flask en cours d'exécution sur votre système), vous pouvez le tuer avec :

kill $(pgrep -f flask)

6voto

publicapps Points 71

Si vous êtes en dehors du traitement des requêtes et des réponses, vous pouvez toujours le faire :

import os
import signal

sig = getattr(signal, "SIGKILL", signal.SIGTERM)
os.kill(os.getpid(), sig)

0 votes

Bien joué, merci. J'avais besoin d'ajouter du code de nettoyage avant de terminer sur Ctrl+C, j'ai donc créé un SIGINT handler, qui fait le travail et appelle ensuite votre code.

0 votes

Mon flaskapp est bizarre, même sigkill ne fonctionne pas

4voto

Deg Points 41

Vous n'avez pas besoin d'appuyer sur CTRL + C mais vous pouvez fournir un point de terminaison qui le fait pour vous :

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..." })

Maintenant, il suffit d'appeler ce point de terminaison pour arrêter le serveur de manière efficace :

curl localhost:5000/stopServer

0 votes

J'ai testé votre code, mais après os.kill la réponse renvoyée ne peut pas être reçue par le client. Dans le cas d'une curl Il affiche "curl : (56) Recv failure : La connexion a été réinitialisée". Voir aussi Exécuter une fonction après que Flask ait renvoyé la réponse pour le résoudre.

0 votes

@samm, la conclusion de cette question est que ce n'est pas possible à moins de commencer un autre fil de discussion, n'est-ce pas ? Dans ce cas, comment arrêter le serveur flask à partir de cette autre discussion ?

4voto

request.environ.get déprécié . Pavel Minaev La solution est assez claire :

import os
from flask import Flask

app = Flask(__name__)
exiting = False

@app.route("/exit")
def exit_app():
    global exiting
    exiting = True
    return "Done"

@app.teardown_request
def teardown(exception):
    if exiting:
        os._exit(0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X