5

मेरी समस्या मूल रूप से एक अधिकतम रन-ऑफ-द-मिल ListView में "अधिकतम रिकर्सन गहराई से अधिक" त्रुटि के रूप में प्रकट हुई। चारों ओर खोदने के बाद, मुझे संबंधित पृष्ठ लोड करने के लिए किए गए हर प्रयास के लिए dbtemplates में उत्पन्न कैश हिट का एक टन मिला। इसने मुझे अपना खुद का टेम्पलेट लोडर लिखने के लिए प्रेरित किया, जिस बिंदु पर यह स्पष्ट हो गया कि Django load_template_source को पृष्ठ लोड होने पर हर बार नौ बार नौ बार कॉल कर रहा है।Django (1.5.1) लोडर.load_template_source() 69 बार क्यों कॉल करेगा?

Django क्यों load_template_source कई बार कॉल करेगा?

visitor_index (db टेम्पलेट)

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <title>{{ site.name }}</title> 
    </head> 
    <body id="home"> 
    <pre> 
     Starting 
     {% for video in videos %} 
      {{ video.headline }} 
     {% endfor %} 
    </pre> 
    </body> 
</html> 

urls.py

from django.conf.urls import include, url 
from django.conf.urls.defaults import patterns 
from videos.views import * 

urlpatterns = patterns('', 
    url(r'^$', VisitorIndex.as_view(), name='index'), 
) 

views.py

import logging 
from django.views.generic import ListView 
from videos.models import Video 

logger = logging.getLogger(__name__) 

class VisitorIndex(ListView): 
    context_object_name = 'videos' 
    template_name = 'visitor_index' 

    def get_queryset(self): 
     logger.debug('VisitorIndex.get_queryset()') 
     return Video.on_site.filter(privacy_mode='PUB') 

loader.py

import logging 
from django.template import TemplateDoesNotExist 
from django.template.loader import BaseLoader 
from dbtemplates.models import Template 

logger = logging.getLogger(__name__) 

class Loader(BaseLoader): 
    is_usable = True 

    def load_template_source(self, template_name, template_dirs=None): 
     try: 
      logger.debug('Loader.load_template_source(%s, %s)' % (template_name, template_dirs)) 
      template = Template.on_site.get(slug__exact=template_name).template_body 
      logger.debug('Loaded template.') 
      return template, template_name 
     except Template.DoesNotExist: 
      logger.debug('Template.DoesNotExist caught.') 
      raise TemplateDoesNotExist, template_name 

models.py

import logging 
from django.contrib.sites.models import Site 
from django.contrib.sites.managers import CurrentSiteManager 
from django.db import models 

logger = logging.getLogger('__name__') 

class Template(models.Model): 
    slug = models.CharField(max_length=80) 
    template_body = models.TextField() 
    site = models.ForeignKey(Site) 

    objects = models.Manager() 
    on_site = CurrentSiteManager('site') 

    def __unicode__(self): 
     return self.slug 

settings.py

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
    'dbtemplates.loader.Loader', 
) 

app.log (ट्रेस के साथ अद्यतन)

2013-05-09 19:15:43,634 [DEBUG] dynamicsites.middleware: ENV_HOSTNAMES lookup subdomain=None domain=mydomain.com domain_unsplit=mydomain.com 
2013-05-09 19:15:43,634 [DEBUG] dynamicsites.middleware: Checking database for domain=mydomain.com 
2013-05-09 19:15:43,679 [DEBUG] dynamicsites.middleware: Using site id=2 domain=mydomain.com 
2013-05-09 19:15:43,714 [DEBUG] videos.views: VisitorIndex.get_queryset() 
2013-05-09 19:15:43,716 [DEBUG] django.template.response: SimpleTemplateResponse.rendered_content() 
2013-05-09 19:15:43,717 [DEBUG] django.template.response: Start self.resolve_template() 
2013-05-09 19:15:43,717 [DEBUG] django.template.response: SimpleTemplateResponse.resolve_template(). Found list or tuple. 
2013-05-09 19:15:43,717 [DEBUG] django.template.response: Calling loader.select_template(template=['visitor_index', u'videos/video_list.html']) 
2013-05-09 19:15:43,720 [DEBUG] dbtemplates.loader: Loader.load_template_source(visitor_index, None) 
2013-05-09 19:15:43,722 [DEBUG] dbtemplates.loader: File "/usr/lib/python2.7/threading.py", line 525, in __bootstrap 
    self.__bootstrap_inner() 
    File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 505, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 150, in __init__ 
    super(WSGIRequestHandler, self).__init__(*args, **kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__ 
    self.handle() 
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 124, in handle 
    handler.run(self.server.get_app()) 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run 
    self.result = application(self.environ, self.start_response) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 72, in __call__ 
    return self.application(environ, start_response) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 255, in __call__ 
    response = self.get_response(request) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 140, in get_response 
    response = response.render() 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/response.py", line 121, in render 
    self.content = self.rendered_content 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/response.py", line 91, in rendered_content 
    template = self.resolve_template(self.template_name) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/response.py", line 60, in resolve_template 
    t = loader.select_template(template) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/loader.py", line 188, in select_template 
    return get_template(template_name) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/loader.py", line 146, in get_template 
    template, origin = find_template(template_name) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/loader.py", line 135, in find_template 
    source, display_name = loader(name, dirs) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/loader.py", line 43, in __call__ 
    return self.load_template(template_name, template_dirs) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/loader.py", line 46, in load_template 
    source, display_name = self.load_template_source(template_name, template_dirs) 
    File "/home/wesley/howl/dbtemplates/loader.py", line 19, in load_template_source 
    logger.debug(''.join(traceback.format_stack())) 

2013-05-09 19:15:43,885 [DEBUG] dbtemplates.loader: Loaded template. 
2013-05-09 19:15:43,886 [DEBUG] django.template.response: Done. 
2013-05-09 19:15:43,887 [DEBUG] django.template.response: Done. <django.template.base.Template object at 0x7fbdf8215050> 
2013-05-09 19:15:43,887 [DEBUG] django.template.response: Start self.resolve_context() 
2013-05-09 19:15:43,920 [DEBUG] django.template.response: Start template.render(context) 
2013-05-09 19:15:43,920 [DEBUG] django.template.base: Template.render(context) 
2013-05-09 19:15:43,920 [DEBUG] django.template.base:  context.render_context.push() 
2013-05-09 19:15:43,920 [DEBUG] django.template.base:  Done. 
2013-05-09 19:15:43,921 [DEBUG] django.template.base: Try self._render(context) 
2013-05-09 19:15:43,932 [DEBUG] dbtemplates.loader: Loader.load_template_source(visitor_index, None) 
2013-05-09 19:15:43,933 [DEBUG] dbtemplates.loader: File "/usr/lib/python2.7/threading.py", line 525, in __bootstrap 
    self.__bootstrap_inner() 
    File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.7/threading.py", line 505, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread 
    self.finish_request(request, client_address) 
    File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 150, in __init__ 
    super(WSGIRequestHandler, self).__init__(*args, **kwargs) 
    File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__ 
    self.handle() 
    File "/usr/lib/python2.7/wsgiref/simple_server.py", line 124, in handle 
    handler.run(self.server.get_app()) 
    File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run 
    self.result = application(self.environ, self.start_response) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 72, in __call__ 
    return self.application(environ, start_response) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 255, in __call__ 
    response = self.get_response(request) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 140, in get_response 
    response = response.render() 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/response.py", line 121, in render 
    self.content = self.rendered_content 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/response.py", line 97, in rendered_content 
    content = template.render(context) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/base.py", line 146, in render 
    return self._render(context) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/test/utils.py", line 65, in instrumented_test_render 
    return self.nodelist.render(context) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/base.py", line 837, in render 
    bit = self.render_node(node, context) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/debug.py", line 74, in render_node 
    return node.render(context) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/defaulttags.py", line 148, in render 
    len_values = len(values) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/db/models/query.py", line 90, in __len__ 
    self._result_cache = list(self.iterator()) 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/db/models/query.py", line 301, in iterator 
    for row in compiler.results_iter(): 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 775, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql 
    cursor.execute(sql, params) 
    File "/home/wesley/howl/debug_toolbar/utils/tracking/db.py", line 134, in execute 
    template_info = get_template_info(node.source) 
    File "/home/wesley/howl/debug_toolbar/utils/__init__.py", line 80, in get_template_info 
    template_source = origin.reload() 
    File "/home/wesley/environments/howl/local/lib/python2.7/site-packages/django/template/loader.py", line 80, in reload 
    return self.loader(self.loadname, self.dirs)[0] 
    File "/home/wesley/howl/dbtemplates/loader.py", line 19, in load_template_source 
    logger.debug(''.join(traceback.format_stack())) 

[...] 
+0

क्या आप अपनी 'TEMPLATE_LOADERS' सेटिंग दिखा सकते हैं? ऐसा लगता है कि यह एक विन्यास मुद्दा है। – alecxe

+0

निश्चित रूप से, मैंने 'TEMPLATE_LOADERS' को शामिल करने के लिए प्रश्न अपडेट कर दिया है। – Wes

उत्तर

4

मैं अपनी परियोजना reproduced किसी भी समस्या बिना।

लोडर को बिना किसी रिकर्सन के केवल एक बार बुलाया जाता है। मैंने कुछ सरल जरूरी फाइलों को भी जोड़ा: वीडियो/models.py और वीडियो/admin.py, dbtemplates/admin.py दो रिकॉर्ड जोड़ने के लिए वीडियो और एक रिकॉर्ड टेम्पलेट जो वीडियो पर लूप करता है: {% for video in videos %}...{% endfor %}

मैं अभी भी कर सकता हूं विश्वास नहीं है कि Loader.load_template_source() में एक रिकर्सन संभव है। अधिक जानकारी जरूरी है।

... 
logger.debug('Loader.load_template_source......') 
import traceback         # added 
logger.debug(''.join(traceback.format_stack())) 
... 

(मुझे डर लग रहा है कि एक पाश या एक प्रत्यावर्तन अन्य कोड में जन्म लिया है कि कई सूत्र है कि सभी से पहले प्रतीक्षा पैदा की: यह करने के लिए इन दो पंक्तियों को जोड़कर अपने लोडर के हर कॉल से एक ट्रैस बैक प्राप्त करने की कोशिश डेटाबेस कार्रवाई जब तक वर्तमान में चल रहे आपरेशन समाप्त हो जाएगा)


संपादित:। समस्याDjango-डिबग-उपकरण पट्टी के कारण होता है।

  • डेटाबेस कर्सर debug_toolbar निगरानी कोड द्वारा लपेटा गया है।
  • यह render द्वारा उपयोग किए गए टेम्पलेट के template_info के लिए ढेर में आत्मनिरीक्षण करने का प्रयास करता है।
  • Template_info टेम्पलेट रीलोडिंग का उपयोग करता है।
  • फिर से डेटाबेस तक पहुंच की आवश्यकता है।

आप डिबग डेटाबेस के लिए या टेम्पलेट्स से संबंधित उपकरण पट्टी (नहीं परीक्षण किया है कि यह मदद करता है) के कुछ भागों अक्षम करते हैं या पूरी तरह से निष्क्रिय कर सकते हैं। डीजेंगो द्वारा डाटाबेस ऑपरेशंस की बहुत अच्छी निगरानी की जाती है और डीबग टूलबार द्वारा किया गया यह अब भी कम महत्वपूर्ण है।

+0

इस, हाइनेसर को फिर से बनाने की कोशिश करने के लिए समय निकालने के लिए धन्यवाद। मैंने ट्रेसबैक प्राप्त किया जैसा आपने अनुरोध किया था और परिणाम के साथ मेरे प्रश्न के app.log भाग को अपडेट किया था। – Wes

+0

यह चाल है! मेरे प्रश्न को देखने के लिए बहुत बहुत धन्यवाद। यह एक बड़ी मदद है। संयोग से, मैंने ऐप और मिडलवेयर को अनइंस्टॉल करने से पहले SQL और टेम्पलेट पैनलों को व्यक्तिगत रूप से अक्षम करने का प्रयास किया, लेकिन बिना प्रभाव के। – Wes

+0

धन्यवाद hynekcer! मुझे एक ही समस्या थी और इससे पता लगाने में उम्र लग गई होगी। मेरे मामले में, django-debug-toolbar से 'debug_toolbar.panels.sql.SQLDebugPanel' पैनल को हटाकर समस्या को हल किया गया। –

संबंधित मुद्दे