Bottle web framework - How to stop?

前端 未结 11 1254
不知归路
不知归路 2020-12-14 06:55

When starting a bottle webserver without a thread or a subprocess, there\'s no problem. To exit the bottle app -> CTRL + c.

In a thread, ho

11条回答
  •  离开以前
    2020-12-14 07:31

    I suppose that the bottle webserver runs forever until it terminates. There are no methonds like stop().

    But you can make something like this:

    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 'Hello %s!' % name
    
    def main():
        Watcher()
        MyThread(background_process)
    
        run(host='localhost', port=8080)
    
    if __name__ == "__main__":
        main()
    

    Then you can use Watcher.kill() when you need to kill your server.

    Here is the code of run() function of the bottle:

    try: app = app or default_app() if isinstance(app, basestring): app = load_app(app) if not callable(app): raise ValueError("Application is not callable: %r" % app)

        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')
    

    As you can see there are no other way to get off the run loop, except some exceptions. The server.run function depends on the server you use, but there are no universal quit-method anyway.

提交回复
热议问题