mod-wsgi - 在 Django/mod_wsgi 虚拟环境中配置 WSGIPythonHome 的问题

标签 mod-wsgi python-3.7 apache2.4

我在 Windows 10 上运行 Python 3.7.1 和 Apache 2.4.38。我设置了一个虚拟环境,其中包含通过“pip”安装的 Django 2.2.5 和 mod_wsgi 4.6.5。在“httpd.conf”中,我按照几条说明将 WSGIPythonHome 设置为指向我的虚拟环境的根目录。但是当我启动 Apache 时它失败了:“没有名为‘encodings’的模块”。 Apache 似乎需要访问系统范围的 Python。

我在“C:\Program Files\Python3.7.1”中获得了系统范围的 Python。 虚拟环境位于:“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 无法找到虚拟环境中不存在的所有 native Python 模块,如“encodings”、“codecs”、“io”等。

当我注释掉“WSGIPythonHome”指令时,Apache 初始化了 Python,但是如果我尝试在“wsgi.py”脚本中导入 Django,它找不到它。

让一切正常运行的方法是,当我将“WSGIPythonHome”更改为指向系统范围的 Python 并将虚拟环境的“站点包”添加到路径时:

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

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

但这不是它的预期工作方式。 “WSGIPythonHome”有什么意义?难道我做错了什么?我的解决方案是否可以接受?

非常感谢!

最佳答案

我找到了!由于“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 文档中都没有明确说明。希望对您有所帮助。

关于mod-wsgi - 在 Django/mod_wsgi 虚拟环境中配置 WSGIPythonHome 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58159194/

相关文章:

python - 仅当从 mod_wsgi 运行时才出现来自 Selenium firefox_binary.py 的 WebDriverException

python-nmap : nmap. PortScanner() - 路径错误

python-3.x - 如何优化以下代码,使其运行速度更快?

php - 414 URI 太长。但不总是

django - 如何检查 mod_wsgi 是否安装在共享的 Apache 服务器上?

python - 初始化使用 Apache 和 mod_wsgi 运行的 Flask 应用程序

Python argparse - 将父解析器参数分组

multithreading - Apache 2.4 没有创建我们定义的最小备用线程

apache - 无法配置重写日志

python - 如果在 Windows 上导入 python 包,Apache 将无法工作