CaseyJames22
CaseyJames22

Reputation: 53

Python HTTP Server - Create without using HTTP modules

Can I create a HTTP server without using

python -m http.server [port number]

Using an old school style with sockets and such.

Latest code and errors...

import socketserver

response = """HTTP/1.0 500 Internal Server Error
Content-type: text/html

Invalid Server Error"""

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """


    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        self.request.sendall(response)

if __name__ == "__main__":
    HOST, PORT = "localhost", 8000
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

TypeError: 'str' does not support the buffer interface

Upvotes: 1

Views: 2449

Answers (2)

Steffen Ullrich
Steffen Ullrich

Reputation: 123260

Sure you can, and servers like Tornado already do it this way. For simple test servers which can do only HTTP/1.0 GET requests and handle only a single request at a time it should not be that hard once you understood the basics of the HTTP protocol. But if you care even a bit about performance it gets complex fast.

Upvotes: 0

Max Noel
Max Noel

Reputation: 8910

Yes, you can, but it's a terrible idea -- in fact, even http.server is at best a toy implementation.

You're better off writing whatever webapp you want as a standard WSGI application (most Python web frameworks do that -- Django, Pyramid, Flask...), and serving it with one of the dozens of production-grade HTTP servers that exist for Python.

uWSGI (https://uwsgi-docs.readthedocs.org/en/latest/) is my personal favorite, with Gevent a close second.

If you want more info about how it's done, I recommend that you read the source code to the CherryPy server (http://www.cherrypy.org/). While not as powerful as the aforementioned uWSGI, it's a good reference implementation written in pure Python, that serves WSGI apps through a thread pool.

Upvotes: 1

Related Questions