from mod_python import apache, util import os import sys config = apache.import_module('zptool.config') zptool = apache.import_module('zptool.zptool') def handler(request): """A mod_python handler for zptool Example .htaccess configuration:: SetHandler mod_python PythonPath "sys.path+['/path/to/zptool','/path/to/sapt']" PythonHandler zptool.handler | .pt .zpt """ filename = request.filename # note that we let zptool handle dirs if (not os.path.isdir(filename) and os.path.splitext(filename)[1] not in config.handler_extensions): return apache.DECLINED request.content_type = 'text/html;charset=%s' % (config.charset,) context = {'environ': {}, 'form': util.FieldStorage(request), 'config': config, 'request': request, 'headers': {'content-type': 'text/html; charset=%s' % config.charset}, } context['environ'].update(dict([(k.lower(), v) for k, v in apache.build_cgi_env(request).items()])) z = zptool.ZPTool(config.envdir) if not os.path.exists(filename): rendered = z.render_404(filename, context) elif os.path.isdir(filename): newfilename = os.path.join(filename, 'index.zpt') if os.path.isfile(newfilename): filename = newfilename try: rendered = z.render(filename, context) except: exc, e, tb = sys.exc_info() rendered = z.render_error_page(exc, e, tb, context) del tb ct = context['headers'].pop('content-type') request.content_type = ct for k, v in context['headers'].iteritems(): request.headers_out['-'.join([x.capitalize() for x in k.split('-')])] = v request.write(rendered.encode(config.charset, 'replace')) return apache.OK