web-dev-qa-db-fra.com

Comment arrêter l'application flask sans utiliser ctrl-c

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.

67
vic

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.

80
Zorayr

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.

21
Ruben Decrop

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
9
Nam G VU

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

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.

5
jogco

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
3
R J

Vous pouvez utiliser la méthode ci-dessous

app.do_teardown_appcontext()
0
Alex

Pour Windows, il est assez facile d’arrêter/kill flask server -

  1. Aller au gestionnaire de tâches
  2. Trouver flask.exe
  3. Sélectionner et terminer le processus
0
Sumit Bajaj