Ошибка настройки WSGIPythonHome в виртуальной среде Django / mod_wsgi - PullRequest
0 голосов
/ 30 сентября 2019

Я использую Python 3.7.1 и Apache 2.4.38 в Windows 10. Я установил виртуальную среду, содержащую Django 2.2.5 и mod_wsgi 4.6.5, установленные через «pip». Внутри "httpd.conf" я установил WSGIPythonHome, указывающий на корень моей виртуальной среды, согласно нескольким инструкциям. Но когда я запускаю Apache, происходит сбой: «Нет модуля с именем« encodings »». Apache, кажется, нуждается в доступе к общесистемному Python.

Я получил общесистемный Python в: "C: \ Program Files \ Python3.7.1". Виртуальная среда находится в: "D: \ PROJ \ PYTHON \ VEnv \ django".

Это то, что я добавил в "httpd.conf":

LoadModule wsgi_module "D:/PROJ/PYTHON/VEnv/django/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"

WSGIScriptAlias / "D:/PROJ/PYTHON/VEnv/django/Shipkaliev/wsgi.py"

WSGIPythonHome "D:/PROJ/PYTHON/VEnv/django"

WSGIPythonPath "D:/PROJ/PYTHON/VEnv/django/Shipkaliev"

<Directory "D:/PROJ/PYTHON/VEnv/django/Shipkaliev">
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

В соответствии с: https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html и: https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/modwsgi/ это то, как это должно быть установлено.

Таким образом, с этой конфигурацией Apache не может найти все собственные модули Python, такие как "кодировки", "кодеки "," io "и т. д., не присутствующие в виртуальной среде.

Когда я закомментирую директиву" WSGIPythonHome ", Apache инициализирует Python, но затем, если я пытаюсь импортировать Django в" wsgi.py ""script, он не может его найти.

Способ, которым я все заработал, заключается в том, что я изменил" WSGIPythonHome ", чтобы он указывал на общесистемный Python, и добавил" site-packages "виртуальной среды к пути:

WSGIPythonHome "C:/Program Files/Python3.7.1"

WSGIPythonPath "D:/PROJ/PYTHON/VEnv/django/Lib/site-packages;D:/PROJ/PYTHON/VEnv/django/Shipkaliev"

Но это не так, как это должно работать. Какой смысл "WSGIPythonHome"? Я делаю что-то неправильно? И мое решение приемлемо?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

На самом деле, проблема с дырой возникла, потому что виртуальная среда, которую я впервые использовал (для Django), была создана с помощью "venv" Stdlib. Но когда я создал один с "virtualenv", все было отлично, и первоначальная конфигурация "httpd.conf" работала просто отлично, как и должно быть.

В среде "venv" в каталоге "Lib" (Windows) у вас есть только каталоги "site-packages" и "tcl ...". Таким образом, среда «venv» опирается на стандартную библиотеку Python, с которой она была создана.

Принимая во внимание: «virtualenv» - это инструмент для создания изолированный »(и независимый) «Среды Python. ... Он создает среду, которая имеет свои собственные установочные каталоги, не разделяет библиотеки с другими средами virtualenv» и, по желанию (по умолчанию), также не имеет доступа к глобально установленным библиотекам. В виртуальной среде «virtualenv» в каталоге «Lib» у вас есть вся стандартная библиотека!

Вот почему, когда «WSGIPythonHome» был установлен в корень виртуальной среды (с «virtualenv»), этовремя работает, потому что теперь Apache может найти «кодировки», «кодеки» и все остальное в Stdlib в этой виртуальной среде!

Я совершенно уверен, что мое маленькое препятствие сделает кого-то лучше информированным. :)

0 голосов
/ 30 сентября 2019

Я нашел это! Поскольку «D: / PROJ / PYTHON / VEnv / django» является корнем виртуальной среды, стандартная библиотека Python там не найдена. Стандартная библиотека находится в "C: / Program Files / Python3.7.1 / Lib". Вот почему: «Ни один модуль с именем 'encodings'".

"WSGIPythonHome - используется для указания Python, когда он инициализируется, где установлены его библиотечные файлы. ... Когда используется эта директива, она должна быть предоставленапрефикс для каталогов, содержащих независимые от платформы и системные библиотечные файлы Python. "- спасибо: https://code.google.com/archive/p/modwsgi/wikis/ConfigurationDirectives.wiki#WSGIPythonHome

И это мой последний Apache conf:

LoadModule wsgi_module "D:/PROJ/PYTHON/VEnv/django/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"

WSGIScriptAlias / "D:/PROJ/PYTHON/VEnv/django/Shipkaliev/wsgi.py"

WSGIPythonHome "D:/PROJ/PYTHON/VEnv/django;C:/Program Files/Python3.7.1"

WSGIPythonPath "D:/PROJ/PYTHON/VEnv/django/Lib/site-packages;D:/PROJ/PYTHON/VEnv/django/Shipkaliev"

<Directory "D:/PROJ/PYTHON/VEnv/django/Shipkaliev">
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

Это не прояснено ни в Django, ни в документах mod_wsgi. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...