Differences between revisions 6 and 7
Revision 6 as of 2004-07-19 16:13:27
Size: 3889
Editor: kansas
Comment:
Revision 7 as of 2005-01-25 04:54:09
Size: 4061
Editor: aaron
Comment: PEP-8-ify a bit, and a response to Ian.
Deletions are marked like this. Additions are marked like this.
Line 26: Line 26:
class MyHandler( BaseHTTPServer.BaseHTTPRequestHandler ): class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
Line 36: Line 36:
        s.wfile.write( "<html><head><title>Title goes here.</title></head>" )
        s.wfile.write( "<body><p>This is a test.</p>" )
        s.wfile.write("<html><head><title>Title goes here.</title></head>")
        s.wfile.write("<body><p>This is a test.</p>")
Line 40: Line 40:
        s.wfile.write( "<p>You accessed path: %s</p>" % s.path )
        s.wfile.write( "</body></html>" )
        s.wfile.write("<p>You accessed path: %s</p>" % s.path)
        s.wfile.write("</body></html>")
Line 45: Line 45:
    httpd = server_class( (HOST_NAME, PORT_NUMBER),
                         
MyHandler )
    httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
Line 73: Line 72:
REDIRECTIONS = {
    
"/slashdot/" : "http://slashdot.org/",
    "/freshmeat/" : "http://freshmeat.net/",
    
}
REDIRECTION_OF_LAST_RESORT = "http://google.com/"
REDIRECTIONS = {"/slashdot/": "http://slashdot.org/",
                "/freshmeat/": "http://freshmeat.net/"}
LAST_RESORT = "http://google.com/"
Line 79: Line 76:
class RedirectHandler( BaseHTTPServer.BaseHTTPRequestHandler ): class RedirectHandler(BaseHTTPServer.BaseHTTPRequestHandler):
Line 81: Line 78:
        s.send_response( 301 )
        s.send_header( "Location", REDIRECTIONS.get( s.path, REDIRECTION_OF_LAST_RESORT ) )
        s.send_response(301)
        s.send_header("Location", REDIRECTIONS.get(s.path, LAST_RESORT))
Line 89: Line 86:
    httpd = server_class( (HOST_NAME, PORT_NUMBER),
                         
RedirectHandler )
    httpd = server_class((HOST_NAME, PORT_NUMBER), RedirectHandler)
Line 116: Line 112:

I like the BaseHttpServer because it is in the default Python distributions. I encourage all work towards putting a standard web framework into the default Python distribution. I'm not picky, just as long as something is chosen. -- LionKimbro [[DateTime(2005-01-25T04:53:53Z)]]

BaseHTTPServer

You can use this to make a simple HTTP web server.

TableOfContents()

Official Documentation

Example Code

Responding with an HTML Page

   1 import time
   2 import BaseHTTPServer
   3 
   4 
   5 HOST_NAME = 'something.somewhere.net' # !!!REMEMBER TO CHANGE THIS!!!
   6 PORT_NUMBER = 80 # Maybe set this to 9000.
   7 
   8 
   9 class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  10     def do_HEAD(s):
  11         s.send_response(200)
  12         s.send_header("Content-type", "text/html")
  13         s.end_headers()
  14     def do_GET(s):
  15         """Respond to a GET request."""
  16         s.send_response(200)
  17         s.send_header("Content-type", "text/html")
  18         s.end_headers()
  19         s.wfile.write("<html><head><title>Title goes here.</title></head>")
  20         s.wfile.write("<body><p>This is a test.</p>")
  21         # If someone went to "http://something.somewhere.net/foo/bar/",
  22         # then s.path equals "/foo/bar/".
  23         s.wfile.write("<p>You accessed path: %s</p>" % s.path)
  24         s.wfile.write("</body></html>")
  25 
  26 if __name__ == '__main__':
  27     server_class = BaseHTTPServer.HTTPServer
  28     httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)
  29     print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
  30     try:
  31         httpd.serve_forever()
  32     except KeyboardInterrupt:
  33         pass
  34     httpd.close()
  35     print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)

Responding with URL Redirection

This code demonstrates simple URL redirection:

   1 """
   2 URL redirection example.
   3 """
   4 
   5 import BaseHTTPServer
   6 import time
   7 import sys
   8 
   9 
  10 HOST_NAME = 'something.somewhere.net' # !!!REMEMBER TO CHANGE THIS!!!
  11 PORT_NUMBER = 80 # Maybe set this to 9000.
  12 REDIRECTIONS = {"/slashdot/": "http://slashdot.org/",
  13                 "/freshmeat/": "http://freshmeat.net/"}
  14 LAST_RESORT = "http://google.com/"
  15 
  16 class RedirectHandler(BaseHTTPServer.BaseHTTPRequestHandler):
  17     def do_HEAD(s):
  18         s.send_response(301)
  19         s.send_header("Location", REDIRECTIONS.get(s.path, LAST_RESORT))
  20         s.end_headers()
  21     def do_GET(s):
  22         s.do_HEAD()
  23 
  24 if __name__ == '__main__':
  25     server_class = BaseHTTPServer.HTTPServer
  26     httpd = server_class((HOST_NAME, PORT_NUMBER), RedirectHandler)
  27     print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
  28     try:
  29         httpd.serve_forever()
  30     except KeyboardInterrupt:
  31         pass
  32     httpd.close()
  33     print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)

See Also

  • DocXmlRpcServer -- self-documenting XML-RPC servers

  • CgiScripts -- using invoked CGI scripts, rather than running micro-web servers

Discussion

I'd ultimately like to see a BaseHttpServer here that can both handle XML-RPC requests (with that request handler,) and normal web requests (with a custom handler.)

Yes- I know and love TwistedPython. But I want to make something that works in a single install. -- LionKimbro DateTime(2004-05-31T01:13:16Z)

I'd also like to add code here showing how to service a POST request.

-- LionKimbro DateTime(2004-07-03T23:07:53Z)

There exist tools like CherryPy which will create a single-file Python HTTP server (based on BaseHTTPServer). This is a fair amount easier to work with than the raw BaseHTTPServer. For most cases, using a more complete framework will be preferable (see WebProgramming). -- IanBicking

I like the BaseHttpServer because it is in the default Python distributions. I encourage all work towards putting a standard web framework into the default Python distribution. I'm not picky, just as long as something is chosen. -- LionKimbro DateTime(2005-01-25T04:53:53Z)

BaseHttpServer (last edited 2012-04-15 19:54:19 by PaulBoddie)

Unable to edit the page? See the FrontPage for instructions.