Lors de l'exécution d'une application Flask à l'aide de la méthode app.run(), vous pouvez rencontrer une situation où l'instruction d'impression indiquant le redémarrage du serveur apparaît deux fois. Ce comportement peut être attribué au rechargeur Werkzeug.
Werkzeug, la bibliothèque sous-jacente qui alimente le serveur de développement de Flask, utilise un mécanisme de processus enfant pour faciliter les modifications de code et le redémarrage automatique. Lorsque vous exécutez app.run(), le rechargeur génère un processus enfant qui surveille systématiquement votre code.
Pour illustrer cela, disséquons la fonction restart_with_reloader() dans Werkzeug. La fonction appelle subprocess.call() pour exécuter à nouveau votre script, conduisant à la génération d'un processus enfant. Par conséquent, vous observez l'instruction d'impression deux fois.
Pour éliminer cette duplication, pensez à désactiver le rechargement. Vous pouvez y parvenir en définissant use_reloader sur False dans app.run() :
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)
Vous pouvez également désactiver le rechargement lorsque vous utilisez la commande flask run :
FLASK_DEBUG=1 flask run --no-reload
Une autre option consiste à utiliser la fonction werkzeug.serving.is_running_from_reloader() pour déterminer si vous exécutez dans l'enfant du rechargeur processus.
Cependant, si vous avez besoin de modules globaux, optez pour le décorateur @app.before_first_request. Ce décorateur vous permet de spécifier une fonction qui sera invoquée une fois après chaque rechargement, lorsque la première requête est reçue :
@app.before_first_request def before_first_request(): print(f"########### Restarted, first request @ {datetime.utcnow()} ############")
Notez que lors de l'exécution sur un serveur WSGI à grande échelle utilisant un forking ou des sous-processus pour la gestion des requêtes , les gestionnaires before_first_request peuvent être invoqués pour chaque sous-processus nouvellement créé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!