【问题标题】:Random Django TemplateDoesNotExist Errors随机 Django TemplateDoesNotExist 错误
【发布时间】:2011-07-18 19:27:03
【问题描述】:

我有一个使用 Python 2.7/mod_wsgi 3.3 运行 Django 1.2.5 的 Django 站点。在大多数情况下,一切都很好,但似乎该网站完全随机地抛出错误。它们都以以下形式结尾:

模板不存在:xxx

这些模板确实存在,当我输入导致异常的 URL 时,该 URL 似乎总是有效。但是,大约每 30 次页面浏览,就会引发一次此错误。

我发现这篇关于类似问题的帖子:http://leequerv.blogspot.com/2009/11/re-settingspy-seems-to-be-cached-or_24.html 但我只运行一个 Django 应用程序,所以它似乎不能直接应用。

我正在使用一些子域中间件,它根据我网站的子域交换模板目录(即,如果没有子域,它使用常规模板目录,如果它有一个 m.xxx 子域,则使用我的移动模板目录)。除了这些零星的生产服务器错误之外,所有这些在我的开发服务器和生产服务器上都非常有效。当很多人使用该网站时,这是否可能会造成竞争条件?

你有什么想法可能导致它或我应该从哪里开始寻找?

编辑:

这里是切换模板目录的中间件代码部分:

    subdomain = getattr(request, 'subdomain', False)

    if subdomain is not False:
        try:
            request.urlconf = settings.SUBDOMAIN_URLCONFS[subdomain]
        except KeyError:
            pass
        try:
            settings.TEMPLATE_DIRS = settings.SUBDOMAIN_TEMPLATE_DIRS[subdomain]
        except KeyError:
            pass

这是我的设置文件中包含模板目录信息的部分:

SUBDOMAIN_URLCONFS = { None: 'my_site.urls', 'm': 'mobile.urls' }

JQM_TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, "templates/mobile/"),
)

SUBDOMAIN_TEMPLATE_DIRS = {
    None: TEMPLATE_DIRS,
    'm': JQM_TEMPLATE_DIRS
}

编辑#2

这是我的回溯:

Traceback (most recent call last):

 File "/home/my_username/webapps/my_site/lib/python2.7/django/core/handlers/base.py", line 100, in get_response
   response = callback(request, *callback_args, **callback_kwargs)

 File "/home/my_username/python-environments/my_site/lib/python2.7/site-packages/endless_pagination/decorators.py", line 55, in decorated
   return view(request, *args, **kwargs)

 File "/home/my_username/webapps/my_site/my_site/local_apps/team/views.py", line 68, in team_detail
   return render_to_response(template, context, context_instance=RequestContext(request))

 File "/home/my_username/webapps/my_site/lib/python2.7/django/shortcuts/__init__.py", line 20, in render_to_response
   return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

 File "/home/my_username/webapps/my_site/lib/python2.7/django/template/loader.py", line 181, in render_to_string
   t = get_template(template_name)

 File "/home/my_username/webapps/my_site/lib/python2.7/django/template/loader.py", line 157, in get_template
   template, origin = find_template(template_name)

 File "/home/my_username/webapps/my_site/lib/python2.7/django/template/loader.py", line 138, in find_template
   raise TemplateDoesNotExist(name)

TemplateDoesNotExist: team_detail.html

【问题讨论】:

  • 当此异常引发时,您是否会收到错误页面,或者页面仍在呈现?如果它是第二个选择,那么也许我只是在这里猜测它是 django 缓存(如果你当然使用其中之一)当它在缓存中找不到模板时可能会抛出这个错误(因为缓存超时或什么所以永远),然后从文件系统中获取模板来渲染它,所以它可以工作,但由于缓存未命中而显示错误!?
  • 能否提供更详细的回溯?
  • 当引发异常时,应用程序崩溃,并且我的服务器显示默认的 500 内部服务器错误页面。它甚至没有给出正常的 django 500.html 页面,因为它找不到那个模板目录。
  • 至于缓存...我目前没有使用任何缓存,所以不是因为缓存未命中。
  • 是否可以看到模板目录被切换的中间件的代码?

标签: python django mod-wsgi race-condition django-endless-pagination


【解决方案1】:

为了解决这个问题,我删除了所有涉及交换模板目录路径的逻辑。我的猜测是,当系统的 python 路径发生变化时,其他并发请求有时会看到错误的 python 路径集。

因此,我只是让移动网站和常规网站访问模板目录的相同路径,并确保没有冲突的同名模板。

【讨论】:

    【解决方案2】:

    在我的情况下,问题是 uwsgi 配置 (uwsgi.ini)。仍然不知道为什么,但希望能帮助其他人。

    添加以下参数解决了我的问题:

    disable-logging = True
    
    max-worker-lifetime = 600
    

    【讨论】:

      猜你喜欢
      • 2014-02-19
      • 2013-06-20
      • 2015-09-02
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 2021-12-28
      • 2014-05-27
      • 1970-01-01
      相关资源
      最近更新 更多