Я предполагаю, что веб-сервер бутылки работает вечно, пока не завершится. Нет таких методов, как stop()
.
Но вы можете сделать что-то вроде этого:
from bottle import route, run
import threading, time, os, signal, sys, operator
class MyThread(threading.Thread):
def __init__(self, target, *args):
threading.Thread.__init__(self, target=target, args=args)
self.start()
class Watcher:
def __init__(self):
self.child = os.fork()
if self.child == 0:
return
else:
self.watch()
def watch(self):
try:
os.wait()
except KeyboardInterrupt:
print 'KeyBoardInterrupt'
self.kill()
sys.exit()
def kill(self):
try:
os.kill(self.child, signal.SIGKILL)
except OSError: pass
def background_process():
while 1:
print('background thread running')
time.sleep(1)
@route('/hello/:name')
def index(name='World'):
return '<b>Hello %s!</b>' % name
def main():
Watcher()
MyThread(background_process)
run(host='localhost', port=8080)
if __name__ == "__main__":
main()
Затем вы можете использовать Watcher.kill()
, когда вам нужно убить свой сервер.
Вот код run()
функции бутылки:
попробуйте: приложение = приложение или default_app(), если isinstance (приложение, базовая строка): приложение = load_app (приложение), если не вызывается (приложение): поднять ValueError («Приложение не вызывается: %r» % приложение)
for plugin in plugins or []:
app.install(plugin)
if server in server_names:
server = server_names.get(server)
if isinstance(server, basestring):
server = load(server)
if isinstance(server, type):
server = server(host=host, port=port, **kargs)
if not isinstance(server, ServerAdapter):
raise ValueError("Unknown or unsupported server: %r" % server)
server.quiet = server.quiet or quiet
if not server.quiet:
stderr("Bottle server starting up (using %s)...\n" % repr(server))
stderr("Listening on http://%s:%d/\n" % (server.host, server.port))
stderr("Hit Ctrl-C to quit.\n\n")
if reloader:
lockfile = os.environ.get('BOTTLE_LOCKFILE')
bgcheck = FileCheckerThread(lockfile, interval)
with bgcheck:
server.run(app)
if bgcheck.status == 'reload':
sys.exit(3)
else:
server.run(app)
except KeyboardInterrupt:
pass
except (SyntaxError, ImportError):
if not reloader: raise
if not getattr(server, 'quiet', False): print_exc()
sys.exit(3)
finally:
if not getattr(server, 'quiet', False): stderr('Shutdown...\n')
Как видите, другого выхода из цикла run
нет, кроме некоторых исключений. Функция server.run
зависит от используемого вами сервера, но универсального quit
-метода все равно не существует.
person
Igor Chubin
schedule
01.07.2012
sys.exit(0)
плохим решением? Если да, то почему? Я пытался, и это действительно не работает, но было бы интересно получить ваш ответ, который объясняет, почему это не работает :) - person Basj   schedule 05.05.2020