使用 WSGI 和 Apache 运行时的 Python 工作目录



我有一个web应用程序,它将查询数据库并用数据创建Excel电子表格。在将文件发送到客户端机器之前,我需要将电子表格保存到服务器的磁盘上。我使用Flask框架和openpyxl来生成电子表格。在Flask的开发服务器上运行时,一切都很好,但真正的服务器是带有WSGI的Apache2。当我在那里运行它时,当它试图保存电子表格时,会引发"拒绝权限"错误。我不知道Python在Apache/WSGI中运行时的工作目录是什么。

有没有一种方法,可能是在WSGI配置文件中,可以更改工作目录,或者以某种方式控制它将保存到哪里?如果可能的话,我希望使用相对路径进行保存(这使代码更具可移植性),这就是为什么更改工作目录是最好的解决方案。

您不应该更改工作目录。

用途:

import os
here = os.path.dirname(__file__)

变量here将包含该代码文件所在的目录。然后,您可以为与之相关的事物构建绝对路径。

database = os.path.join(here, 'database.db')

请注意,在Apache中运行代码的用户仍然需要对该目录进行读/写访问。

和往常一样,一定要阅读文档。文件的相关部分包括:

  • 应用程序工作目录
  • Apache用户的访问权限

我也遇到过类似的问题,我想使用带有相对路径的glob()。它在我的开发环境中工作,但在使用mod_wsgi的服务器上不工作。我在这里发现有一个"home="选项,您可以将其添加到WSGIDaemonProcess指令中,以设置应用程序的初始工作目录。您可以在虚拟主机文件中(在我的系统上/etc/apache2/sites-available/mysite.conf中)找到

在添加相对目录的路径时,可能需要更改大量代码。

从WSGIDaemonProcess更改主页有效,但您需要为每个vhost设置一个

在脚本开头重置cwd:

here = os.path.dirname(__file__)
os.chdir(here)

用于快速解决

最新更新