#!/usr/bin/env python ## ## webapp.py - A simplistic Web application framework ## import sys, os, os.path import cgi, logging, traceback import re # comment out at runtime. #import cgitb; cgitb.enable() # quote HTML metacharacters def q(x): return x.replace('&','&').replace('>','>').replace('<','<').replace('"','"') # encode parameters as a URL Q = re.compile(r'[^a-zA-Z0-9_.-=]') def url(base, **kw): r = [] for (k,v) in kw.iteritems(): v = Q.sub(lambda m: '%%%02X' % ord(m.group(0)), encoder(q(v), 'replace')[0]) r.append('%s=%s' % (k, v)) return base+'&'.join(r) ## WebApp ## class WebApp(object): LOGDIR = '.' LOGFILE = 'log' def __init__(self, infp=sys.stdin, outfp=sys.stdout, codec='utf-8', logdir=LOGDIR, logfile=LOGFILE, loglevel=logging.DEBUG, environ=os.environ): self.outfp = outfp self.codec = codec self.logdir = logdir self.logpath = os.path.join(logdir, logfile) logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=loglevel, filename=self.logpath, filemode='a') self.path_info = environ.get('PATH_INFO', '/') self.remote_addr = environ.get('REMOTE_ADDR', 'unknown') self.method = environ.get('REQUEST_METHOD', 'GET') self.server = environ.get('SERVER_SOFTWARE', 'unknown') self.baseurl = 'http://%s' % environ.get('SERVER_NAME', 'localhost') server_port = environ.get('SERVER_PORT', '80') if server_port != '80': self.baseurl += ':%s' % server_port self.baseurl += os.path.dirname(self.path_info) self.content_type = 'text/html; charset=%s' % codec self.form = cgi.FieldStorage(fp=infp, environ=environ) return def get(self, k): if k in self.form: return unicode(self.form.getvalue(k), self.codec, 'ignore') else: return None def put(self, *args): for x in args: if isinstance(x, str): self.outfp.write(x) elif isinstance(x, unicode): self.outfp.write(x.encode(self.codec, 'xmlcharrefreplace')) return def http_200(self): if self.server.startswith('cgi-httpd'): # required for cgi-httpd self.outfp.write('HTTP/1.0 200 OK\r\n') self.outfp.write('Content-Type: %s\r\n' % self.content_type) self.outfp.write('Connection: close\r\n\r\n') return def http_404(self): if self.server.startswith('cgi-httpd'): # required for cgi-httpd self.outfp.write('HTTP/1.0 404 Not Found\r\n') self.outfp.write('Content-Type: text/html\r\n') self.outfp.write('Connection: close\r\n\r\n') self.outfp.write('
page does not exist\n') return def http_301(self, url): if self.server.startswith('cgi-httpd'): # required for cgi-httpd self.outfp.write('HTTP/1.0 301 Moved\r\n') self.outfp.write('Location: %s\r\n\r\n' % url) return def header(self, title): self.put( u'Hello, ', q(name), '!', u'
back') self.footer() return # main if __name__ == '__main__': sys.exit(WebApp().run(sys.argv))