Armin Ronacher | 1cc232c | 2007-09-07 17:52:41 +0200 | [diff] [blame] | 1 | import os |
Armin Ronacher | 34f3042 | 2007-03-30 21:58:15 +0200 | [diff] [blame] | 2 | import sys |
Armin Ronacher | 1cc232c | 2007-09-07 17:52:41 +0200 | [diff] [blame] | 3 | sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..')) |
| 4 | |
| 5 | import jdebug |
Christoph Hack | e9e43bb | 2008-04-13 23:35:48 +0200 | [diff] [blame] | 6 | from jinja2 import Environment, DictLoader |
| 7 | from jinja2.exceptions import TemplateNotFound |
Armin Ronacher | 7977e5c | 2007-03-12 07:22:17 +0100 | [diff] [blame] | 8 | from wsgiref.simple_server import make_server |
Armin Ronacher | 7977e5c | 2007-03-12 07:22:17 +0100 | [diff] [blame] | 9 | |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 10 | e = Environment(loader=DictLoader({ |
| 11 | '/': u''' |
| 12 | <html> |
| 13 | <head> |
| 14 | <title>Various Broken Templates</title> |
| 15 | <style type="text/css"> |
| 16 | body { |
| 17 | margin: 2em; |
| 18 | font-size: 1.5em; |
| 19 | font-family: sans-serif |
| 20 | } |
| 21 | a { |
| 22 | color: #d00; |
| 23 | } |
| 24 | </style> |
| 25 | </head> |
| 26 | <body> |
| 27 | <h1>Various Broken Templates</h1> |
| 28 | <p> |
| 29 | This small WSGI application serves some Jinja templates that |
| 30 | are just broken. It uses the colubrid traceback middleware to |
| 31 | render those errors including source code. |
| 32 | </p> |
| 33 | <ul> |
| 34 | <li><a href="syntax_error">syntax error</a></li> |
| 35 | <li><a href="runtime_error">runtime error</a></li> |
| 36 | <li><a href="nested_syntax_error">nested syntax error</a></li> |
| 37 | <li><a href="nested_runtime_error">nested runtime error</a></li> |
Armin Ronacher | a7804ef | 2007-06-15 18:03:21 +0200 | [diff] [blame] | 38 | <li><a href="code_runtime_error">runtime error in code</a></li> |
Armin Ronacher | 10dae5b | 2007-03-31 00:02:32 +0200 | [diff] [blame] | 39 | <li><a href="syntax_from_string">a syntax error from string</a></li> |
| 40 | <li><a href="runtime_from_string">runtime error from a string</a></li> |
Armin Ronacher | 1cc232c | 2007-09-07 17:52:41 +0200 | [diff] [blame] | 41 | <li><a href="multiple_templates">multiple templates</a></li> |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 42 | </ul> |
| 43 | </body> |
| 44 | </html> |
| 45 | ''', |
| 46 | '/syntax_error': u''' |
| 47 | {% for item in foo %} |
| 48 | ... |
| 49 | {% endif %} |
| 50 | ''', |
| 51 | '/runtime_error': u''' |
| 52 | {% set foo = 1 / 0 %} |
| 53 | ''', |
| 54 | '/nested_runtime_error': u''' |
| 55 | {% include 'runtime_broken' %} |
| 56 | ''', |
| 57 | '/nested_syntax_error': u''' |
| 58 | {% include 'syntax_broken' %} |
| 59 | ''', |
Armin Ronacher | e39a5d2 | 2007-06-23 21:11:53 +0200 | [diff] [blame] | 60 | '/code_runtime_error': u'''We have a runtime error here: |
| 61 | {{ broken() }}''', |
Armin Ronacher | 1cc232c | 2007-09-07 17:52:41 +0200 | [diff] [blame] | 62 | '/multiple_templates': '''\ |
| 63 | {{ fire_multiple_broken() }} |
| 64 | ''', |
Armin Ronacher | a7804ef | 2007-06-15 18:03:21 +0200 | [diff] [blame] | 65 | |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 66 | 'runtime_broken': '''\ |
| 67 | This is an included template |
| 68 | {% set a = 1 / 0 %}''', |
| 69 | 'syntax_broken': '''\ |
| 70 | This is an included template |
Armin Ronacher | 1cc232c | 2007-09-07 17:52:41 +0200 | [diff] [blame] | 71 | {% raw %}just some foo''', |
| 72 | 'multiple_broken': '''\ |
| 73 | Just some context: |
| 74 | {% include 'macro_broken' %} |
| 75 | {{ broken() }} |
| 76 | ''', |
| 77 | 'macro_broken': '''\ |
| 78 | {% macro broken %} |
| 79 | {{ 1 / 0 }} |
| 80 | {% endmacro %} |
| 81 | ''' |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 82 | })) |
Armin Ronacher | 1cc232c | 2007-09-07 17:52:41 +0200 | [diff] [blame] | 83 | e.globals['fire_multiple_broken'] = lambda: \ |
| 84 | e.get_template('multiple_broken').render() |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 85 | |
Armin Ronacher | 10dae5b | 2007-03-31 00:02:32 +0200 | [diff] [blame] | 86 | FAILING_STRING_TEMPLATE = '{{ 1 / 0 }}' |
| 87 | BROKEN_STRING_TEMPLATE = '{% if foo %}...{% endfor %}' |
| 88 | |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 89 | |
Armin Ronacher | a7804ef | 2007-06-15 18:03:21 +0200 | [diff] [blame] | 90 | def broken(): |
| 91 | raise RuntimeError("I'm broken") |
| 92 | |
| 93 | |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 94 | def test(environ, start_response): |
Armin Ronacher | 10dae5b | 2007-03-31 00:02:32 +0200 | [diff] [blame] | 95 | path = environ.get('PATH_INFO' or '/') |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 96 | try: |
Armin Ronacher | 10dae5b | 2007-03-31 00:02:32 +0200 | [diff] [blame] | 97 | tmpl = e.get_template(path) |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 98 | except TemplateNotFound: |
Armin Ronacher | 10dae5b | 2007-03-31 00:02:32 +0200 | [diff] [blame] | 99 | if path == '/syntax_from_string': |
| 100 | tmpl = e.from_string(BROKEN_STRING_TEMPLATE) |
| 101 | elif path == '/runtime_from_string': |
| 102 | tmpl = e.from_string(FAILING_STRING_TEMPLATE) |
| 103 | else: |
| 104 | start_response('404 NOT FOUND', [('Content-Type', 'text/plain')]) |
| 105 | return ['NOT FOUND'] |
Armin Ronacher | 8ff24c4 | 2007-03-21 20:33:45 +0100 | [diff] [blame] | 106 | start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')]) |
Armin Ronacher | a7804ef | 2007-06-15 18:03:21 +0200 | [diff] [blame] | 107 | return [tmpl.render(broken=broken).encode('utf-8')] |
| 108 | |
Armin Ronacher | 7977e5c | 2007-03-12 07:22:17 +0100 | [diff] [blame] | 109 | |
Armin Ronacher | 34f3042 | 2007-03-30 21:58:15 +0200 | [diff] [blame] | 110 | if __name__ == '__main__': |
Armin Ronacher | a7804ef | 2007-06-15 18:03:21 +0200 | [diff] [blame] | 111 | from werkzeug.debug import DebuggedApplication |
Armin Ronacher | 1cc232c | 2007-09-07 17:52:41 +0200 | [diff] [blame] | 112 | app = DebuggedApplication(test, True) |
Armin Ronacher | 34f3042 | 2007-03-30 21:58:15 +0200 | [diff] [blame] | 113 | make_server("localhost", 7000, app).serve_forever() |