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):