1
0
mirror of https://github.com/django/django.git synced 2025-07-04 17:59:13 +00:00

new-admin: Negligible syntax changes in django.views.debug in preparation for merge to trunk

git-svn-id: http://code.djangoproject.com/svn/django/branches/new-admin@1373 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2005-11-23 19:37:17 +00:00
parent c18d99735e
commit c8719b7765

View File

@ -1,24 +1,20 @@
import re
import os
import sys
import inspect
from django.conf import settings from django.conf import settings
from os.path import dirname, join as pathjoin
from django.core.template import Template, Context from django.core.template import Template, Context
from django.utils.httpwrappers import HttpResponseServerError, HttpResponseNotFound
from itertools import count, izip
from django.utils.html import escape from django.utils.html import escape
from django.utils.httpwrappers import HttpResponseServerError, HttpResponseNotFound
import inspect, os, re, sys
from itertools import count, izip
from os.path import dirname, join as pathjoin
HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD') HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD')
def linebreak_iter(template_source): def linebreak_iter(template_source):
import re newline_re = re.compile("^", re.M)
newline_re = re.compile("^", re.M) for match in newline_re.finditer(template_source):
for match in newline_re.finditer(template_source): yield match.start()
yield match.start() yield len(template_source) + 1
yield len(template_source) + 1
def get_template_exception_info(exc_type,exc_value,tb): def get_template_exception_info(exc_type, exc_value, tb):
origin, (start, end) = exc_value.source origin, (start, end) = exc_value.source
template_source = origin.reload() template_source = origin.reload()
context_lines = 10 context_lines = 10
@ -28,33 +24,31 @@ def get_template_exception_info(exc_type,exc_value,tb):
linebreaks = izip(count(0), linebreak_iter(template_source)) linebreaks = izip(count(0), linebreak_iter(template_source))
linebreaks.next() # skip the nothing before initial line start linebreaks.next() # skip the nothing before initial line start
for num, next in linebreaks: for num, next in linebreaks:
if start >= upto and end <= next : if start >= upto and end <= next:
line = num line = num
before = escape(template_source[upto:start]) before = escape(template_source[upto:start])
during = escape(template_source[start:end]) during = escape(template_source[start:end])
after = escape(template_source[end:next - 1]) after = escape(template_source[end:next - 1])
source_lines.append( (num, escape(template_source[upto:next - 1])) ) source_lines.append( (num, escape(template_source[upto:next - 1])) )
upto = next upto = next
total = len(source_lines) total = len(source_lines)
top = max(0, line - context_lines) top = max(0, line - context_lines)
bottom = min(total, line + 1 + context_lines) bottom = min(total, line + 1 + context_lines)
template_info = { template_info = {
'message' : exc_value.args[0], 'message': exc_value.args[0],
'source_lines' : source_lines[top:bottom], 'source_lines': source_lines[top:bottom],
'before' : before, 'before': before,
'during': during, 'during': during,
'after': after, 'after': after,
'top': top , 'top': top ,
'bottom': bottom , 'bottom': bottom ,
'total' : total, 'total': total,
'line' : line, 'line': line,
'name' : origin.name, 'name': origin.name,
} }
exc_info = hasattr(exc_value, 'exc_info') and exc_value.exc_info or (exc_type,exc_value,tb) exc_info = hasattr(exc_value, 'exc_info') and exc_value.exc_info or (exc_type, exc_value, tb)
return exc_info + (template_info,) return exc_info + (template_info,)
def technical_500_response(request, exc_type, exc_value, tb): def technical_500_response(request, exc_type, exc_value, tb):
@ -64,7 +58,7 @@ def technical_500_response(request, exc_type, exc_value, tb):
""" """
template_info = None template_info = None
if settings.TEMPLATE_DEBUG and hasattr(exc_value, 'source'): if settings.TEMPLATE_DEBUG and hasattr(exc_value, 'source'):
exc_type, exc_value, tb, template_info = get_template_exception_info(exc_type,exc_value,tb) exc_type, exc_value, tb, template_info = get_template_exception_info(exc_type, exc_value, tb)
frames = [] frames = []
while tb is not None: while tb is not None:
filename = tb.tb_frame.f_code.co_filename filename = tb.tb_frame.f_code.co_filename
@ -72,16 +66,16 @@ def technical_500_response(request, exc_type, exc_value, tb):
lineno = tb.tb_lineno - 1 lineno = tb.tb_lineno - 1
pre_context_lineno, pre_context, context_line, post_context = _get_lines_from_file(filename, lineno, 7) pre_context_lineno, pre_context, context_line, post_context = _get_lines_from_file(filename, lineno, 7)
frames.append({ frames.append({
'tb' : tb, 'tb': tb,
'filename' : filename, 'filename': filename,
'function' : function, 'function': function,
'lineno' : lineno, 'lineno': lineno,
'vars' : tb.tb_frame.f_locals.items(), 'vars': tb.tb_frame.f_locals.items(),
'id' : id(tb), 'id': id(tb),
'pre_context' : pre_context, 'pre_context': pre_context,
'context_line' : context_line, 'context_line': context_line,
'post_context' : post_context, 'post_context': post_context,
'pre_context_lineno' : pre_context_lineno, 'pre_context_lineno': pre_context_lineno,
}) })
tb = tb.tb_next tb = tb.tb_next
@ -97,13 +91,13 @@ def technical_500_response(request, exc_type, exc_value, tb):
t = Template(TECHNICAL_500_TEMPLATE) t = Template(TECHNICAL_500_TEMPLATE)
c = Context({ c = Context({
'exception_type' : exc_type.__name__, 'exception_type': exc_type.__name__,
'exception_value' : exc_value, 'exception_value': exc_value,
'frames' : frames, 'frames': frames,
'lastframe' : frames[-1], 'lastframe': frames[-1],
'request' : request, 'request': request,
'request_protocol' : os.environ.get("HTTPS") == "on" and "https" or "http", 'request_protocol': os.environ.get("HTTPS") == "on" and "https" or "http",
'settings' : settings_dict, 'settings': settings_dict,
'template_info': template_info, 'template_info': template_info,
}) })
return HttpResponseServerError(t.render(c), mimetype='text/html') return HttpResponseServerError(t.render(c), mimetype='text/html')
@ -120,12 +114,12 @@ def technical_404_response(request, exception):
t = Template(TECHNICAL_404_TEMPLATE) t = Template(TECHNICAL_404_TEMPLATE)
c = Context({ c = Context({
'root_urlconf' : settings.ROOT_URLCONF, 'root_urlconf': settings.ROOT_URLCONF,
'urlpatterns' : tried, 'urlpatterns': tried,
'reason' : str(exception), 'reason': str(exception),
'request' : request, 'request': request,
'request_protocol' : os.environ.get("HTTPS") == "on" and "https" or "http", 'request_protocol': os.environ.get("HTTPS") == "on" and "https" or "http",
'settings' : dict([(k, getattr(settings, k)) for k in dir(settings) if k.isupper()]), 'settings': dict([(k, getattr(settings, k)) for k in dir(settings) if k.isupper()]),
}) })
return HttpResponseNotFound(t.render(c), mimetype='text/html') return HttpResponseNotFound(t.render(c), mimetype='text/html')
@ -195,9 +189,9 @@ TECHNICAL_500_TEMPLATE = """
#summary table { border:none; background:transparent; } #summary table { border:none; background:transparent; }
#requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; } #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
#requestinfo h3 { margin-bottom:-1em; } #requestinfo h3 { margin-bottom:-1em; }
table.source td{ font-family: monospace; white-space: pre;} table.source td { font-family: monospace; white-space: pre; }
span.specific{background:#ffcab7;} span.specific { background:#ffcab7; }
.error { background:#ffc; } .error { background: #ffc; }
</style> </style>
<script type="text/javascript"> <script type="text/javascript">
//<!-- //<!--
@ -275,24 +269,24 @@ TECHNICAL_500_TEMPLATE = """
</tr> </tr>
</table> </table>
</div> </div>
{%if template_info %} {% if template_info %}
<div id="template"> <div id="template">
<h2>Template</h2> <h2>Template</h2>
In template {{template_info.name}}, error at line {{template_info.line}} In template {{ template_info.name }}, error at line {{ template_info.line }}
<div>{{template_info.message|escape}}</div> <div>{{ template_info.message|escape }}</div>
<table class="source{%if template_info.top%} cut-top{%endif%}{%ifnotequal template_info.bottom template_info.total%} cut-bottom{%endifnotequal%}"> <table class="source{% if template_info.top %} cut-top{% endif %}{% ifnotequal template_info.bottom template_info.total %} cut-bottom{% endifnotequal %}">
{% for source_line in template_info.source_lines %} {% for source_line in template_info.source_lines %}
{%ifequal source_line.0 template_info.line %} {% ifequal source_line.0 template_info.line %}
<tr class="error"><td>{{source_line.0}}</td> <tr class="error"><td>{{ source_line.0 }}</td>
<td> {{template_info.before}}<span class="specific">{{template_info.during}}</span>{{template_info.after}}</td></tr> <td>{{ template_info.before }}<span class="specific">{{ template_info.during }}</span>{{ template_info.after }}</td></tr>
{%else%} {% else %}
<tr><td>{{source_line.0}}</td> <tr><td>{{ source_line.0 }}</td>
<td> {{source_line.1}}</td></tr> <td> {{ source_line.1 }}</td></tr>
{%endifequal%} {% endifequal %}
{%endfor%} {% endfor %}
</table> </table>
</div> </div>
{%endif%} {% endif %}
<div id="traceback"> <div id="traceback">
<h2>Traceback <span>(innermost last)</span></h2> <h2>Traceback <span>(innermost last)</span></h2>
<ul class="traceback"> <ul class="traceback">