随机的Django模板不存在错误
我有一个正在运行的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 个回答
在我的情况下,问题出在uwsgi的配置文件(uwsgi.ini)上。虽然我还是不太明白具体原因,但希望这能帮助到其他人。
我添加了以下参数,问题就解决了:
disable-logging = True
max-worker-lifetime = 600
为了解决这个问题,我把所有涉及交换模板目录路径的逻辑都去掉了。我猜测在系统中更改Python路径的时候,其他同时进行的请求有时会看到错误的Python路径。
所以,我让移动网站和普通网站都能访问相同的模板目录路径,并确保没有同名的模板互相冲突。