Multithreaded web server in python Multithreaded web server in python python python

Multithreaded web server in python


Check this post from Doug Hellmann's blog.

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandlerfrom SocketServer import ThreadingMixInimport threadingclass Handler(BaseHTTPRequestHandler):    def do_GET(self):        self.send_response(200)        self.end_headers()        message =  threading.currentThread().getName()        self.wfile.write(message)        self.wfile.write('\n')        returnclass ThreadedHTTPServer(ThreadingMixIn, HTTPServer):    """Handle requests in a separate thread."""if __name__ == '__main__':    server = ThreadedHTTPServer(('localhost', 8080), Handler)    print 'Starting server, use <Ctrl-C> to stop'    server.serve_forever()


I have developed a PIP Utility called ComplexHTTPServer that is a multi-threaded version of SimpleHTTPServer.

To install it, all you need to do is:

pip install ComplexHTTPServer

Using it is as simple as:

python -m ComplexHTTPServer [PORT]

(By default, the port is 8000.)


In python3, you can use the code below (https or http):

from http.server import HTTPServer, BaseHTTPRequestHandlerfrom socketserver import ThreadingMixInimport threadingUSE_HTTPS = Trueclass Handler(BaseHTTPRequestHandler):    def do_GET(self):        self.send_response(200)        self.end_headers()        self.wfile.write(b'Hello world\t' + threading.currentThread().getName().encode() + b'\t' + str(threading.active_count()).encode() + b'\n')class ThreadingSimpleServer(ThreadingMixIn, HTTPServer):    passdef run():    server = ThreadingSimpleServer(('0.0.0.0', 4444), Handler)    if USE_HTTPS:        import ssl        server.socket = ssl.wrap_socket(server.socket, keyfile='./key.pem', certfile='./cert.pem', server_side=True)    server.serve_forever()if __name__ == '__main__':    run()

You will figure out this code will create a new thread to deal with every request.

Command below to generate self-sign certificate:

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

If you are using Flask, this blog is great.