Apache2 Python';与WSGI和Apache一起运行时的工作目录

Apache2 Python';与WSGI和Apache一起运行时的工作目录,apache2,mod-wsgi,Apache2,Mod Wsgi,我有一个web应用程序,它将查询数据库并用数据创建Excel电子表格。在将文件发送到客户端计算机之前,我需要将电子表格保存到服务器磁盘。我正在使用Flask框架和openpyxl生成电子表格。在Flask的开发服务器上运行时,一切正常,但真正的服务器是带有WSGI的Apache2。当我在那里运行它时,当它试图保存电子表格时,会出现“权限被拒绝”错误。我不知道在Apache/WSGI中运行时Python的工作目录是什么 是否有一种方法,可以在WSGI配置文件中更改工作目录,或者以某种方式控制它将保

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


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

您不应该更改工作目录

使用:

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

database = os.path.join(here, 'database.db')
请注意,在Apache中运行代码的用户仍然需要对该目录进行读/写访问

和往常一样,确保您阅读了文档。文件的相关章节包括:


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

Brilliant!非常感谢。最好的部分是它是一个可移植的解决方案。你也可以
here=os.getcwd()
No你不能使用getcwd(),因为mod_wsgi下的当前工作目录通常不在代码所在的位置。阅读引用的第一个链接,因为它解释了这一点。你是对的。getcwd()与os.path.dirname(\uuuuu文件)不同。请注意,
\uuuu文件中的这些文件是额外的
\uuuuu
WSGIDaemonProcess不适用于Windows。
database = os.path.join(here, 'database.db')