cherrypy is a pretty good lightweight HTTP server for Python, and to their credit they make it really easy to get started in a simple, single-purpose app. But if you ever want to add a cherrypy server into an existing program, or manage the server in a more object-oriented (or at least non-global) way, it’s a little tricky to figure out how. The quickstart() method is not so useful here, and they like to emphasize that in the documentation.
So, here is my implementation of a modular cherrypy (3.1+) “server” object that may be independently started/stopped.
from __future__ import with_statement
import cherrypy
import threading
class HTTPServer(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.sync = threading.Condition()
def run(self):
with self.sync:
cherrypy.server.socket_port = 8080
#cherrypy.server.socket_host = optional hostname
cherrypy.tree.mount(MySiteClass(), "/", None)
cherrypy.engine.start()
cherrypy.engine.block()
def stop(self):
with self.sync:
cherrypy.engine.exit()
cherrypy.server.stop()