For Votizen.com we are trying to setup continous deployment. Our first attempt to make it work was to leverage the post web hooks provided by our repository manager. For webhooks you need to have a URL that is not powered by any service you wish to restart. Originally, I setup this URL using various off-the-shelf webservers, but they all seemed overkill for what I wanted to do. Instead I leveraged built in features of Python to create a very simple webserver that handles only the URIs the developer specifies.
Here is the code that should be saved to
import string, cgi, time, os from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer class MyRequestHandler(BaseHTTPRequestHandler): def do_GET(self): try: if self.path.endswith(/postwebhook): self.send_response(200) self.send_header(Content-type,text/html) self.end_headers() self.wfile.write(ok) # your logic for this URL here, such as executing a bash script rs = os.popen(python /pathToFile/yourScript.py &) return if self.path.endswith(anotherURI): # do something else return else: self.send_error(404,File Not Found %s% self.path) except: self.send_error(404,File Not Found %s% self.path) def do_POST(self): self.do_GET() # currently same as post, but can be anything def main(): try: # you can specify any port you want by changing81server = HTTPServer((, 81), MyRequestHandler) printstarting httpserver…server.serve_forever() except KeyboardInterrupt: print^C received, shutting down serverserver.socket.close() if __name__ ==__main__: main()
To start the server:
Python comes equipped with the ability to run an HTTP server, and a request handler. The
main function of this snippet starts the server at a given port and delegates requests to the
MyRequestHandler. It keeps the server running indefinitely, until control C is pressed. When extending the
do_POST function need to be defined to handle GET and POST requests.
In this example the POST request handler just delegates to the GET request handler. The GET request handler evaluates the PATH for a couple of URLs that you want to support. You need to define the request headers, but you can write anything out, such as HTML, JSON, XML, or in this case, just the word
OK. When there is an error, use the
send_error function to return an error and message.
This code was originally based on work by Jon Berg at http://fragments.turtlemeat.com/pythonwebserver.php.