Модуль не импортируется после sys.path.append () - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь развернуть свое приложение django. Как и многие другие, я столкнулся с проблемой «пропуска» django, без модуля с именем django, хотя он существует.

Мне пришлось установить Django версии 2, не самую новую, и она была установлена ​​в '/home/ivan/.local/lib/python3.5/site-packages/'.

У меня настроен apache, и wsgi.py выглядит так:

"""
WSGI config for mysite project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/
"""

import os
import sys
sys.path.append('/home/ivan/.local/lib/python3.5/site-packages/')
print(sys.path)
# import /home/ivan/.local/lib/python3.5/site-packages/django
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

application = get_wsgi_application()

Когда я набираю python3 в терминале и делаю это:

>>> import django
>>> django.__path__
['/home/ivan/.local/lib/python3.5/site-packages/django']

Итак, я получил свой путь к модулю django и добавляю его, я также попытался:

sys.path.insert(0, '/home/ivan/.local/lib/python3.5/site-packages/django')

и все же я получил 500 ошибок с раздражающими:

[Tue Apr 21 13:12:41.861348 2020] [wsgi:error] [pid 29470] [remote 185.201.90.67:1131] Traceback (most recent call last):
[Tue Apr 21 13:12:41.861379 2020] [wsgi:error] [pid 29470] [remote 185.201.90.67:1131]   File "/var/www/mysite/mysite/wsgi.py", line 15, in <module>
[Tue Apr 21 13:12:41.861384 2020] [wsgi:error] [pid 29470] [remote 185.201.90.67:1131]     from django.core.wsgi import get_wsgi_application
[Tue Apr 21 13:12:41.861397 2020] [wsgi:error] [pid 29470] [remote 185.201.90.67:1131] ImportError: No module named 'django'

Почему wsgi не может работать должным образом? Что я здесь не так делаю? Почему переводчик не может найти модуль после того, как я заставил его использовать sys.path.insert ()?

Огромное спасибо заранее!

UPDATE ONE

print(sys.path) внутри wsgi возвращает:

    ['/var/www/mysite', '/usr/lib/python35.zip', '/usr/lib/python3.5', 

'/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', 

'/usr/local/lib/python3.5/dist-packages', 

'/usr/lib/python3/dist-packages',

 '/home/ivan/.local/lib/python3.5/site-packages/']

ОБНОВЛЕНИЕ ВТОРОЕ

Поскольку я пытаюсь развернуть приложение, независимо от того, как я его решаю. Спасибо @KolaB за совет virtualenv.

Я только что сделал это, теперь у меня есть такая структура:

├── mysite
├── requirements.txt
└── venvdjang

venvdjang - это каталог с виртуальным переводчиком. Я также установил django по source /venvdjang/bin/activate

pip install -r requirements.txt

Теперь, как я могу сказать моим wsgi и apache2, что я хочу использовать virtualenv?

Обновление три

Спасибо всем за помощь!

У меня есть VPS с приложением flask в производстве (www.example.com) Теперь мне нужно развернуть еще одно веб-приложение на поддомене - django. (www.sub.example.com)

Это конфигурация для django.

/etc/apache2/sites-available/mysite.conf

<VirtualHost *:80>
    ServerName sub.example.com
    ServerAlias www.sub.example.com
    ServerAdmin sub.example.com@gmail.com
    #DocumentRoot /var/www/mysite

    ErrorLog ${APACHE_LOG_DIR}/mysite-error.log
    CustomLog ${APACHE_LOG_DIR}/mysite-access.log combined

    #DocumentRoot /var/www/mysite/index.html

    WSGIDaemonProcess mysite processes=2 threads=25 python-path=/var/www/mysite
    WSGIProcessGroup mysite
    WSGIScriptAlias / /var/www/mysite/mysite/wsgi.py

    Alias /robots.txt /var/www/mysite/static/robots.txt
    Alias /favicon.ico /var/www/mysite/static/favicon.ico
    Alias /static/ /var/www/mysite/static/
    Alias /static/ /var/www/mysite/media/

    <Directory /var/www/mysite/mysite>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    <Directory /var/www/mysite/static>
        Require all granted
    </Directory>

    <Directory /var/www/mysite/media>
        Require all granted
    </Directory>
</VirtualHost>

и это конфигурация для flask

 /etc/apache2/sites-available/FlaskApp-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
                ServerName www.example.com 
                ServerAdmin example.com@mywebsite.com
                WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi
                <Directory /var/www/FlaskApp/FlaskApp/>
                        Order allow,deny
                        Allow from all
                </Directory>
                Alias /static /var/www/FlaskApp/FlaskApp/static
                <Directory /var/www/FlaskApp/FlaskApp/static/>
                        Order allow,deny
                        Allow from all
                </Directory>
                ErrorLog ${APACHE_LOG_DIR}/error.log
                LogLevel warn
                CustomLog ${APACHE_LOG_DIR}/access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
ServerAlias  example.com 
SSLCertificateFile /etc/letsencrypt/live/example.com 
--p1ai/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com--p1ai/privkey.pem
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
                ServerName example.com 
                Redirect / https://www.example.com 
                ServerAdmin admin@mywebsite.com
                WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi
                <Directory /var/www/FlaskApp/FlaskApp/>
                        Order allow,deny
                        Allow from all
                </Directory>
                Alias /static /var/www/FlaskApp/FlaskApp/static
                <Directory /var/www/FlaskApp/FlaskApp/static/>
                        Order allow,deny
                        Allow from all
                </Directory>
                ErrorLog ${APACHE_LOG_DIR}/error.log
                LogLevel warn
                CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
# Some rewrite rules in this file were disabled on your HTTPS site,
# because they have the potential to create redirection loops.

# RewriteCond %{SERVER_NAME} = example.com 
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

#RewriteCond %{SERVER_PORT} !^443$
#RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
</VirtualHost>
</IfModule>

ОС - Ubuntu 16.04 mod_wsgi была установлена ​​несколько лет назад go sudo apt-get install

Обновление 4

Я изменил WSGIDaemonProcess python-home, как @Alasdair сказал python-home=/var/www/venvdjang, но это не сработало.

Теперь, если я запускаю в терминале source /var/www/venvdjang/bin/activate

    (venvdjang) ivan@server:/var/www$ python
    Python 3.5.2 (default, Oct  8 2019, 13:06:37)
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import django
    >>> import sys
    >>> sys.path
    ['', '/var/www/venvdjang/lib/python35.zip', '/var/www/venvdjang/lib/python3.5', 

'/var/www/venvdjang/lib/python3.5/plat-x86_64-linux-gnu', 

'/var/www/venvdjang/lib/python3.5/lib-dynload', 

'/usr/lib/python3.5', 

'/usr/lib/python3.5/plat-x86_64-linux-gnu', 

'/var/www/venvdjang/lib/python3.5/site-packages']
>>>

Но мой wsgi.py после удаления всех sys.path.append() сотрудников все равно возвращается после print(sys.path) это:

['/var/www/venvdjang', 

'/usr/lib/python35.zip',

 '/usr/lib/python3.5', 

'/usr/lib/python3.5/plat-x86_64-linux-gnu',

 '/usr/lib/python3.5/lib-dynload', 

'/usr/local/lib/python3.5/dist-packages',

 '/usr/lib/python3/dist-packages']

Как будто он все еще идет к системному переводчику ... Почему я не могу сослаться на правильный virtualenv?

...