Django、Python 3和;Postgres-mod_wsgi问题

Django、Python 3和;Postgres-mod_wsgi问题,python,django,apache,mod-wsgi,Python,Django,Apache,Mod Wsgi,我正在尝试为个人项目配置Django测试应用程序。我以前有过Django的经验,但这就是Python 2.7.x的全部内容。如果可能的话,我想开始使用3.x,这个项目似乎是一个很好的开始 后端是标准的Postgres9.4安装,Apache2.4,Python3.4在VirtualEnvrapper中,操作系统是OSX10.10。mod_wsgi和mod_wsgi3都是通过自制安装的 但是,让mod_wsgi和mod_wsgi3与python 3一起使用存在一些问题。具体来说,/manage.p

我正在尝试为个人项目配置Django测试应用程序。我以前有过Django的经验,但这就是Python 2.7.x的全部内容。如果可能的话,我想开始使用3.x,这个项目似乎是一个很好的开始

后端是标准的Postgres9.4安装,Apache2.4,Python3.4在VirtualEnvrapper中,操作系统是OSX10.10。mod_wsgi和mod_wsgi3都是通过
自制
安装的

但是,让mod_wsgi和mod_wsgi3与python 3一起使用存在一些问题。具体来说,
/manage.py运行服务器8080
工作正常,但当我尝试在Apache中使用virtualhost配置时,我得到了

mod_wsgi (pid=29906): Target WSGI script '/Users/jason/projects/geocode_django/geodjango/geodjango/wsgi.py' cannot be loaded as Python module.
mod_wsgi (pid=29906): Exception occurred processing WSGI script '/Users/jason/projects/geocode_django/geodjango/geodjango/wsgi.py'.
Traceback (most recent call last):
    File "/Users/jason/projects/geocode_django/geodjango/geodjango/wsgi.py", line 28, in <module>
    application = get_wsgi_application()
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/core/wsgi.py", line 14, in       get_wsgi_application
      django.setup()
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/__init__.py", line 21, in setup
      apps.populate(settings.INSTALLED_APPS)
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/apps/registry.py", line 108, in populate
     app_config.import_models(all_models)
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/apps/config.py", line 197, in import_models
      self.models_module = import_module(models_module_name)
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
       __import__(name)
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/contrib/auth/models.py", line 40, in <module>
       class Permission(models.Model):
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/models/base.py", line 125, in __new__
       new_class.add_to_class('_meta', Options(meta, **kwargs))
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/models/base.py", line 300, in add_to_class
       value.contribute_to_class(cls, name)
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/models/options.py", line 166, in contribute_to_class
       self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/__init__.py", line 40, in __getattr__
       return getattr(connections[DEFAULT_DB_ALIAS], item)
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/utils.py", line 242, in __getitem__
        backend = load_backend(db['ENGINE'])
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/utils.py", line 108, in load_backend
        return import_module('%s.base' % backend_name)
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
        __import__(name)
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/contrib/gis/db/backends/postgis/base.py", line 2, in <module>
        from django.db.backends.postgresql_psycopg2.base import DatabaseWrapper as Psycopg2DatabaseWrapper
    File "/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 27, in <module>
        raise ImproperlyConfigured("Error loading psycopg2 module: %s" % e)
          ImproperlyConfigured: Error loading psycopg2 module: dlopen(/Users/jason/.virtualenvs/geodev_env3/lib/python3.4/  site-packages/psycopg2/_psycopg.so, 2): Symbol not found: _PyBytes_Type
        Referenced from: /Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/psycopg2/_psycopg.so
          Expected in: flat namespace
          in /Users/jason/.virtualenvs/geodev_env3/lib/python3.4/site-packages/psycopg2/_psycopg.so
而virtualhost文件是:

LoadModule wsgi_module /usr/local/Cellar/mod_wsgi3/3.5/libexec/mod_wsgi.so

<VirtualHost *:80>
    ServerName      dev.geocode.com
    ServerAlias     geocode.com
    ServerAdmin     jason@someschool.edu

    DocumentRoot    "/Users/jason/projects/geocode_django"
    Alias /static/ /Users/jason/projects/geocode_django/static/

    WSGIScriptAlias / /Users/jason/projects/geocode_django/geodjango/geodjango/wsgi.py

    <Directory /Users/jason/projects/geocode_django/static >
            require all granted
    </Directory>

    <Directory /Users/jason/projects/geocode_django/geodjango/geodjango >
            <Files wsgi.py >
                    Require all granted
            </Files>

    </Directory>

    CustomLog /Users/jason/projects/geocode_django/logs/access.log combined
    ErrorLog /Users/jason/projects/geocode_django/logs/error.log

</VirtualHost>
替换

with open("/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py") as f:
    code = compile(f.read(), "/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py", "exec")
    exec(code, dict(__file__="/Users/jason/.virtualenvs/geodev_env3/bin/activate_this.py"))
在wsgi.py中使用

exec(open("/Users/jasonjohns/.virtualenvs/geocode_env/bin/activate_this.py").read())
我可以用URL
dev.geocode.com
加载该站点。否则,我会得到一个错误500页,日志文件中有错误输出

我最初认为这是psycopg2的问题,并提交了一份报告。然而,开发人员结束了这个问题,因为他们关心的是mod_wsgi,而不是psycopg


除了为我的本地环境编译mod_wsgi之外,还有什么方法可以解决这个问题吗?

根据Graham Dumpleton通过mod_wsgi google group提供的提示,找到了一个解决方案。核心问题是
brew install mod_wsgi
pip install mod_wsgi
安装的
mod_wsgi
版本都是为Python 2.7.x编译的

还有一件事
pip
,在
python--version
返回
python2.7.6
的系统上,将使用该python版本构建任何安装命令。如果您有Python 3.x,以及2.7.x和
Python--version
返回
Python 3.x.x
pip3安装…
将下载3.x兼容的代码并为该Python版本构建

解决方案是通过

brew uninstall mod_wsgi
pip uninstall mod_wsgi
并通过

pip3 install mod_wsgi
因此,Apache配置文件的LoadModule位置更改为

/usr/local/lib/python3.4/site-packages/mod_wsgi-4.4.9-py3.4-macosx-10.10-x86_64.egg/mod_wsgi/server/mod_wsgi-py34.so
注意路径中的
python3.4
位置


进行这些更改并重新启动Apache后,站点将按预期加载。

但错误是针对psycopg的,而不是mod_wsgi。你确定你已经为Python3正确安装了它吗?我最初认为是这样的,并在上提交了一份错误报告。然而,psycopg开发人员认为原因是外部因素,而不是psycopg。我已经添加了这个和问题的bug report链接。此外,这是一个psycopg问题,那么我仍然会通过运行
/manage.py runserver 8080
收到相同的错误。由于django dev服务器工作正常,并且使用2.7.x Python可执行文件与Apache配合使用,问题似乎是mod_wsgi与Python 3.x的兼容性。正如dvarrazzo所建议的那样,您有没有试着询问mod_wsgi人员?我已经向google小组提交了一篇帖子,但没有得到回复。这是一个很好的知识-谢谢。绝对值得+1。
pip3 install mod_wsgi
/usr/local/lib/python3.4/site-packages/mod_wsgi-4.4.9-py3.4-macosx-10.10-x86_64.egg/mod_wsgi/server/mod_wsgi-py34.so