Refs #2333 - Added a signal that is emitted whenever a template is rendered, and added a 'name' field to Template to allow easy identification of templates.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@3659 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2006-08-27 12:35:07 +00:00
parent 7dce86ce02
commit 89fa97b837
7 changed files with 17 additions and 10 deletions

View File

@ -60,6 +60,8 @@ from django.conf import settings
from django.template.context import Context, RequestContext, ContextPopException from django.template.context import Context, RequestContext, ContextPopException
from django.utils.functional import curry from django.utils.functional import curry
from django.utils.text import smart_split from django.utils.text import smart_split
from django.dispatch import dispatcher
from django.template import signals
__all__ = ('Template', 'Context', 'RequestContext', 'compile_string') __all__ = ('Template', 'Context', 'RequestContext', 'compile_string')
@ -137,13 +139,14 @@ class StringOrigin(Origin):
return self.source return self.source
class Template(object): class Template(object):
def __init__(self, template_string, origin=None): def __init__(self, template_string, origin=None, name='<Unknown Template>'):
"Compilation stage" "Compilation stage"
if settings.TEMPLATE_DEBUG and origin == None: if settings.TEMPLATE_DEBUG and origin == None:
origin = StringOrigin(template_string) origin = StringOrigin(template_string)
# Could do some crazy stack-frame stuff to record where this string # Could do some crazy stack-frame stuff to record where this string
# came from... # came from...
self.nodelist = compile_string(template_string, origin) self.nodelist = compile_string(template_string, origin)
self.name = name
def __iter__(self): def __iter__(self):
for node in self.nodelist: for node in self.nodelist:
@ -152,6 +155,7 @@ class Template(object):
def render(self, context): def render(self, context):
"Display stage -- can be called many times" "Display stage -- can be called many times"
dispatcher.send(signal=signals.template_rendered, sender=self, template=self, context=context)
return self.nodelist.render(context) return self.nodelist.render(context)
def compile_string(template_string, origin): def compile_string(template_string, origin):

View File

@ -251,7 +251,7 @@ class SsiNode(Node):
output = '' output = ''
if self.parsed: if self.parsed:
try: try:
t = Template(output) t = Template(output, name=self.filepath)
return t.render(context) return t.render(context)
except TemplateSyntaxError, e: except TemplateSyntaxError, e:
if settings.DEBUG: if settings.DEBUG:

View File

@ -76,14 +76,16 @@ def get_template(template_name):
Returns a compiled Template object for the given template name, Returns a compiled Template object for the given template name,
handling template inheritance recursively. handling template inheritance recursively.
""" """
return get_template_from_string(*find_template_source(template_name)) source, origin = find_template_source(template_name)
template = get_template_from_string(source, origin, template_name)
return template
def get_template_from_string(source, origin=None): def get_template_from_string(source, origin=None, name=None):
""" """
Returns a compiled Template object for the given template code, Returns a compiled Template object for the given template code,
handling template inheritance recursively. handling template inheritance recursively.
""" """
return Template(source, origin) return Template(source, origin, name)
def render_to_string(template_name, dictionary=None, context_instance=None): def render_to_string(template_name, dictionary=None, context_instance=None):
""" """

View File

@ -57,7 +57,7 @@ class ExtendsNode(Node):
except TemplateDoesNotExist: except TemplateDoesNotExist:
raise TemplateSyntaxError, "Template %r cannot be extended, because it doesn't exist" % parent raise TemplateSyntaxError, "Template %r cannot be extended, because it doesn't exist" % parent
else: else:
return get_template_from_string(source, origin) return get_template_from_string(source, origin, parent)
def render(self, context): def render(self, context):
compiled_parent = self.get_parent(context) compiled_parent = self.get_parent(context)

View File

@ -0,0 +1 @@
template_rendered=object()

View File

@ -115,7 +115,7 @@ def technical_500_response(request, exc_type, exc_value, tb):
'function': '?', 'function': '?',
'lineno': '?', 'lineno': '?',
}] }]
t = Template(TECHNICAL_500_TEMPLATE) t = Template(TECHNICAL_500_TEMPLATE, name='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,
@ -141,7 +141,7 @@ def technical_404_response(request, exception):
# tried exists but is an empty list. The URLconf must've been empty. # tried exists but is an empty list. The URLconf must've been empty.
return empty_urlconf(request) return empty_urlconf(request)
t = Template(TECHNICAL_404_TEMPLATE) t = Template(TECHNICAL_404_TEMPLATE, name='Technical 404 Template')
c = Context({ c = Context({
'root_urlconf': settings.ROOT_URLCONF, 'root_urlconf': settings.ROOT_URLCONF,
'urlpatterns': tried, 'urlpatterns': tried,
@ -154,7 +154,7 @@ def technical_404_response(request, exception):
def empty_urlconf(request): def empty_urlconf(request):
"Create an empty URLconf 404 error response." "Create an empty URLconf 404 error response."
t = Template(EMPTY_URLCONF_TEMPLATE) t = Template(EMPTY_URLCONF_TEMPLATE, name='Empty URLConf Template')
c = Context({ c = Context({
'project_name': settings.SETTINGS_MODULE.split('.')[0] 'project_name': settings.SETTINGS_MODULE.split('.')[0]
}) })

View File

@ -81,7 +81,7 @@ def directory_index(path, fullpath):
try: try:
t = loader.get_template('static/directory_index') t = loader.get_template('static/directory_index')
except TemplateDoesNotExist: except TemplateDoesNotExist:
t = Template(DEFAULT_DIRECTORY_INDEX_TEMPLATE) t = Template(DEFAULT_DIRECTORY_INDEX_TEMPLATE, name='Default Directory Index Template')
files = [] files = []
for f in os.listdir(fullpath): for f in os.listdir(fullpath):
if not f.startswith('.'): if not f.startswith('.'):