[ 
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

Reply via email to