关于python:Vagrant,WSGI,virtualenv和TypeError:’module’对象不可调用

Vagrant, WSGI, virtualenv and TypeError: 'module' object is not callable

我已经为我正在构建的应用程序提供了一个可移动的盒子,但是我在试图让Apache为其服务时遇到了麻烦。

它使用的是一个虚拟环境的软件包——现在这只是一个烧瓶和它的依赖关系,一切都很好。我可以在env中使用ssh并运行应用程序。应用程序本身只是目前最小的应用程序。

Apache错误

1
2
[Sun Mar 31 10:06:54 2013] [error] [client 10.0.2.2] mod_wsgi (pid=1587): Exception occurred processing WSGI script '/vagrant/myapp/myapp.wsgi'.
[Sun Mar 31 10:06:54 2013] [error] [client 10.0.2.2] TypeError: 'module' object is not callable

文件夹

1
2
3
4
5
/vagrant
├── env
└── myapp
    ├── app.py
    └── myapp.wsgi

我的应用程序.wsgi

1
2
3
4
5
6
7
activate_this = '/vagrant/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

import sys
sys.path.insert(0, '/vagrant/myapp')

import app as application

默认站点vhost

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<VirtualHost *:80>

        WSGIDaemonProcess myapp user=www-data group=www-data threads=5
        WSGIScriptAlias / /vagrant/myapp/myapp.wsgi

        <Directory /vagrant/myapp>
                WSGIProcessGroup myapp
                WSGIApplicationGroup %{GLOBAL}
                Order deny,allow
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

</VirtualHost>

我试过用用户和组vagrant运行apache,并将站点包和app dir配置为www-data。我还尝试将wsgidaemon用户和组更改为vagrant。

我尝试将站点包添加到路径中,并尝试将__init__.py添加到myapp,将myapp.wsgi更改为from myapp import app as application

该应用程序可以与source ../env/bin/activate && python app.py一起运行。

我被难住了。


我在wsgi文件中遇到的问题是因为我正在导入应用程序包,而不是其中的类(因为它们的名称相同而被捕获)。

1
2
3
4
5
6
7
activate_this = '/vagrant/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

import sys
sys.path.insert(0, '/vagrant/myapp')

from app import app as application

注意,最后一行已从import app as application更改。


可能这个问题是因为你使用一个共享文件夹作为你的应用程序源代码的存储,它的文件系统和普通ext3/4有点不同,所以Apache和/或chown在文件复制以外的其他方面也有问题…

编辑:虽然我只是一个python初学者,但typeerror:'module'对象不可调用可以帮助您解决问题。