[mod_python] ANN: Vampire 1.4 is now available.

Graham Dumpleton grahamd at dscpl.com.au
Sun Jan 23 00:40:10 EST 2005

Vampire 1.4 is now available.



See the web site for information on what Vampire is all about.

For those who have been tracking Vampire already, the main new things of
interest in this release are:

   - Vampire can now be used to intercept handlers other than that for 
     PythonHandler directive and it will be directed to a specific module
     indicated within the handlers section of the Vampire config file. 
     if in your ".htaccess" file you might have:

       PythonAccessHandler vampire

     In your ".vampire" config file you might then have:


       accesshandler = %(__config_root__)s/modules/access-handler.py

     The handler function in the specified file must be the default for 
     particular directive, it cannot be modified like it can using "::" 
     the ".htaccess" file.

   - Special conventions can now be used in form arguments to denote data
     which should be translated to dictionaries and list. Specifically:

       Keys (variable names) can have subkeys, with a ``.`` and can be
       numbered with ``-``, like ``a.b-3=something`` means that the value
       ``a`` is a dictionary with a key ``b``, and ``b`` is a list, the
       third(-ish) element with the value ``something``. Numbers are used
       to sort, missing numbers are ignored.

     The code to achieve this bit of magic courtesy of some code from the
     FormEncode/Validator package made available by Ian Bicking.

   - The XmlRpcHandler class has been discarded completely. Instead, a 
     more low level request handler is provided whose job is only to 
     the inbound request and then format the response. The actual 
     of the request is passed off to a supplied callback. This callback
     must work out how to then map the request to a specific method.

     This means that in the first instance the support for XML-RPC 
     is not as useful and more work is required to use it, but it opens
     things up so that more powerful things can be done. For example, a
     means of optionally having the request object also passed through to
     methods could also be implemented. For example:

       import vampire
       import types

       config = vampire.loadConfig(__req__,".vampire")
       modules = config.get("Modules","common")
       module = vampire.importModule("python-utils",modules)

       def handler(req):

         def _callback(req,name,params):
           if name[0:1] != "_":
             if module.__dict__.has_key(name):
               method = module.__dict__[name]
               if type(method) == types.FunctionType:
                 if len(method.func_code.co_varnames) != 0:
                   if method.func_code.co_varnames[0] == "req":
                     params = list(params)
                 return method(*params)
           raise Exception("Method Unavailable")

         return vampire.serviceRequest(req,_callback)

   - A cut down "req" object is now available when the Python code file
     for a handler is being imported. This will be stored in the module 
     "__req__". Once importing of the module has been completed it will 
     deleted out of the module. The cut down "req" object allows access 
     PythonOption variables using get_options(), other mod_python 
     using get_config(), as well as attributes such as "interpreter" etc.
     The "uri" and "filename" are also supplied such that the cut down 
     object can be used on configuration file lookup during module
     importing. This is shown in practice in XML-RPC example above.


Graham Dumpleton (grahamd at dscpl.com.au)

More information about the Mod_python mailing list