SVN: r25573 - trunk/quixote/demo
David Binger <dbinger-fVcApmY9cLvQ3/1i3zOLAti2O/[email protected]> Thu, 11 Nov 2004 11:57:31 -0500
| Newsgroups | gmane.comp.web.quixote.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: dbinger
Date: 2004-11-11 10:18:24 -0500 (Thu, 11 Nov 2004)
New Revision: 25573
Added:
trunk/quixote/demo/demo1.py
trunk/quixote/demo/demonstrate.py
Log:
Add demonstrate.py, a script for running a demo on a local port.
Add demo1.py, a basic traversal demo.
Added: trunk/quixote/demo/demo1.py
===================================================================
--- trunk/quixote/demo/demo1.py 2004-11-11 15:12:00 UTC (rev 25572)
+++ trunk/quixote/demo/demo1.py 2004-11-11 15:18:24 UTC (rev 25573)
@@ -0,0 +1,84 @@
+"""$URL$
+$Id$
+"""
+from quixote import get_response
+from quixote.directory import Directory
+from quixote.errors import PublishError
+from quixote.html import href
+from quixote.util import dump_request
+
+def format_page(title, content, style_sheet="/base.css"):
+ return ('<html><head><title>%(title)s</title>'
+ '<link rel="stylesheet" href="%(style_sheet)s" type="text/css">'
+ '</head><body>%(content)s</body></html>') % locals()
+
+def format_request():
+ return format_page('Request', dump_request())
+
+def format_link_list(targets):
+ return '<ul>%s</ul>' % ''.join([
+ '<li>%s</li>' % href(target, target) for target in targets])
+
+class SubDirectory(Directory):
+
+ _q_exports = ["", "dumpreq"]
+
+ dumpreq = format_request
+
+ def _q_index(self):
+ return format_page('Lookup', format_link_list(range(5)))
+
+ def _q_lookup(self, component):
+ return format_page(
+ 'Found: %s' % component,
+ '<div style="font-size:x-large">%s</div>' % component)
+
+class RootDirectory(Directory):
+
+ _q_exports = ["",
+ "simple",
+ "error",
+ "publish_error",
+ "dumpreq",
+ ("base.css", "css"),
+ "sub"]
+
+ def _q_index(self):
+ """
+ This is exported as "".
+ """
+ s = ('This demonstation is intended to show the basic '
+ 'Quixote traversal pattern in action. ')
+ s += '<ul>'
+ for item in self._q_exports:
+ if item:
+ if type(item) is tuple:
+ name = item[0]
+ elif callable(getattr(self, item)):
+ name = item
+ else:
+ name = item + '/'
+ s += '<li>%s</li>' % href(name, name)
+ s += '</ul>'
+ return format_page('Demo1', s)
+
+ def simple(self):
+ # This function returns a plain text document, not HTML.
+ get_response().set_content_type("text/plain")
+ return "This is the Python function 'quixote.demo.simple'.\n"
+
+ def error(self):
+ raise ValueError, "this is a Python exception"
+
+ def publish_error(self):
+ raise PublishError("Publishing error raised by publish_error")
+
+ def css(self):
+ get_response().set_content_type("text/css")
+ return 'body { border: thick solid green; padding: 2em; }'
+
+ def dumpreq(self):
+ return format_request()
+
+ sub = SubDirectory()
+
Property changes on: trunk/quixote/demo/demo1.py
___________________________________________________________________
Name: svn:keywords
+ HeadURL Id
Added: trunk/quixote/demo/demonstrate.py
===================================================================
--- trunk/quixote/demo/demonstrate.py 2004-11-11 15:12:00 UTC (rev 25572)
+++ trunk/quixote/demo/demonstrate.py 2004-11-11 15:18:24 UTC (rev 25573)
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+"""
+$URL$
+$Id$
+
+Run a simple HTTPServer on a local port, processing all requests
+using a Quixote Directory instance. Command line options allow
+the specification of Directory and/or Publisher classes.
+"""
+import sys
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+from quixote import enable_ptl
+from quixote.http_request import HTTPRequest
+from quixote.publish import get_publisher
+
+class HTTPRequestHandler(BaseHTTPRequestHandler):
+
+ def get_cgi_env(self, method):
+ env = dict(
+ SERVER_SOFTWARE="demonstrate.py/1.0",
+ SERVER_NAME=self.server.server_name,
+ GATEWAY_INTERFACE='CGI/1.1',
+ SERVER_PROTOCOL=self.protocol_version,
+ SERVER_PORT=str(self.server.server_port),
+ REQUEST_METHOD=method,
+ REMOTE_ADDR=self.client_address[0],
+ SCRIPT_NAME='')
+ if '?' in self.path:
+ env['PATH_INFO'], env['QUERY_STRING'] = self.path.split('?')
+ else:
+ env['PATH_INFO'] = self.path
+ if self.headers.typeheader is None:
+ env['CONTENT_TYPE'] = self.headers.type
+ else:
+ env['CONTENT_TYPE'] = self.headers.typeheader
+ env['CONTENT_LENGTH'] = self.headers.getheader('content-length') or "0"
+ accept = []
+ for line in self.headers.getallmatchingheaders('accept'):
+ if line[:1] in "\t\n\r ":
+ accept.append(line.strip())
+ else:
+ accept = accept + line[7:].split(',')
+ env['HTTP_ACCEPT'] = ','.join(accept)
+ ua = self.headers.getheader('user-agent')
+ if ua:
+ env['HTTP_USER_AGENT'] = ua
+ co = filter(None, self.headers.getheaders('cookie'))
+ if co:
+ env['HTTP_COOKIE'] = ', '.join(co)
+ return env
+
+ def process(self, env):
+ request = HTTPRequest(self.rfile, env)
+ response = get_publisher().process_request(request)
+ try:
+ self.send_response(response.get_status_code(),
+ 'Script output follows')
+ response.write(self.wfile)
+ except IOError, err:
+ print "IOError while sending response ignored: %s" % err
+
+ def do_POST(self):
+ return self.process(self.get_cgi_env('POST'))
+
+ def do_GET(self):
+ return self.process(self.get_cgi_env('GET'))
+
+def demo_directory(port=8000,
+ root_directory='quixote.demo.DemoUI',
+ publisher='quixote.publish.Publisher'):
+ enable_ptl()
+ def import_class(name):
+ i = name.rfind('.')
+ module_name = name[:i]
+ class_name = name[i+1:]
+ __import__(module_name)
+ return getattr(sys.modules[module_name], class_name)
+ root_directory_instance = import_class(root_directory)()
+ if get_publisher() is None:
+ publisher_class = import_class(publisher)
+ publisher_class(root_directory_instance, display_exceptions='plain')
+ HTTPRequestHandler.protocol_version = 'HTTP/1.0'
+ httpd = HTTPServer(('', port), HTTPRequestHandler)
+ sa = httpd.socket.getsockname()
+ print "Serving HTTP on", sa[0], "port", sa[1], "..."
+ httpd.serve_forever()
+
+if __name__ == '__main__':
+ from optparse import OptionParser
+ parser = OptionParser()
+ parser.set_description(
+ "Runs a simple HTTP server that processes all requests "
+ "through a Directory.\n "
+ "This is for demonstration purposes only.\n")
+ default_port = 8000
+ parser.add_option(
+ '--port', dest="port", default=default_port,
+ type="int",
+ help="Port for the server to listen on. (default=%s)" % default_port)
+ default_root_directory = 'quixote.demo.demo1.RootDirectory'
+ parser.add_option(
+ '--directory', dest="root_directory",
+ default=default_root_directory,
+ help="The root Directory class. (default=%s)" % default_root_directory)
+ default_publisher = 'quixote.publish.Publisher'
+ parser.add_option(
+ '--publisher', dest="publisher",
+ default=default_publisher,
+ help="The Publisher class. (default=%s)" % default_publisher)
+ (options, args) = parser.parse_args()
+ demo_directory(port=options.port,
+ root_directory=options.root_directory,
+ publisher = options.publisher)
Property changes on: trunk/quixote/demo/demonstrate.py
___________________________________________________________________
Name: svn:executable
+ *
Name: svn:keywords
+ HeadURL Id