Django 蛋模板加载器错误

1 投票
1 回答
1679 浏览
提问于 2025-04-16 12:51

我正在按照文档的说明安装 dajax/dajaxice,文档建议我在 settings.py 文件中取消注释第三个元组里的 eggs 模板加载器。

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

但是,这样做导致我的网站无法正常工作,出现了“IOError at /: sys.stdin access restricted by mod_wsgi”的错误信息,发生在我的开发机器上。当我查看错误发生的地方时,发现是与这个项目无关的 python eggs 出现了问题(我没有使用 virtualenv,可能这能帮到我),甚至与 django 也没有关系。而当我把那行代码重新注释掉时,错误就消失了。(当 eggs 加载器被注释掉时,所需的模板可以在 TEMPLATES_DIR 中轻松找到。)

错误追踪信息是:

Environment:

Request Method: GET
Request URL: http://[redacted URL]/
Django Version: 1.2.5
Python Version: 2.6.5
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'debug_toolbar',
 'registration',
 'dajaxice',
 'dajax',
 'south',
 '[redacted app name].study_registration',
 'profiles']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'audit_log.middleware.UserLoggingMiddleware')



Traceback:
File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/core/handlers/base.py" in get_response
  100.                     response = callback(request, *callback_args, **callback_kwargs)
File "/home/[redacted user name]/django/[redacted app name]/study_registration/views.py" in menu
  671.     template = loader.get_template('study_registration/menu.html')
File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/template/loader.py" in get_template
  157.     template, origin = find_template(template_name)
File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/template/loader.py" in find_template
  128.             loader = find_template_loader(loader_name)
File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/template/loader.py" in find_template_loader
  95.             mod = import_module(module)
File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/utils/importlib.py" in import_module
  35.     __import__(name)
File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/template/loaders/eggs.py" in <module>
  4.     from pkg_resources import resource_string
File "/usr/lib/python2.6/dist-packages/pkg_resources.py" in <module>
  2675. add_activation_listener(lambda dist: dist.activate())
File "/usr/lib/python2.6/dist-packages/pkg_resources.py" in subscribe
  662.             callback(dist)
File "/usr/lib/python2.6/dist-packages/pkg_resources.py" in <lambda>
  2675. add_activation_listener(lambda dist: dist.activate())
File "/usr/lib/python2.6/dist-packages/pkg_resources.py" in activate
  2180.             map(declare_namespace, self._get_metadata('namespace_packages.txt'))
File "/usr/lib/python2.6/dist-packages/pkg_resources.py" in declare_namespace
  1784.             _handle_ns(packageName, path_item)
File "/usr/lib/python2.6/dist-packages/pkg_resources.py" in _handle_ns
  1755.         loader.load_module(packageName); module.__path__ = path
File "/usr/lib/python2.6/pkgutil.py" in load_module
  238.             mod = imp.load_module(fullname, self.file, self.filename, self.etc)
File "/usr/local/lib/python2.6/dist-packages/glumpy-0.1.0-py2.6.egg/glumpy/__init__.py" in <module>
  15. from window import Window, active_window
File "/usr/local/lib/python2.6/dist-packages/glumpy-0.1.0-py2.6.egg/glumpy/window.py" in <module>
  16. import IPython
File "/usr/lib/pymodules/python2.6/IPython/__init__.py" in <module>
  58.     __import__(name,glob,loc,[])
File "/usr/lib/pymodules/python2.6/IPython/ipstruct.py" in <module>
  17. from IPython.genutils import list2dict2
File "/usr/lib/pymodules/python2.6/IPython/genutils.py" in <module>
  49. from IPython.Itpl import Itpl,itpl,printpl
File "/usr/lib/pymodules/python2.6/IPython/Itpl.py" in <module>
  99.     itpl_encoding = sys.stdin.encoding or 'ascii'

Exception Type: IOError at /
Exception Value: sys.stdin access restricted by mod_wsgi

我的问题是,有没有办法启用 eggs 模板加载器,但只检查 INSTALLED_APPS 中的 eggs?我不想切换到 virtualenv。此外,这些 eggs 出现在我的 python 路径中:

['/usr/local/lib/python2.6/dist-packages/Unidecode-0.04.1-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/pygooglechart-0.3.0-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/Graphy-1.0.0-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/virtualenv-1.5.1-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/glumpy-0.1.0-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/django_debug_toolbar-0.8.3-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/Pympler-0.1-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/django_profiles-0.2-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/django_form_utils-0.1.8-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/django_audit_log-0.2.1-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/South-0.7.3-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/django_autocomplete-0.3.dev-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/Babel-0.9.5-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/Genshi-0.6-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/Trac-0.12.1-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/collective.ordereddict-0.1-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/ordereddict-1.1-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/django_ajax_selects-1.1.4-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/openpyxl-1.2.3-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/django_dynamic_choices-0.1.3-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/python2.6/dist-packages/PIL', '/usr/lib/python2.6/dist-packages/gst-0.10', '/usr/lib/pymodules/python2.6', '/usr/lib/python2.6/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.6/gtk-2.0', '/usr/lib/python2.6/dist-packages/wx-2.8-gtk2-unicode', '/usr/local/lib/python2.6/dist-packages', '/home/[redacted user name]/django', '/usr/lib/python2.6/site-packages/django/', '/home/[redacted user name]/django/[redacted app name]/', '/usr/lib/pymodules/python2.6/IPython/Extensions']

1 个回答

2

升级到 mod_wsgi 3.3,不要使用 mod_wsgi 2.X。请阅读:

http://blog.dscpl.com.au/2009/04/wsgi-and-printing-to-standard-output.html

简单来说,某些 Python 代码试图使用 sys.stdin,这意味着这些代码在不同的 WSGI 实现上可能无法正常工作。旧版本的 mod_wsgi 会提醒开发者,让他们写出可以在不同环境中都能用的代码。但在 mod_wsgi 3.3 中,这种检查就不再进行了,允许开发者写出不那么通用的代码。

撰写回答