oficial - flask python 2
Cómo detener la aplicación del matraz sin usar ctrl-c (6)
Como han señalado otros, solo puede usar werkzeug.server.shutdown
desde un controlador de solicitudes. La única forma en que he encontrado cerrar el servidor en otro momento es enviarte una solicitud. Por ejemplo, el controlador /kill
en este fragmento matará al servidor de desarrollo a menos que entre otra solicitud durante el siguiente segundo:
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..."
Quiero implementar un comando que pueda detener la aplicación del matraz utilizando el matraz script. He buscado la solución por un tiempo. Como el framework no proporciona la API "app.stop ()", tengo curiosidad acerca de cómo codificar esto. Estoy trabajando en Ubuntu 12.10 y Python 2.7.3.
Esta es una vieja pregunta, pero google no me dio ninguna idea de cómo lograr esto.
¡Porque no leí el código aquí correctamente! (¡Doh!) Lo que hace es generar un RuntimeError
cuando no hay werkzeug.server.shutdown
en request.environ
...
Entonces, lo que podemos hacer cuando no hay una request
es levantar un RuntimeError
def shutdown():
raise RuntimeError("Server going down")
y atrapa eso cuando app.run()
devuelve:
...
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
...
No es necesario que se envíe una solicitud.
Este es un hilo un poco viejo, pero si alguien experimenta, aprende o prueba la aplicación básica de matraz, comenzó con un script que se ejecuta en segundo plano, la forma más rápida de detenerlo es matar el proceso que se ejecuta en el puerto donde está ejecutando su aplicación en. Nota: Soy consciente de que el autor está buscando una forma de no matar o detener la aplicación. Pero esto puede ayudar a alguien que está aprendiendo.
sudo netstat -tulnp | grep :5001
Obtendrás algo como esto.
tcp 0 0 0.0.0.0:5001 0.0.0.0:* ESCUCHAR 28834 / python
Para detener la aplicación, mate el proceso
sudo kill 28834
Lo hice un poco diferente usando hilos
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()
Lo uso para hacer pruebas de extremo a extremo para una API apta, donde puedo enviar solicitudes utilizando la biblioteca de solicitudes de python.
Mi método puede llevarse a cabo a través de terminal / consola bash
1) ejecutar y obtener el número de proceso
$ ps aux | grep yourAppKeywords
2a) matar el proceso
$ kill processNum
2b) matar el proceso si arriba no funciona
$ kill -9 processNum
Si solo está ejecutando el servidor en su escritorio, puede exponer un punto final para matar el servidor (lea más en 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...''
Aquí hay otro enfoque que está más contenido:
from multiprocessing import Process
server = Process(target=app.run)
server.start()
# ...
server.terminate()
server.join()
Déjeme saber si esto ayuda.