TemplateSyntaxError: Caught ImportError while rend

2019-06-08 12:08发布

问题:

I'm having trouble to get this django application running on my CentOS 6 / Apache/2.2.15. When I run the app I get this error:

 Traceback (most recent call last):
   File "/usr/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 272, in __call__
     response = self.get_response(request)
   File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 169, in get_response
     response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
   File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 203, in handle_uncaught_exception
     return debug.technical_500_response(request, *exc_info)
   File "/usr/local/lib/python2.7/site-packages/django/views/debug.py", line 59, in technical_500_response
     html = reporter.get_traceback_html()
   File "/usr/local/lib/python2.7/site-packages/django/views/debug.py", line 151, in get_traceback_html
     return t.render(c)
   File "/usr/local/lib/python2.7/site-packages/django/template/base.py", line 123, in render
     return self._render(context)
   File "/usr/local/lib/python2.7/site-packages/django/template/base.py", line 117, in _render
     return self.nodelist.render(context)
   File "/usr/local/lib/python2.7/site-packages/django/template/base.py", line 744, in render
     bits.append(self.render_node(node, context))
   File "/usr/local/lib/python2.7/site-packages/django/template/debug.py", line 73, in render_node
     result = node.render(context)
   File "/usr/local/lib/python2.7/site-packages/django/template/debug.py", line 90, in render
     output = self.filter_expression.resolve(context)
   File "/usr/local/lib/python2.7/site-packages/django/template/base.py", line 536, in resolve
     new_obj = func(obj, *arg_vals)
   File "/usr/local/lib/python2.7/site-packages/django/template/defaultfilters.py", line 695, in date
     return format(value, arg)
   File "/usr/local/lib/python2.7/site-packages/django/utils/dateformat.py", line 285, in format
     return df.format(format_string)
   File "/usr/local/lib/python2.7/site-packages/django/utils/dateformat.py", line 30, in format
     pieces.append(force_unicode(getattr(self, piece)()))
   File "/usr/local/lib/python2.7/site-packages/django/utils/dateformat.py", line 191, in r
     return self.format('D, j M Y H:i:s O')
   File "/usr/local/lib/python2.7/site-packages/django/utils/dateformat.py", line 30, in format
     pieces.append(force_unicode(getattr(self, piece)()))
   File "/usr/local/lib/python2.7/site-packages/django/utils/encoding.py", line 71, in force_unicode
     s = unicode(s)
   File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 206, in __unicode_cast
     return self.__func(*self.__args, **self.__kw)
   File "/usr/local/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 81, in ugettext
     return _trans.ugettext(message)
   File "/usr/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 286, in ugettext
     return do_translate(message, 'ugettext')
   File "/usr/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 276, in do_translate
     _default = translation(settings.LANGUAGE_CODE)
   File "/usr/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 185, in translation
     default_translation = _fetch(settings.LANGUAGE_CODE)
   File "/usr/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 162, in _fetch
     app = import_module(appname)
   File "/usr/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
     __import__(name)
   File "/usr/local/lib/python2.7/site-packages/django/contrib/admin/__init__.py", line 3, in <module>
     from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
   File "/usr/local/lib/python2.7/site-packages/django/contrib/admin/helpers.py", line 3, in <module>
     from django.contrib.admin.util import (flatten_fieldsets, lookup_field,
   File "/usr/local/lib/python2.7/site-packages/django/contrib/admin/util.py", line 1, in <module>
     from django.db import models
   File "/usr/local/lib/python2.7/site-packages/django/db/__init__.py", line 78, in <module>
     connection = connections[DEFAULT_DB_ALIAS]
   File "/usr/local/lib/python2.7/site-packages/django/db/utils.py", line 93, in __getitem__
     backend = load_backend(db['ENGINE'])
   File "/usr/local/lib/python2.7/site-packages/django/db/utils.py", line 33, in load_backend
     return import_module('.base', backend_name)
   File "/usr/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
     __import__(name)
   File "/usr/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 9, in <module>
     from django.db import utils
 TemplateSyntaxError: Caught ImportError while rendering: cannot import name utils

Searching for this error I've found a few solutions, tried all but none worked:

  1. Make WSGI run in daemon mode.
  2. Check if Django installation path is in Python PAth.
  3. I thought it could be beacuse of another application running on the same Apache VirtualHost, so I 've put in another VH (another port) but didnt worked.
  4. I have 2 db connections: Oracle and PostgreSQL on this app, Oracle is fine, perhaps the problem is postgresql_psycopg2. I have installed thorugh yum.

Here's my files:

vhost.conf:

    NameVirtualHost 10.7.0.17:80
    NameVirtualHost 10.7.0.17:8080

    <VirtualHost 10.7.0.17:80>
        ServerAdmin webmaster@www.domain.com
        ServerName www.domain.com
        ServerAlias www.domain.com
        DocumentRoot /var/www/www.domain.com/html/
        ErrorLog /var/www/www.domain.com/logs/error.log
        CustomLog /var/www/www.domain.com/logs/access.log combined

        WSGIDaemonProcess www.domain.com processes=2 threads=15 display-name=%{GROUP}
        WSGIProcessGroup www.domain.com


        Alias /vlv/media/ /var/www/www.domain.com/django/vlv_vistoria/media/

        WSGIScriptAlias /vlv /var/www/www.domain.com/django/vlv_vistoria/django.wsgi

        <Directory /var/www/www.domain.com/django/vlv_vistoria>
            Order allow,deny
            Allow from all
            Options Indexes FollowSymLinks
        </Directory>


        <Directory /var/www/www.domain.com/django/vlv_vistoria/media>
            Order allow,deny
            Allow from all
            Options Indexes FollowSymLinks
        </Directory>

    </VirtualHost>



    <VirtualHost 10.7.0.17:8080>
        ServerAdmin webmaster@www.domain.com
        ServerName www.domain.com
        ServerAlias www.domain.com
        DocumentRoot /var/www/www.domain.com/html/
        ErrorLog /var/www/www.domain.com/logs/sistema_error.log
        CustomLog /var/www/www.domain.com/logs/sistema_access.log combined

        WSGIDaemonProcess sistema.www.domain.com processes=2 threads=15 display-name=%{GROUP}
        WSGIProcessGroup sistema.www.domain.com

        Alias /sistema/media/ /var/www/www.domain.com/django/sistema/media/

        WSGIScriptAlias /sistema /var/www/www.domain.com/django/sistema/django.wsgi

        <Directory /var/www/www.domain.com/django/sistema>
            Order allow,deny
            Allow from all
            Options Indexes FollowSymLinks
        </Directory>


        <Directory /var/www/www.domain.com/django/sistema/media>
            Order allow,deny
            Allow from all
            Options Indexes FollowSymLinks
        </Directory>

    </VirtualHost>

django.wsgi

    import os, sys

    sys.path.append('/var/www/www.domain.com/django')
    sys.path.append('/var/www/www.domain.com/django/sistema')

    sys.path.append('/usr/local/lib/python2.7/site-packages/django')


    root = os.path.join(os.path.dirname(__file__), '..')
    sys.path.insert(0, root)

    os.path.dirname(__file__)
    sys.path.insert(0, root)

    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

    os.environ["ORACLE_HOME"] = "/ora00/app/oracle/product/client"

    import django.core.handlers.wsgi
    application = django.core.handlers.wsgi.WSGIHandler()

Thanks in advance for any help.

回答1:

One of the causes for this in the past has been module import path issues.

Specifically, using a mod_wsgi installation compiled against one version of Python, and then using WSGIPythonPath or other means of setting the Python path to refer to a Python virtual environment constructed using a different Python version.

So, validate what version of Python mod_wsgi was compiled and installed for. If that is not Python 2.7, but an older Python version, you can get this specific problem.

For how to check what mod_wsgi was compiled for use:

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Shared_Library

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Installation_In_Use

It may also be worthwhile checking patch level revision differences of Python as well when looking at what mod_wsgi was compiled for. I do recollect that there was an issue a one point like this between Python 2.7.1 and 2.7.2 on there about.

That your Python site-packages is under /usr/local then quite possible that mod_wsgi using a different version under /usr.



回答2:

In case someone stumbles over this while searching for this issue on Pyramid and sqlalchemy:

In conjunction with Pyramid, I had the same error ("ImportError: cannot import name util"). After hours of trial and error the only reason turned out that in production.ini I had set:

[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 80

I was also using Apache2 on port 80, seemed odd that this should be the same. After changing the port to e.g. 6543, the error disappeared and the WSGI server worked. None of the apache2-settings (WSGIPythonHome,WSGIPythonPath) where necessary.

Apparently unrelated and I don't know why the port-conflict caused this error, but it might help someone else with this issue.