Size: 1790
Comment:
|
Size: 4419
Comment: correct wrong function name close() to server_close()
|
Deletions are marked like this. | Additions are marked like this. |
Line 5: | Line 5: |
[[TableOfContents()]] |
|
Line 7: | Line 9: |
* [http://www.python.org/doc/2.3.4/lib/module-BaseHTTPServer.html BaseHTTPServer module documentation] - what we use directly * [http://www.python.org/doc/2.3.4/lib/module-SocketServer.html SocketServer module documentation] - behind the BaseHttpServer |
* [http://docs.python.org/lib/module-BaseHTTPServer.html BaseHTTPServer module documentation] - what we use directly * [http://docs.python.org/lib/module-SocketServer.html SocketServer module documentation] - behind the BaseHttpServer |
Line 11: | Line 13: |
=== Responding with an HTML Page === |
|
Line 18: | Line 22: |
HOST_NAME = 'something.somewhere.net' PORT_NUMBER = 80 |
HOST_NAME = 'example.net' # !!!REMEMBER TO CHANGE THIS!!! PORT_NUMBER = 80 # Maybe set this to 9000. |
Line 22: | Line 26: |
class MyHandler( BaseHTTPServer.BaseHTTPRequestHandler ): | class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
Line 32: | Line 36: |
s.wfile.write( "<html><head><title>Title goes here.</title></head><body><p>This is a test.</p></body></html>" ) | s.wfile.write("<html><head><title>Title goes here.</title></head>") s.wfile.write("<body><p>This is a test.</p>") # If someone went to "http://something.somewhere.net/foo/bar/", # then s.path equals "/foo/bar/". s.wfile.write("<p>You accessed path: %s</p>" % s.path) s.wfile.write("</body></html>") |
Line 36: | Line 45: |
httpd = server_class( (HOST_NAME, PORT_NUMBER), MyHandler ) |
httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler) |
Line 43: | Line 51: |
httpd.close() | httpd.server_close() |
Line 47: | Line 55: |
=== Responding with URL Redirection === This code demonstrates simple URL redirection: {{{ #!python """ URL redirection example. """ import BaseHTTPServer import time import sys HOST_NAME = 'example.net' # !!!REMEMBER TO CHANGE THIS!!! PORT_NUMBER = 80 # Maybe set this to 9000. REDIRECTIONS = {"/slashdot/": "http://slashdot.org/", "/freshmeat/": "http://freshmeat.net/"} LAST_RESORT = "http://google.com/" class RedirectHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_HEAD(s): s.send_response(301) s.send_header("Location", REDIRECTIONS.get(s.path, LAST_RESORT)) s.end_headers() def do_GET(s): s.do_HEAD() if __name__ == '__main__': server_class = BaseHTTPServer.HTTPServer httpd = server_class((HOST_NAME, PORT_NUMBER), RedirectHandler) print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER) try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER) }}} == Parameterizing == When you want to make your server respect some parameters, it's easiest to do so via the ''server,'' rather than the ''handler.'' That is, make a subclass of the server, that accepts some additional parameters. Have the server record those parameters. Then, in the handler, use {{{s.server}}} to get to the server, and access the parameters through it. |
|
Line 49: | Line 106: |
DocXmlRpcServer | * DocXmlRpcServer -- self-documenting XML-RPC servers * CgiScripts -- using invoked CGI scripts, rather than running micro-web servers |
Line 56: | Line 114: |
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
You can use this to make a simple HTTP web server.
Official Documentation
[http://docs.python.org/lib/module-BaseHTTPServer.html BaseHTTPServer module documentation] - what we use directly
[http://docs.python.org/lib/module-SocketServer.html SocketServer module documentation] - behind the BaseHttpServer
Example Code
Responding with an HTML Page
1 import time
2 import BaseHTTPServer
3
4
5 HOST_NAME = 'example.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.server_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 = 'example.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.server_close()
33 print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)
Parameterizing
When you want to make your server respect some parameters, it's easiest to do so via the server, rather than the handler.
That is, make a subclass of the server, that accepts some additional parameters. Have the server record those parameters.
Then, in the handler, use s.server to get to the server, and access the parameters through it.
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)