无法在Apache,WSGI,Django和Windows中加载虚拟环境

时间:2020-07-04 23:34:56

标签: python django windows apache wsgi

我试图在带有Windows的开发计算机中运行Django应用。我已经使用virtualenv(不是virtualenvwrapper)成功创建了一个虚拟环境,安装了Django,并将其加载到运行python manage.py runserver的内部服务器中。我相信使用PHP,路径变量等的所有东西都可以。

我还按照https://modwsgi.readthedocs.io/en/develop/的说明成功安装了WSGI,但仅使用全局Python。我已经在virtualenv外部安装了执行以下步骤的mod_wsgi:

set "MOD_WSGI_APACHE_ROOTDIR=C:/wamp64/bin/apache/apache2.4.41"
pip install --upgrade setuptools
pip install mod_wsgi
mod_wsgi-express module-config

然后我将结果行复制到我的httpd.conf:

LoadFile "c:/program files/python35/python35.dll"
LoadModule wsgi_module "c:/program files/python35/lib/site-packages/mod_wsgi/server/mod_wsgi.cp35-win_amd64.pyd"
WSGIPythonHome "c:/program files/python35"

在httpd.conf中创建了别名

Alias /test/ "C:/wamp64/apps/wsgi_app/"
<Location /test>
  SetHandler wsgi-script
  Options +ExecCGI
</Location>
<Directory "C:/wamp64/apps/wsgi_app">
  Options Indexes FollowSymLinks
  Require local
</Directory>

并成功提供了wsgi文件:

import sys
def application(environ, start_response):
    status = '200 OK'
    output = u''
    output += u'sys.version = %s\n' % repr(sys.version)
    output += u'sys.prefix = %s\n' % repr(sys.prefix)
    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output.encode('UTF-8')]

它就像一个咒语,表明我在VC版本,Python版本等方面没有问题。

当我尝试在虚拟环境中做同样的事情时,Apache似乎无法加载它。我做了所有类似的事情,从头开始在venv中安装了所有东西。唯一不同的是mod_wsgi-express module-config产生不同的结果:

LoadModule wsgi_module "c:/wamp64/venv/lib/site-packages/mod_wsgi/server/mod_wsgi.cp35-win_amd64.pyd"
WSGIPythonHome "c:/wamp64/venv"

Apache服务器启动:Apache/2.4.41 (Win64) mod_fcgid/2.3.10-dev mod_wsgi/4.7.1 Python/3.5 PHP/7.3.12 configured -- resuming normal operations只是立即崩溃Fatal Python error: Py_Initialize: unable to load the file system codec ImportError: No module named 'encodings'

我尝试使用先前在cmd窗口中激活的venv来启动Apache,而没有事先激活它。看来Apache没有看到或没有激活虚拟环境。该问题发生在任何Django干预之前,我什至无法提供我显示的测试文件。我什至尝试在httpd.conf中添加LoadFile "C:/wamp64/venv/Scripts/python35.dll",但无济于事。

我有什么想念的吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我注意到,apache24mod_wsgi的最新版本就是这种情况。一年多以前我没有运行安装程序,但是在过去的几天里,一直很努力地尝试再次安装(使用mod_wsgi 4.7.1apache 2.4.46)。

部分问题似乎是因为大多数核心python模块不是直接在venv目录下可用(因为virtualenv不会将这些文件复制到venv目录(通过设计)),由于这些新版本不存在于encodings下,因此它们以某种方式无法成功找到venv模块(可能还有其他模块)。例如。 激活虚拟环境并运行

import encodings
encodings.__file__

在我的情况下,您将获得系统范围的python lib目录c:/program files/python37/lib/encodings/__init__.py

尝试

WSGIPythonHome "c:/program files/python37/"
WSGIPythonPath "/path/to/venv/site-packages;path/to/your/app/root/folder"

这为我解决了问题。它类似于this answer,可帮助我更好地了解自己一直在怀疑的事情。