【问题标题】:Can´t load virtual enviroment in Apache, WSGI, Django and Windows可以在 Apache、WSGI、Django 和 Windows 中加载虚拟环境吗
【发布时间】:2020-10-25 08:41:30
【问题描述】:

我正在尝试在我的开发计算机中使用 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",但无济于事。

我有什么遗漏吗?任何帮助将不胜感激。

【问题讨论】:

  • 虚拟环境中python --version的输出是什么?
  • 感谢您的帮助,isAif。幸运的是,虚拟环境的 python 版本是 3.5.3,与正在运行的全局版本相同。似乎python版本不是这里的问题。也许我应该尝试调查用户配置文件。我可以尝试以管理员身份再次构建 venv(我真的不记得我是否已经尝试过)。

标签: python django windows apache wsgi


【解决方案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,它帮助我更好地理解了我一直在怀疑的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2014-11-09
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多