Почему `flask_bootstrap` не может быть импортирован? - PullRequest
0 голосов
/ 03 мая 2018

При запуске приложения фляги, Apache2 error.log показывает, что модуль flask_bootstrap не может быть найден:

[wsgi:warn] mod_wsgi: Compiled for Python/2.7.11.
[wsgi:warn] mod_wsgi: Runtime using Python/2.7.12.
[mpm_event:notice] AH00489: Apache/2.4.18 (Ubuntu) mod_wsgi/4.3.0 Python/2.7.12 configured -- resuming normal operations
[core:notice] AH00094: Command line: '/usr/sbin/apache2'
[wsgi:error] mod_wsgi (pid=18587): Target WSGI script '/var/www/myapp/myapp.wsgi' cannot be loaded as Python module.
[wsgi:error] mod_wsgi (pid=18587): Exception occurred processing WSGI script '/var/www/myapp/myapp.wsgi'.
[wsgi:error] Traceback (most recent call last):
[wsgi:error]   File "/var/www/myapp/myapp.wsgi", line 7, in <module>
[wsgi:error]     from myapp import app as application 
[wsgi:error]   File "/var/www/myapp/myapp/__init__.py", line 2, in <module>
[wsgi:error]     from flask_bootstrap import Bootstrap
[wsgi:error] ImportError: No module named flask_bootstrap

Я настроил venv согласно myapp.conf

<VirtualHost *:80>
ServerName yourdomain.com
ServerAdmin youemail@email.com

WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}

WSGIScriptAlias / /var/www/myapp/myapp.wsgi
WSGIDaemonProcess myapp python-home=/var/www/myapp/myapp/venv

<Directory /var/www/myapp/myapp/>
    Order allow,deny
    Allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Модуль доступен как для всей системы, так и для Venv:

root@host:/var/www/myapp# python
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from flask_bootstrap import Bootstrap
>>> Bootstrap
<class 'flask_bootstrap.Bootstrap'>

И ...

root@host:/var/www/myapp# source myapp/venv/bin/activate
(venv) root@host:/var/www/myapp# python
Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from flask_bootstrap import Bootstrap
>>> Bootstrap
<class 'flask_bootstrap.Bootstrap'>

Отмечу, что есть предупреждение о несоответствии 2.7.11 и 2.7.12, но действительно ли проблема в младшей версии?

Редактировать 1

Согласно документам , добавлено следующее к myapp.wsgi

activate_this = '/var/www/myapp/myapp/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

Не имеет значения.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Итак, после того, как Грэм убедил меня, что мое «исправление» (перевод двух строк в директиву <Directory>) на самом деле не было исправлением и, вероятно, признаком того, что что-то не так, я решил копнуть глубже.

Следуя документам, в частности , подтверждающим местоположение виртуальной среды , я с удивлением обнаружил, что при активации виртуальной среды на моем локальном компьютере (не через приложение wsgi):

sys.prefix = '/usr'

когда я ожидал, что это будет:

sys.prefix = '/var/www/myapp/myapp/venv'

Понятия не имею, как это произошло. Может быть, результат выполнения всей начальной работы как root.

Тем не менее, приятно сказать, что при удалении и переделке виртуальной среды, на этот раз как у обычного пользователя, все выглядит хорошо.

0 голосов
/ 04 мая 2018

Оказывается, проблема заключалась в том, что две строки:

WSGIProcessGroup myapp
WSGIApplicationGroup %{GLOBAL}

должен был быть внутри <Directory>!

Итак, myapp.conf теперь выглядит так:

<VirtualHost *:80>
        ServerName yourdomain.com

        WSGIDaemonProcess myapp python-home=/var/www/myapp/myapp/venv
        WSGIScriptAlias / /var/www/myapp/myapp.wsgi

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

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Справедливости ради это соответствует примеру в документах .

Большое спасибо всем, кто прокомментировал:)

...