mod_wsgi 无法使用 pipenv 导入烧瓶

mod_wsgi can't import flask with pipenv

我正在尝试部署我的第一个 Flask 应用程序,但我 运行 遇到了一些问题。我的应用程序在我的本地机器上使用内置的 flask 开发服务器运行,我所有的依赖项都由 pipenv 管理。我将我的应用程序上传到 /var/www/directory_printer 和 运行 pipenv install。然后我创建了一个 apache vhost 文件并将它指向我的 .wsgi 文件: WSGIScriptAlias / /var/www/directory_printer/directory.wsgi

在 directory.wsgi 中,我导入了我的应用程序。在我的主应用程序文件的开头,我导入了 flask。当我尝试访问我的应用程序时,出现 500 错误。在 apache 错误日志中,我得到: ModuleNotFoundError: No module named 'flask'

如果我在激活了 pipenv shell 的 directory_printer 文件夹中启动交互式 python shell,我可以很好地导入烧瓶。 我尝试将虚拟环境的路径放在 directory.wsgi 文件的开头: #!/path/to/venv 但这似乎没有帮助。我确定我错过了一些简单的东西,但我似乎看不到它是什么。任何帮助,将不胜感激。谢谢!

通常在 Linux 系统上,其他用户无法访问主目录,因此 Apache 用户将无法读取该目录下的任何内容。 Python 已安装的软件包的权限也可能是错误的,因此也无法访问。

好的,不确定这是否是正确答案,但它现在对我有用。

首先 在项目根文件夹中创建一个 .venv 文件夹 然后更改权限: sudo chown www-data:www-data .venv

然后创建一个虚拟环境并从 Pipfile 安装您的要求,因为用户 wsgi 将 运行 作为:

sudo -su www-data python3 -m virtualenv -p python3 .venv pipenv install

这会将您的虚拟环境安装到项目文件夹中。查看此答案以获取更多信息:

然后将其添加到您的 .wsgi 文件夹中:

with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

本页底部了解更多信息: https://flask.palletsprojects.com/en/2.0.x/deploying/mod_wsgi/

现在可以了!希望这也能帮助其他人。