随机的Django模板不存在错误

1 投票
2 回答
2546 浏览
提问于 2025-04-16 14:01

我有一个正在运行的Django网站,使用的是Django 1.2.5和Python 2.7/mod_wsgi 3.3。大部分情况下,一切都运行得很好,但网站似乎会随机出现错误。所有的错误信息都是这样的形式:

TemplateDoesNotExist: 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

2 个回答

0

在我的情况下,问题出在uwsgi的配置文件(uwsgi.ini)上。虽然我还是不太明白具体原因,但希望这能帮助到其他人。

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

disable-logging = True

max-worker-lifetime = 600
0

为了解决这个问题,我把所有涉及交换模板目录路径的逻辑都去掉了。我猜测在系统中更改Python路径的时候,其他同时进行的请求有时会看到错误的Python路径。

所以,我让移动网站和普通网站都能访问相同的模板目录路径,并确保没有同名的模板互相冲突。

撰写回答