Я пытаюсь развернуть свое приложение 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?