使用mod_wsgi,Django和MongoEngine时出错

问题描述:

我已经用MongoEngine建立了一个Django站点,我试图用Apache和mod_wsgi用virtualenv来运行它。使用mod_wsgi,Django和MongoEngine时出错

它运行在发展不错,但Apache下(在Ubuntu 14.04.2)我得到的Apache日志以下错误:

mod_wsgi (pid=16130): Exception occurred processing WSGI script '/data/.../.../wsgi.py'. 
Traceback (most recent call last): 
    File "/data/.../.../wsgi.py", line 22, in application 
    return get_wsgi_application()(environ, start_response) 
    File "/data/venv/lib/python3.4/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application 
    django.setup() 
    File "/data/venv/lib/python3.4/site-packages/django/__init__.py", line 17, in setup 
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) 
    File "/data/venv/lib/python3.4/site-packages/django/conf/__init__.py", line 48, in __getattr__ 
    self._setup(name) 
    File "/data/venv/lib/python3.4/site-packages/django/conf/__init__.py", line 44, in _setup 
    self._wrapped = Settings(settings_module) 
    File "/data/venv/lib/python3.4/site-packages/django/conf/__init__.py", line 92, in __init__ 
    mod = importlib.import_module(self.SETTINGS_MODULE) 
    File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
    __import__(name) 
    File "/data/.../.../settings.py", line 15, in <module> 
    import mongoengine 
    File "/data/venv/lib/python3.4/site-packages/mongoengine/__init__.py", line 1, in <module> 
    from . import document 
    File "/data/venv/lib/python3.4/site-packages/mongoengine/document.py", line 51 
    class EmbeddedDocument(BaseDocument, metaclass=DocumentMetaclass): 
               ^
SyntaxError: invalid syntax 

任何想法,为什么这可能发生?这对我来说特别奇怪,因为我无法在mongoengine源中找到违规行。

我的包是:

dj-database-url==0.3.0 
dj-static==0.0.6 
Django==1.8 
django-toolbelt==0.0.1 
gunicorn==19.3.0 
mongoengine==0.9.0 
psycopg2==2.6 
pymongo==2.8 
static3==0.5.1 

我不知道,如果是相关的,但为什么它利用python2.7importlib而不是python3.4

我不匹配的Git版本(使用pip install安装),并具有mongoengine/document.py副本中的以下:

class EmbeddedDocument(BaseDocument, metaclass=DocumentMetaclass): 
    ... 
    # The __metaclass__ attribute is removed by 2to3 when running with Python3 
    # my_metaclass is defined so that metaclass can be queried in Python 2 & 3 

我是新来的蟒蛇,所以我不明白这一点,但它看起来像一个蟒蛇3不兼容?

+0

mod_wsgi以某种方式使用Python 2而不是Python 3;该语法在Python 2中无效。您能否显示您的Apache配置和WSGI文件? –

+1

是的,你是对的。我使用了Ubuntu的'libapache2-mod-wsgi'软件包,其中包含一个为python 3.4设置的virtualenv。更改为'libapache2-mod-wsgi-py3'修复了它。谢谢你指出我朝着正确的方向。 – zelanix

问题是我使用的ubuntu libapache2-mod-wsgi软件包版本mod_wsgi是为Python 2.7构建的,但我的virtualenv是围绕python 3.4构建的。

该问题已通过卸载libapache2-mod-wsgi并安装libapache2-mod-wsgi-py3(为Python 3.4构建)得到解决。