""" DEPRECATED. Use the WSGI handler instead. mod_python handler for PyBlosxom. Extends the PyBlosxom Request and adds session handling and a run method. Based on work from Wari Wahab, the creator of PyBlosxom. Configuration Examples: -------------------- Directory setup: /home/user/myblog (this folder should be outside your document root) data/ (your blog entries go here) plugins/ config.py mod_pyblosxom.py pyblosxom.cgi (only needed for install verification and static rendering) Example configuration for apache httpd.conf: Note: If you have a folder in your document root that has the same name as the Location used below, the SCRIPT_NAME and PATH_INFO variables will be broken. %<-------------------------------------------------- Order allow,deny Allow from all #PythonDebug On # Use mod_python as handler SetHandler python-program # Set the path to the mod_pyblosxom.py and config.py files. # Also add the path to the pyblosxom install dir if not installed site-wide. PythonPath "['/home/user/myblog']+sys.path" #PythonPath "['/home/user/myblog', '/path/to/pyblosxom/install']+sys.path" # Choose the ModPythonRequest class as handler. PythonHandler mod_pyblosxom::ModPythonRequest.run %<-------------------------------------------------- Example configuration for apache .htaccess: %<-------------------------------------------------- # This is _not_ tested. I don't use it this way. Order allow,deny Allow from all #PythonDebug On SetHandler python-program PythonPath "['/home/user/myblog']+sys.path" PythonHandler mod_pyblosxom::ModPythonRequest.run %<-------------------------------------------------- Note: I'm a total python and pyblosxom newbie. This is actually one of my first python scripts ever. USE AT YOUR OWN RISK. """ __author__ = 'Steven Armstrong ' __version__ = "0.1.0" __date__ = "$Date: 2004/12/11 07:33:43 $" __revision__ = "$Revision: 1.1 $" __copyright__ = "Copyright (c) 2004 Steven Armstrong" __license__ = "GPL 2+" DEBUG = False # Python imports from mod_python import apache, util, Session import sys # Pyblosxom imports from Pyblosxom.pyblosxom import PyBlosxom, Request from config import py as cfg class ModPythonRequest(Request): """ Subclass of Pyblosxoms Request class. Provides a "run" method so it can be called directly from within mod_python. This allowes for a site wide install without reduntant request handler scripts in each blog's directory. """ def __init__(self, req): """ Saves mod_pythons request and creates/restores the session for it. Sets basic variables by calling the _configure method. @param req: the mod_python request instance """ Request.__init__(self) self._mp_request = req self.contentTypeSet = False self._configure() def getMPRequest(self): """ Returns the mod_python request instance. @returns: mod_python request instance """ return self._mp_request def getSession(self): """ Returns the session associated with this request. @returns: mod_python session instance """ if not self._session: self._session = Session.Session(self.getMPRequest()) return self._session def _configure(self): """ Sets basic variables using the req.subprocess_env dict. Sets the mod_python request instance as PyBlosxoms stdout. Sets the request.content_type to a default of 'text/html'. Sets PyBlosxoms renderer to 'modpython' and tells it to use mod_python.util.FieldStorage instead of cgi.FieldStorage. Note: for this to work the pyblosxom.py pyblosxom_handler has to be hacked so it doesn't reset the FieldStorage handling back to cgi. Use the patch below to accomplish this. %<-------------------------------------------------- Index: pyblosxom.py =================================================================== RCS file: /cvsroot/pyblosxom/pyblosxom/Pyblosxom/pyblosxom.py,v retrieving revision 1.51 diff -u -r1.51 pyblosxom.py --- pyblosxom.py 19 Nov 2004 18:11:15 -0000 1.51 +++ pyblosxom.py 26 Nov 2004 12:22:19 -0000 @@ -415,7 +415,10 @@ data['renderer'] = r - request.addHttp( {"form": cgi.FieldStorage() } ) + # hack to make pyblosxom play nicely with mod_python + if not request.getHttp().has_key("form"): + request.addHttp( {"form": cgi.FieldStorage() } ) + # process the path info to determine what kind of blog entry(ies) # this is tools.run_callback("pathinfo", %<-------------------------------------------------- """ req = self.getMPRequest() req.content_type = 'text/html' # default req.add_common_vars() d = {} for k, v in req.subprocess_env.items(): d[k] = v d['form'] = util.FieldStorage(req) if not d.has_key('PATH_INFO'): d['PATH_INFO'] = "" cfg['stdoutput'] = self cfg['renderer'] = 'modpython' cfg['base_url'] = "http://www.c-area.lan/weblog" self.addConfiguration(cfg) self.addHttp(d) def flush(self): req = self.getMPRequest() req.flush() def write(self, data, flush=1): req = self.getMPRequest() # fix the mod_python content-type handling # XXX: this is a really ugly hack if not self.contentTypeSet: ct = data[:12] if ct and ct.lower() == "content-type": if not "\n" in data: ctvalue = data[13:] data = None else: i = data.index("\n") ctvalue = data[13:i] data = data[i+1:] if data.startswith("\n"): data = data[1:] ctvalue = ctvalue.strip() req.content_type = ctvalue self.contentTypeSet = True # write the data if data: req.write(data, flush) def debug(self): """ Adds some debug info to the response stream. """ req = self.getMPRequest() if not req.content_type: req.content_type = 'text/html' req.writeln = lambda s: req.write(s +"
\n") req.writeln("toggle debug") req.write("
") req.writeln("path_info: "+ req.path_info) req.writeln("uri: "+ req.uri) req.writeln("filename: "+ req.filename) req.writeln("canonical_filename: "+ req.canonical_filename) req.write("
\n") for k, v in req.subprocess_env.items(): req.writeln("%s = %s" % (k, v)) req.write("
\n") req.write("
") def run(self, req): """ mod_python calls this with its request object. We ignore it here cause we allready have it from the __init__ method. Just create a PyBlosxom instance, run it and return a apache.OK to keep mod_python happy. """ if DEBUG: self.debug() try: p = PyBlosxom(self) p.run() return apache.OK except: import utils utils.log_exception() return apache.HTTP_INTERNAL_SERVER_ERROR def handler(req): """ Handler executed when mod_python is configured to use this file as a script instead of directly calling ModPythonRequest.run. """ pyblosxomreq = ModPythonRequest(req) return pyblosxomreq.run(req)