diff options
| author | Boulder Sprinters <boulder-sprinters@djangoproject.com> | 2007-04-23 16:16:27 +0000 |
|---|---|---|
| committer | Boulder Sprinters <boulder-sprinters@djangoproject.com> | 2007-04-23 16:16:27 +0000 |
| commit | 62ba18d7506693592e45fff47eb81be467818de5 (patch) | |
| tree | 5535d37eae24bb5fb46b4b1f79c3771c7b237893 /django/views/debug.py | |
| parent | 172d4ba33b2fdf014bc0c966c64de89e5e6de59f (diff) | |
boulder-oracle-sprint: Merged to [5061]
git-svn-id: http://code.djangoproject.com/svn/django/branches/boulder-oracle-sprint@5062 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/views/debug.py')
| -rw-r--r-- | django/views/debug.py | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/django/views/debug.py b/django/views/debug.py index b49a98a864..2530350e26 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -90,11 +90,18 @@ def technical_500_response(request, exc_type, exc_value, tb): exc_type, exc_value, tb, template_info = get_template_exception_info(exc_type, exc_value, tb) frames = [] while tb is not None: + # support for __traceback_hide__ which is used by a few libraries + # to hide internal frames. + if tb.tb_frame.f_locals.get('__traceback_hide__'): + tb = tb.tb_next + continue filename = tb.tb_frame.f_code.co_filename function = tb.tb_frame.f_code.co_name lineno = tb.tb_lineno - 1 - pre_context_lineno, pre_context, context_line, post_context = _get_lines_from_file(filename, lineno, 7) - if pre_context_lineno: + loader = tb.tb_frame.f_globals.get('__loader__') + module_name = tb.tb_frame.f_globals.get('__name__') + pre_context_lineno, pre_context, context_line, post_context = _get_lines_from_file(filename, lineno, 7, loader, module_name) + if pre_context_lineno is not None: frames.append({ 'tb': tb, 'filename': filename, @@ -161,23 +168,34 @@ def empty_urlconf(request): }) return HttpResponseNotFound(t.render(c), mimetype='text/html') -def _get_lines_from_file(filename, lineno, context_lines): +def _get_lines_from_file(filename, lineno, context_lines, loader=None, module_name=None): """ Returns context_lines before and after lineno from file. Returns (pre_context_lineno, pre_context, context_line, post_context). """ - try: - source = open(filename).readlines() - lower_bound = max(0, lineno - context_lines) - upper_bound = lineno + context_lines + source = None + if loader is not None: + source = loader.get_source(module_name).splitlines() + else: + try: + f = open(filename) + try: + source = f.readlines() + finally: + f.close() + except (OSError, IOError): + pass + if source is None: + return None, [], None, [] - pre_context = [line.strip('\n') for line in source[lower_bound:lineno]] - context_line = source[lineno].strip('\n') - post_context = [line.strip('\n') for line in source[lineno+1:upper_bound]] + lower_bound = max(0, lineno - context_lines) + upper_bound = lineno + context_lines - return lower_bound, pre_context, context_line, post_context - except (OSError, IOError): - return None, [], None, [] + pre_context = [line.strip('\n') for line in source[lower_bound:lineno]] + context_line = source[lineno].strip('\n') + post_context = [line.strip('\n') for line in source[lineno+1:upper_bound]] + + return lower_bound, pre_context, context_line, post_context # # Templates are embedded in the file so that we know the error handler will @@ -314,7 +332,7 @@ TECHNICAL_500_TEMPLATE = """ </tr> <tr> <th>Exception Location:</th> - <td>{{ lastframe.filename }} in {{ lastframe.function }}, line {{ lastframe.lineno }}</td> + <td>{{ lastframe.filename|escape }} in {{ lastframe.function|escape }}, line {{ lastframe.lineno }}</td> </tr> </table> </div> @@ -361,7 +379,7 @@ TECHNICAL_500_TEMPLATE = """ <ul class="traceback"> {% for frame in frames %} <li class="frame"> - <code>{{ frame.filename }}</code> in <code>{{ frame.function }}</code> + <code>{{ frame.filename|escape }}</code> in <code>{{ frame.function|escape }}</code> {% if frame.context_line %} <div class="context" id="c{{ frame.id }}"> |
