Bottle web framework - How to stop?

前端 未结 11 1228
不知归路
不知归路 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:47

    An updated version of mike's answer.

    from bottlepy.bottle import WSGIRefServer, run
    from threading import Thread
    import time
    
    class MyServer(WSGIRefServer):
        def run(self, app): # pragma: no cover
            from wsgiref.simple_server import WSGIRequestHandler, WSGIServer
            from wsgiref.simple_server import make_server
            import socket
    
            class FixedHandler(WSGIRequestHandler):
                def address_string(self): # Prevent reverse DNS lookups please.
                    return self.client_address[0]
                def log_request(*args, **kw):
                    if not self.quiet:
                        return WSGIRequestHandler.log_request(*args, **kw)
    
            handler_cls = self.options.get('handler_class', FixedHandler)
            server_cls  = self.options.get('server_class', WSGIServer)
    
            if ':' in self.host: # Fix wsgiref for IPv6 addresses.
                if getattr(server_cls, 'address_family') == socket.AF_INET:
                    class server_cls(server_cls):
                        address_family = socket.AF_INET6
    
            srv = make_server(self.host, self.port, app, server_cls, handler_cls)
            self.srv = srv ### THIS IS THE ONLY CHANGE TO THE ORIGINAL CLASS METHOD!
            srv.serve_forever()
    
        def shutdown(self): ### ADD SHUTDOWN METHOD.
            self.srv.shutdown()
            # self.server.server_close()
    
    def begin():
        run(server=server)
    
    server = MyServer(host="localhost", port=8088)
    Thread(target=begin).start()
    time.sleep(2) # Shut down server after 2 seconds
    server.shutdown()
    

    The class WSGIRefServer is entirely copied with only 1 line added to the run() method is added. Also add a simple shutdown() method. Unfortunately, this is necessary because of the way bottle creates the run() method.

提交回复
热议问题