mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +00:00 
			
		
		
		
	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:
		| @@ -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): | ||||||
|   | |||||||
| @@ -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: | ||||||
|   | |||||||
| @@ -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): | ||||||
|     """ |     """ | ||||||
|   | |||||||
| @@ -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) | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								django/template/signals.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								django/template/signals.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | template_rendered=object() | ||||||
| @@ -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] | ||||||
|     }) |     }) | ||||||
|   | |||||||
| @@ -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('.'): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user