Mercurial > piecrust2
comparison piecrust/serving.py @ 128:28444014ce7d
Fix error reporting and counting of lines.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Fri, 14 Nov 2014 22:49:50 +0100 |
parents | de257cc40ce1 |
children | 7f81c84f7ddb |
comparison
equal
deleted
inserted
replaced
127:bc63dc20baa0 | 128:28444014ce7d |
---|---|
5 import os.path | 5 import os.path |
6 import hashlib | 6 import hashlib |
7 import logging | 7 import logging |
8 import io | 8 import io |
9 from werkzeug.exceptions import (NotFound, MethodNotAllowed, | 9 from werkzeug.exceptions import (NotFound, MethodNotAllowed, |
10 InternalServerError) | 10 InternalServerError, HTTPException) |
11 from werkzeug.serving import run_simple | 11 from werkzeug.serving import run_simple |
12 from werkzeug.wrappers import Request, Response | 12 from werkzeug.wrappers import Request, Response |
13 from werkzeug.wsgi import wrap_file | 13 from werkzeug.wsgi import wrap_file |
14 from jinja2 import FileSystemLoader, Environment | 14 from jinja2 import FileSystemLoader, Environment |
15 from piecrust.app import PieCrust | 15 from piecrust.app import PieCrust |
127 | 127 |
128 # Nope. Let's hope it's an actual page. | 128 # Nope. Let's hope it's an actual page. |
129 try: | 129 try: |
130 response = self._try_serve_page(app, environ, request) | 130 response = self._try_serve_page(app, environ, request) |
131 return response(environ, start_response) | 131 return response(environ, start_response) |
132 except HTTPException as ex: | |
133 raise | |
132 except (RouteNotFoundError, SourceNotFoundError) as ex: | 134 except (RouteNotFoundError, SourceNotFoundError) as ex: |
133 logger.exception(ex) | 135 logger.exception(ex) |
134 raise NotFound() | 136 raise NotFound() |
135 except Exception as ex: | 137 except Exception as ex: |
136 logger.exception(ex) | |
137 if app.debug: | 138 if app.debug: |
139 logger.exception(ex) | |
138 raise | 140 raise |
139 raise InternalServerError() | 141 msg = str(ex) |
142 logger.error(msg) | |
143 raise InternalServerError(msg) | |
140 | 144 |
141 def _try_serve_asset(self, app, environ, request): | 145 def _try_serve_asset(self, app, environ, request): |
142 logger.debug("Searching for asset with path: %s" % request.path) | 146 logger.debug("Searching for asset with path: %s" % request.path) |
143 rel_req_path = request.path.lstrip('/').replace('/', os.sep) | 147 rel_req_path = request.path.lstrip('/').replace('/', os.sep) |
144 entry = self._asset_record.findEntry(rel_req_path) | 148 entry = self._asset_record.previous.findEntry(rel_req_path) |
145 if entry is None: | 149 if entry is None: |
146 return None | 150 return None |
147 | 151 |
148 # Yep, we know about this URL because we processed an asset that | 152 # Yep, we know about this URL because we processed an asset that |
149 # maps to it... make sure it's up to date by re-processing it | 153 # maps to it... make sure it's up to date by re-processing it |
244 | 248 |
245 # Render the page. | 249 # Render the page. |
246 rendered_page = render_page(render_ctx) | 250 rendered_page = render_page(render_ctx) |
247 rp_content = rendered_page.content | 251 rp_content = rendered_page.content |
248 | 252 |
253 if taxonomy is not None: | |
254 paginator = rendered_page.data.get('pagination') | |
255 if (paginator and paginator.is_loaded and | |
256 len(paginator.items) == 0): | |
257 message = ("This URL matched a route for taxonomy '%s' but " | |
258 "no pages have been found to have it. This page " | |
259 "won't be generated by a bake." % taxonomy.name) | |
260 raise NotFound(message) | |
261 | |
249 if entry is None: | 262 if entry is None: |
250 entry = ServeRecordPageEntry(req_path, page_num) | 263 entry = ServeRecordPageEntry(req_path, page_num) |
251 self._page_record.addEntry(entry) | 264 self._page_record.addEntry(entry) |
252 entry.used_source_names = set(render_ctx.used_source_names) | 265 entry.used_source_names = set(render_ctx.used_source_names) |
253 | 266 |
306 return response | 319 return response |
307 | 320 |
308 def _handle_error(self, exception, environ, start_response): | 321 def _handle_error(self, exception, environ, start_response): |
309 path = 'error' | 322 path = 'error' |
310 if isinstance(exception, NotFound): | 323 if isinstance(exception, NotFound): |
311 path = '404' | 324 path += '404' |
325 description = str(exception) | |
326 if isinstance(exception, HTTPException): | |
327 description = exception.description | |
312 env = Environment(loader=ErrorMessageLoader()) | 328 env = Environment(loader=ErrorMessageLoader()) |
313 template = env.get_template(path) | 329 template = env.get_template(path) |
314 context = {'details': str(exception)} | 330 context = {'details': description} |
315 response = Response(template.render(context), mimetype='text/html') | 331 response = Response(template.render(context), mimetype='text/html') |
316 return response(environ, start_response) | 332 return response(environ, start_response) |
317 | 333 |
318 | 334 |
319 class WsgiServer(object): | 335 class WsgiServer(object): |