python - Apache /Django : ImportError: No module named 'my_project'

标签 python django apache mod-wsgi wsgi

尝试使用 apache2 和 mod_wsgi 托管我的 django 项目。我尝试了各种配置,但在浏览器中访问该站点时不断出现导入错误,例如:

Traceback (most recent call last):
  File "/home/user/projects/my_projectMain/my_project/my_project/wsgi.py", line 19, in <module>
    application = get_wsgi_application()
  File "/usr/local/lib/python3.4/dist-packages/django/core/wsgi.py", line 13, in get_wsgi_application
    django.setup(set_prefix=False)
  File "/usr/local/lib/python3.4/dist-packages/django/__init__.py", line 22, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/usr/local/lib/python3.4/dist-packages/django/conf/__init__.py", line 53, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.4/dist-packages/django/conf/__init__.py", line 41, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python3.4/dist-packages/django/conf/__init__.py", line 97, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib/python3.4/importlib/__init__.py", line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2212, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2224, in _find_and_load_unlocked
ImportError: No module named 'my_project'

这是我的目录结构(/home/user/projects/my_projectMain/):

-- my_projectEnv\ (virtualenv w/ python 3.5.2, django 1.10, django-bootstrap3, django-static-jquery==2.1.4)
-- my_project\
 |-- app\
 |-- manage.py
 |-- static\
 |-- my_project\
 |-- | -- __init__.py
 |-- | -- __pycache__
 |-- | -- settings.py
 |-- | -- wsgi.py
 `-- | -- urls.py

wsgi.py:

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")

application = get_wsgi_application()

/etc/apache2/sites-available/000-default.conf:

...
#ServerName www.example.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html    

Alias /static /home/user/projects/my_projectMain/my_project/static
        <Directory /home/user/projects/my_projectMain/my_project/static>
            Require all granted
        </Directory>

        <Directory /home/user/projects/my_projectMain/my_project/my_project>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>

        WSGIDaemonProcess my_project python-path=/home/user/projects python-home=/home/user/projects/my_projectMain/my_projectEnv
        WSGIProcessGroup my_project
        WSGIScriptAlias / /home/user/projects/my_projectMain/my_project/my_project/wsgi.py
...

我担心我的目录结构有问题,但也看到了很多与 wsgi.py 中的路径不正确相关的其他帖子。


编辑: 如果我将 python-path 更改为:

WSGIDaemonProcess my_project python-path=/home/user/projects/my_projectMain/my_project/my_project

我得到:

 Traceback (most recent call last):
   File "/home/user/projects/my_projectMain/my_project/my_project/wsgi.py", line 25, in <module>
     application = get_wsgi_application()
   File "/usr/local/lib/python3.4/dist-packages/django/core/wsgi.py", line 13, in get_wsgi_application
     django.setup(set_prefix=False)
   File "/usr/local/lib/python3.4/dist-packages/django/__init__.py", line 27, in setup
     apps.populate(settings.INSTALLED_APPS)
   File "/usr/local/lib/python3.4/dist-packages/django/apps/registry.py", line 85, in populate
     app_config = AppConfig.create(entry)
   File "/usr/local/lib/python3.4/dist-packages/django/apps/config.py", line 90, in create
     module = import_module(entry)
   File "/usr/lib/python3.4/importlib/__init__.py", line 109, in import_module
     return _bootstrap._gcd_import(name[level:], package, level)
   File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
   File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
   File "<frozen importlib._bootstrap>", line 2224, in _find_and_load_unlocked
 ImportError: No module named 'django_static_jquery'
  1. 这是否意味着我已经克服了无法导入 my_project 的问题?
  2. 我已经运行了 collectstatic 并确保 static_jquery 在我的 STATIC_ROOT 中,它怎么可能无法导入已安装的应用程序?

最佳答案

我做错了几件事导致了我遇到的错误。其中一些对于更有经验的用户来说可能是显而易见的,但希望写下这些类(class)可以帮助其他人。我知道我必须深入挖掘许多人的位置才能弄清楚其中的一些内容。

我了解到,一旦设置了 virtualenv(virtualenv -p /usr/local/bin/python3 <path/to/new/virtualenv/> 顺便说一句),您应该只使用 pippython (相对于 pip3python3 分别)当 virtualenv 处于事件状态时。例如:

(venv) user my_projectMain $ pip install django-bootstrap3

代替:

(venv) user my_projectMain $ pip3 install django-bootstrap3

我的问题编辑显示我为我的目录结构找出了正确的 WSGIDaemonProcess python 路径。感谢@spectras 的帮助。


接下来是一些文件系统权限设置步骤,我在遵循的指南(下面的链接)中完全忽略了这些步骤。


在所有这些之后,我仍然得到:ImportError: No module named 'django_static_jquery' .如果我从 settings.py 中的 INSTALLED_APPS 中删除该行,则该站点将正确加载。

最终,这是因为我在我的 Python 3.5.2 virtualenv 中使用针对 Python 3.4 编译的 mod_wsgi,正如上面提到的 @Graham Dumpleton。我一直在使用以下方式安装 mod_wsgi:

sudo apt-get install libapache2-mod-wsgi-py3

它使用的是我的操作系统附带的 Python 3.4(raspbian jessie,顺便说一句)。

但是,由于我手动安装了 Python 3.5.2,因此我还需要手动安装 mod_wsgi 并针对我的 3.5.2 安装进行编译。这是我所做的:

mkdir ~/mod_wsgiPy3.5
cd ~/mod_wsgiPy3.5
wget https://pypi.python.org/packages/84/65/44a10ac5e117abc40078575a3dcf3256545ba20495b7330ba59045ec3503/mod_wsgi-4.5.9.tar.gz
tar -zxvf mod_wsgi-4.5.9.tar.gz
cd mod_wsgi-4.5.9/
./configure --with-python=/usr/local/bin/python3
make
sudo make install

在此之后,apache 不会重新启动,因为 .我发现这是因为我必须在 apache 中激活这个新安装的 mod_wsgi 模块。这是通过以下方式实现的:

sudo a2enmod
wsgi
sudo systemctl restart apache2

/etc/apache2/sites-available/000-default.conf:

...
WSGIDaemonProcess my_project python-path=/home/user/my_projectMain/my_project/my_project python-home=/home/user/my_projectMain/venv
WSGIProcessGroup my_project
WSGIScriptAlias / /home/user/my_projectMain/my_project/my_project/wsgi.py
...

最终目录结构(~/my_projectMain/):

.
├── my_project
│   ├── app
│   ├── db.sqlite3
│   ├── manage.py
│   ├── my_project
│   └── static
└── venv

现在一切正常。我推荐这个指南,因为它帮助了我很多:How To Serve Django Applications with Apache and mod_wsgi on Debian 8 .看起来他们有一些用于各种操作系统

关于python - Apache /Django : ImportError: No module named 'my_project' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42566367/

相关文章:

php - 升级到 Debian Jessie 后 : Random mod_fcgid errors

python - 无法保存在 Networkx 和 matplotlib 中制作的图形

python - 如何在没有数据库的情况下制作自定义表单 - DJANGO

python - 如何查看 Django 模型在 admin 中有多少个关系?

javascript - 将 javascript 添加到用于谷歌分析的扩展 django 模板

apache - PhpMailer 能够从 Windows 但不能从 CentOS 发送邮件

apache - 在 Apache 中创建 IP 虚拟主机

python - 在 Pandas DataFrame 中用 0 替换不是 INT 的值

python - 访问 PyTorch 中预训练模型中的特定层

django - 如何在 PyCharm 中重命名 Django 项目?