[ http://issues.apache.org/jira/browse/MODPYTHON-73?page=comments#action_12320783 ]
Graham Dumpleton commented on MODPYTHON-73: ------------------------------------------- I checked again, you mustn't have it quite right as it definitely fails for me. Eg: def index(): return "<html></body><p>XOX</p></body></html>" class _Dummy: pass dummy = _Dummy() dummy.__call__ = index When I use URL /~grahamd/mp32/page/dummy I get: Mod_python error: "PythonHandler mod_python.publisher" Traceback (most recent call last): File "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/apache.py", line 299, in HandlerDispatch result = object(req) File "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/publisher.py", line 213, in handler published = publish_object(req, object) File "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/publisher.py", line 410, in publish_object return publish_object(req,util.apply_fs_data(object, req.form, req=req)) File "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/site-packages/mod_python/util.py", line 398, in apply_fs_data fc = object.__call__.im_func.func_code AttributeError: 'function' object has no attribute 'im_func' With the fix I suggested, it works. If I import the file into Python command line, can call it okay: >>> import page >>> page.dummy() '<html></body><p>XOX</p></body></html>' So it is valid to do in Python. > Using objects to create an explicit hierarchy. > ---------------------------------------------- > > Key: MODPYTHON-73 > URL: http://issues.apache.org/jira/browse/MODPYTHON-73 > Project: mod_python > Type: Improvement > Components: publisher > Versions: 3.2.0 > Reporter: Graham Dumpleton > Priority: Minor > Fix For: 3.2.0 > Attachments: util.diff.txt > > Cut and paste of idea presented on mailing list. See: > http://www.mail-archive.com/python-dev@httpd.apache.org/msg00294.html > Have a strange patch here for consideration. > In CherryPy, one can manually construct the page hierarchy by writing: > cpg.root.onepage = OnePage() > cpg.root.otherpage = OtherPage() > cpg.root.some = Page() > cpg.root.some.page = Page() > The closest equivalent to this in mod_python is the publisher handler, > whereby a URL will be mapped to attributes and member functions of a > class. One generally though has to create an actual class to encapsulate > all the bits together. > One can to a degree with publisher create a mapping without creating a > proper class by using: > class _Mapping: > pass > def _method1(): > return "_method1" > def _method2(): > return "_method2" > object = _Mapping() > object.onepage = _method1 > object.otherpage = _method2 > What isn't possible though without creating a real class is have a > normal function which is called when the dummy mapping object itself > is the target. Ie., following does not work: > object.__call__ = _method1 > This is because util.apply_fs_data() assumes that __call__() is always > an object method. > I know this is sort of an abuse of __call__(), but it does actually > work in Python itself, just not in mod_python when URLs are mapped to > object. > >>> class A: > ... pass > ... > >>> def _method(): > ... return "method" > ... > >>> a=A() > >>> a.__call__ = _method > >>> > >>> a() > 'method' > Anyway, I have attached a patch which would allow this sort of thing to > actually work within mod_python. > I feel it could be a useful way of quickly constructing special object > hierarchies from other functions, objects and attributes without having > to actually create real classes. > For example: > def _method(): > return "method" > class _Mapping: > pass > _subdir1 = _Mapping() > _subdir1.__call__ = _method # .../root/subdir1 > _subdir1.page1 = _method # .../root/subdir1/page1 > _subdir1.page2 = _method # .../root/subdir1/page2 > root = _Mapping() > root.__call__ = _method # .../root > root.page1 = _method # .../root/page1 > root.subdir1 = _subdir1 -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira