Cheetah error rendering / better template debugging.

Oisin Mulvihill <[email protected]> Fri, 5 Nov 2010 16:06:18 +0000
Newsgroups gmane.comp.python.cheetah
Message-ID <[email protected]>
--00163646d6a8b494e304945075cf
Content-Type: text/plain; charset=ISO-8859-1

Hi There,

I  wrote a quick article for my blog on this
(http://www.sourceweaver.com/posts/better-cheetah-error-renderer). It
then occurred to me I should post to the cheetah list. I originally
searched the archives in vain when hunting for a solution. I hope this
helps the next person looking to do something similar.

In my current job I work with a Django web application used to manage
configuration files. Users of the system can create data and templates
in the web app. The problem I encountered was displaying errors
'nicely'. What I wanted was template errors to be rendered showing
which line and what problem occurred. After a lot of digging and code
experimentation I found the solution I was looking for.

For example I have the following template:

    src = """
    0
    1  hello there $XYZ
    2
    3  $notpresent
    4
    5  $XYZ['notpresent']
    6
    7
    8  A KeyError for an unkown key 'fish': $abc['fish']
    9
    10
    11 ${ 0/0 } A more general error.
    12
    """.strip()

Cheetah is given this data dictionary:

    # Data dict:
    d = dict(XYZ=123, abc={})

My cheetaherrorrender.render_showing_errors(src, d) renders the
template as follows:

    0
    1  hello there 123
    2
    ERROR on line 3, Cheetah.NameMapper.NotFound(cannot find
'notpresent'): 3  $notpresent
    4
    ERROR on line 5, exceptions.TypeError(unsubscriptable object):  5
$XYZ['notpresent']
    6
    7
    ERROR on line 8, exceptions.KeyError('fish'):   8  A KeyError for
an unkown key 'fish': $abc['fish']
    9
    10
    ERROR on line 11, exceptions.ZeroDivisionError(integer division or
modulo by zero):     11 ${ 0/0 } A more general error.
    12

This very quickly lets you debug and rectify problems. I can't find an
alternative approach to my solution. I'd welcome suggestions on how I
can improve the render_showing_errors(). I've attached my python code
however you can also get it from my site here:
http://www.sourceweaver.com/public/scripts/cheetaherrorrender.py

All the best,

Oisin

--00163646d6a8b494e304945075cf
Content-Type: text/x-python; charset=US-ASCII; name="cheetaherrorrender.py"
Content-Disposition: attachment; filename="cheetaherrorrender.py"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gg592uaq0

IyBSZWxlYXNlZCB1bmRlciBCU0QgbGljZW5zZSwgR28gbnV0cy4KIyBPaXNpbiBNdWx2aWhpbGwg
KG9pc2luIGQtby10IG11bHZpaGlsbCBhLXQgZ21haWwgZC1vLXQgY29tKSwgMjAxMC0xMS0wNS4K
aW1wb3J0IENoZWV0YWgKZnJvbSBDaGVldGFoLlRlbXBsYXRlIGltcG9ydCBUZW1wbGF0ZQpmcm9t
IENoZWV0YWguRXJyb3JDYXRjaGVycyBpbXBvcnQgTGlzdEVycm9ycwoKIyBUaGUgdGVtcGxhdGUg
d2l0aCBlcnJvcnMuIFRoZSBsaW5lIG51bWJlcnMgSSBzaG93IGJ5IGhhbmQKIyBzaG91bGQgbWF0
Y2ggdXAgd2l0aCB0aGUgZXJyb3JzIGZvdW5kIGFuZCBoaWdobGlnaHRlZC4KIwpzcmMgPSAiIiIK
MAoxICBoZWxsbyB0aGVyZSAkWFlaCjIKMyAgJG5vdHByZXNlbnQKNAo1ICAkWFlaWydub3RwcmVz
ZW50J10KNgo3CjggIEEgS2V5RXJyb3IgZm9yIGFuIHVua293biBrZXkgJ2Zpc2gnOiAkYWJjWydm
aXNoJ10KOQoxMCAKMTEgJHsgMC8wIH0gQSBtb3JlIGdlbmVyYWwgZXJyb3IuCjEyCiIiIi5zdHJp
cCgpCgojIERhdGEgZGljdDoKZCA9IGRpY3QoWFlaPTEyMywgYWJjPXt9KQoKIyBFeGFtcGxlIE91
dHB1dAojCiMgUmVuZGVyZWQgVGVtcGxhdGU6CiMgLS0tLS0tLS0tLS0tLS0tLS0tCiMgMAojIDEg
IGhlbGxvIHRoZXJlIDEyMwojIDIKIyBFUlJPUiBvbiBsaW5lIDMsIENoZWV0YWguTmFtZU1hcHBl
ci5Ob3RGb3VuZChjYW5ub3QgZmluZCAnbm90cHJlc2VudCcpOiAzICAkbm90cHJlc2VudAojIDQK
IyBFUlJPUiBvbiBsaW5lIDUsIGV4Y2VwdGlvbnMuVHlwZUVycm9yKHVuc3Vic2NyaXB0YWJsZSBv
YmplY3QpOiAgNSAgJFhZWlsnbm90cHJlc2VudCddCiMgNgojIDcKIyBFUlJPUiBvbiBsaW5lIDgs
IGV4Y2VwdGlvbnMuS2V5RXJyb3IoJ2Zpc2gnKTogICA4ICBBIEtleUVycm9yIGZvciBhbiB1bmtv
d24ga2V5ICdmaXNoJzogJGFiY1snZmlzaCddCiMgOQojIDEwIAojIEVSUk9SIG9uIGxpbmUgMTEs
IGV4Y2VwdGlvbnMuWmVyb0RpdmlzaW9uRXJyb3IoaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8g
YnkgemVybyk6ICAgICAxMSAkeyAwLzAgfSBBIG1vcmUgZ2VuZXJhbCBlcnJvci4KIyAxMgojIAoK
CmRlZiByZW5kZXJfc2hvd2luZ19lcnJvcnMoc291cmNlLCBuYW1lc3BhY2VzKToKICAgICIiIkdp
dmVuIHRoZSBDaGVldGFoIHRlbXBsYXRlIGFuZCBuYW1lc3BhY2UgdG8gZmlsbCBpdCB3aWxsIHJl
bmRlciB0aGUgb3V0cHV0LgoKICAgIFRoaXMgd2lsbCBjYXRjaCBhbGwgZXhjZXB0aW9ucyBhbmQg
dGhlbiBoaWdobGlnaHQgZWFjaCBsaW5lIAogICAgb24gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVk
LgoKICAgIDpyZXR1cm5zOiBUaGUgcmVuZGVyZWQgdGVtcGxhdGUuIElmIGVycm9ycyBvY2N1cmVk
LCBlYWNoIGxpbmUgY2F1c2luZyAKICAgIHRoZSBwcm9ibGVtIHdpbGwgY29udGFpbiBhIG1lc3Nh
Z2UgaW4gdGhlIGZvbGxvd2luZyBmb3JtOgoKICAgIEVycm9yIG9uIGxpbmUgWFlaLCA8ZXhjZXB0
aW9uIGNsYXNzKDxleGNlcHRpb24gbWVzc2FnZT4pPjogPG9yaWdpbmFsIGxpbmU+CgogICAgRm9y
IGV4YW1wbGU6CgogICAgRVJST1Igb24gbGluZSAzLCBDaGVldGFoLk5hbWVNYXBwZXIuTm90Rm91
bmQoY2Fubm90IGZpbmQgJ25vdHByZXNlbnQnKTogMyAgJG5vdHByZXNlbnQKCgogICAgIiIiCiAg
ICAjIE1vbmtleSBwYXRjaCBteSBjYXRjaCBhbGwgZXhjZXB0aW9ucyBlcnJvciBoYW5kbGVyOgog
ICAgY2xhc3MgT01fTGlzdEFsbChMaXN0RXJyb3JzKToKICAgICAgICBfZXhjZXB0aW9uc1RvQ2F0
Y2ggPSAoRXhjZXB0aW9uLCkKICAgIAogICAgIyBJIGhhdmUgdG8gZG8gdGhpcyBhcyB0aGVyZSBk
b2Vzbid0IGFwcGVhciB0byBiZSBhIHdheQogICAgIyBJIGNhbiBwYXNzIGluIG15IExpc3RBbGxF
cnJvcnMuIEkndmUgdHJpZWQgbWFueSBkaWZmZXJlbnQKICAgICMgYXBwcm9hY2hlcy4gVGhlIENo
ZWV0YWggaW50ZXJuYWxzIGFyZSAnaGFpcnknIGluIHRoZSBleHRyZW1lLgogICAgIyBUaGlzIHBy
b3ZlZCB0aGUgZWFzaWVzdCBhcHByb2FjaC4KICAgIENoZWV0YWguRXJyb3JDYXRjaGVycy5PTV9M
aXN0QWxsID0gT01fTGlzdEFsbAoKICAgIGNsYXNzIFQoVGVtcGxhdGUpOgogICAgICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBzb3VyY2UsIG5hbWVzcGFjZXMsICphcmdzLCAqKmt3KToKICAgICAgICAg
ICAgIyBhZGQgdGhlIGVycm9yQ2F0Y2hlciB0byB0aGUgdGVtcGxhdGUuIFRyeWluZyB0byBwcm9n
cmFtYXRpY2FsbHkgZG8KICAgICAgICAgICAgIyB0aGlzIHByb3ZlZCBhIG5pZ2h0bWFyZS4gSSBn
YXZlIHVwIGFuZCBjaG9vc2UgdGhpcyBzaW1wbGUgYXBwcm9hY2guCiAgICAgICAgICAgIHNvdXJj
ZSA9ICIjZXJyb3JDYXRjaGVyIE9NX0xpc3RBbGxcbiVzIiAlIHNvdXJjZQogICAgICAgICAgICBz
dXBlcihULHNlbGYpLl9faW5pdF9fKHNvdXJjZSwgbmFtZXNwYWNlcywgZXJyb3JDYXRjaGVyPSdP
TV9MaXN0QWxsJywgKmFyZ3MsICoqa3cpCgogICAgdCA9IFQoc291cmNlLCBuYW1lc3BhY2VzKQog
ICAgb3V0cHV0ID0gdC5yZXNwb25kKCkKCiAgICAjIHJlY292ZXIgdGhlIGxpc3Qgb2YgZXJyb3Jz
OgogICAgZXJyb3JzID0gdC5lcnJvckNhdGNoZXIoKS5saXN0RXJyb3JzKCkgCiAgICBpZiBlcnJv
cnM6CiAgICAgICAgbGluZXMgPSBvdXRwdXQuc3BsaXQoJ1xuJykKICAgICAgICBoaWdobGlnaHRl
ZCA9IFtdCiAgICAgICAgdG9fZmluZCA9IGxlbihlcnJvcnMpLTEgIyBpbmNsdWRlIDAKICAgICAg
ICBmb3VuZCA9IDAKICAgICAgICBlcnIgPSBlcnJvcnNbMF0KCiAgICAgICAgIyBIdW50IGZvciB0
aGUgbGluZXMgdG8gaGlnaGxpZ2h0IGVycm9ycy4gVGhlIGxpbmUgbnVtYmVycyBDaGVldGFoIGdp
dmVzIHVzIAogICAgICAgICMgYXJlIG5vdCByZWxpYWJsZS4gVGhlcmVmb3JlIEkgbmVlZCB0byBz
ZWFyY2ggYmFzZWQgb24gdGhlIGNvZGUgdGhhdCBjYXVzZWQKICAgICAgICAjIHRoZSBwcm9ibGVt
LiBUaGlzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSBzYW1lIHBsYWNlLiBUaGUgcGx1cyBwb2ludCBp
cwogICAgICAgICMgdGhlIGVycm9ycyB3aWxsIGZvbGxvdyBlYWNoIG90aGVyIGluIG9yZGVyLiBU
aGlzIG1lYW5zIG9ubHkgb25lIHBhc3MgdGhyb3VnaAogICAgICAgICMgdGhlIG9yaWdpbmFsIHRl
bXBsYXRlIHNvdXJjZSBpcyBuZWVkZWQuCiAgICAgICAgIwogICAgICAgIGZvciBsaW5lX251bWJl
ciwgbGluZSBpbiBlbnVtZXJhdGUobGluZXMpOgogICAgICAgICAgICAjIERvZXMgdGhpcyBsaW5l
IGNvbnRhaW4gdGhlIHJhdyBjb2RlIHRoYXQgY2F1c2VkIHRoZSBwcm9ibGVtPwogICAgICAgICAg
ICBpZiBsaW5lLmZpbmQoZXJyWydyYXdDb2RlJ10pICE9IC0xOgogICAgICAgICAgICAgICAgZXgg
PSByZXByKChlcnJbJ2V4Y192YWwnXSkpLnJlcGxhY2UoJzwnLCcnKQogICAgICAgICAgICAgICAg
ZXggPSBleC5zcGxpdCgpWzBdCiAgICAgICAgICAgICAgICBsaW5lID0gIkVSUk9SIG9uIGxpbmUg
JXMsICVzKCVzKTpcdCVzIiAlIChsaW5lX251bWJlciwgZXgsIHN0cihlcnJbJ2V4Y192YWwnXSks
IGxpbmUpCiAgICAgICAgICAgICAgICBmb3VuZCArPTEKICAgICAgICAgICAgICAgIGlmIGZvdW5k
IDw9IHRvX2ZpbmQ6CiAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJuZXh0IGVycm9yX3RvX2Zp
bmQ6ICIsIGVyclsncmF3Q29kZSddCiAgICAgICAgICAgICAgICAgICAgZXJyID0gZXJyb3JzW2Zv
dW5kXQoKICAgICAgICAgICAgaGlnaGxpZ2h0ZWQuYXBwZW5kKGxpbmUpCiAgICAgICAgICAgIAog
ICAgcmV0dXJuICJcbiIuam9pbihoaWdobGlnaHRlZCkKICAgICAgICAgICAgCgppZiBfX25hbWVf
XyA9PSAiX19tYWluX18iOiAgICAgICAgICAgIAogICAgcmVzdWx0ID0gcmVuZGVyX3Nob3dpbmdf
ZXJyb3JzKHNyYywgZCkKCiAgICBwcmludCAiIiIKUmVuZGVyZWQgVGVtcGxhdGU6Ci0tLS0tLS0t
LS0tLS0tLS0tLQolcwogICAgIiIiICUgKHJlc3VsdCkKCgoKCg==
--00163646d6a8b494e304945075cf
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

------------------------------------------------------------------------------
The Next 800 Companies to Lead America's Growth: New Video Whitepaper
David G. Thomson, author of the best-selling book "Blueprint to a 
Billion" shares his insights and actions to help propel your 
business during the next growth cycle. Listen Now!
http://p.sf.net/sfu/SAP-dev2dev
--00163646d6a8b494e304945075cf
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Cheetahtemplate-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cheetahtemplate-discuss

--00163646d6a8b494e304945075cf--