pocco oficial homepage app python flask flask-extensions

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.