Graham Dumpleton
grahamd at dscpl.com.au
Sat Jan 14 01:34:43 EST 2006
On 14/01/2006, at 2:52 PM, Fabiano Sidler wrote: > Wow! Two answers within this short time! Are you competing yourself? ;) > > 2006/1/14, Graham Dumpleton <grahamd at dscpl.com.au>: >> Hmmm, I looked at your code, its awfully complicated. > > Which one? The older is much more difficult than the one I have by > now. Actually, the container now only set the name for invoking the > application (handler in this case) and generates some static classes > like Request. In this last thread, you have only posted one bit of code. I used the term "complicated" because you use features line metaclasses, static methods creation, overloading of new, etc. It just seems to fail the test of keeping it simple for me. I can't really see the reason for doing it all, it just seems to me that it is only going to result in something that will be hard to maintain by someone done the track. > The problem now is: How can I get the name 'handler' to be set at the > right place? I'll work on it after a few hours of sleep! ;) Well, I had a snooze for a couple of hours and didn't help me much. ;-) In one of your emails you said you were using configuration of: SetHandler python-program PythonHandler mymodule PythonDebug On This means mymodule::handler() needed to exist. Your quote code did not even have a mymodule.py and there was no handler() at global scope in the code, the only reference to handler() was nested in a function. You were somehow trying to stuff the handler() method into a module of a class, but that wasn't going to work as the type of cls.__module__ is a string not a module, so attempts to set Request and handler in the module were going to be applied to a string object. Ie., a value containing the name of the module, not the actual module. All in all, it wasn't even clear where the entry point was going to be to trigger stuff to created. It also worried me as well that you were making req.write() a static method. Let me describe a few basic concepts about mod_python which may help you (or not). When you specify 'PythonHandler', the value can be the name of a module, in which case that module must provide a 'handler()" function as entry point. Or, it can specify 'module::name' where name is the name of a function in the module to use as an entry point. Whatever the entry point is, it needs to take the single argument which is the request object. What most people don't realise is that if 'name' identifies an unbound method of a class type, an instance of the class type will be created and then the method will be called. Thus you can have: # .htaccess SetHandler python-program PythonHandler example::MyWebApp.__call__ # example.py from mod_python import apache class MyWebApp: def __init__(self,req): apache.log_error("__init__") pass def __call__(self,req): apache.log_error("__call__") req.content_type = 'text/plain' req.write('hello') return apache.OK In terms of what you are doing, if you wanted an instance of MyWebApp to be created on each class, this is what you would be best off doing. The __init__() method could do any initialisation which might be specific to mod_python to create your server independent interface. Because __init__() must accept a request object, derived classes couldn't override it though for their own purposes. Now I don't know if this helps in anyway. I could ramble on a bit more about other things that may be of interest, but have to run out the door right now. Graham
|