【问题标题】:"PermissionError: [Errno 13] Permission denied:" In flask application“PermissionError:[Errno 13] 权限被拒绝:”在烧瓶应用程序中
【发布时间】:2020-07-22 20:19:11
【问题描述】:

问题:
我收到以下错误

"PermissionError: [Errno 13] 权限被拒绝: '/home/[用户]/daily_events_20200722.txt'

从这行代码:

with open(settings.HOME_PATH + f'daily_events_{time.strftime("%Y%m%d")}.txt', 'a') as fileobject:

我尝试过的: 这是我尝试的第四个“位置”。我尝试的其他目录是 init.py 文件所在的目录和该目录的父目录(例如 /var/www/FlaskApp/FlaskApp/ 和 /var/www/FlaskApp/),我的“ home”目录和/tmp。

我应该在这里提到,将应用程序配置为写入 /tmp 目录消除了权限错误,但没有文件被写入。没有错误,代码继续愉快地通过我的代码部分,就好像它编写了文件一样,然后在不同的地方出错(不相关的错误)进一步向下。

更新:我认为为什么没有文件被写入 /tmp 的答案是 apache2 重定向输出,如此处所述: https://unix.stackexchange.com/questions/167835/where-apaches-tmp-located, 所以我将放弃写入 /tmp 作为解决方案并集中精力 关于权限问题。

如果我能理解 apache2 的凭据,那将非常有帮助 我的烧瓶应用程序将在尝试写入文件时使用。

我还为所有三个尝试过的目录(例如 user:rwx、group:r-x、others:r-x 最初尝试过其他人:rwx)的所有权和权限 (chmod) 进行了修改。还尝试了 root 和 [user ] 作为所有提到的目录及其父目录的所有者 (chown)。

我还尝试将 /etc/apache2/sites-available/ 中的 FlaskApp.conf 文件更改为:

<VirtualHost *:80>
    ServerName [serverip]
    ServerAdmin admin@[mydomain].com
    WSGIScriptAlias / /var/www/FlaskApp/FlaskApp.wsgi
    <Directory /var/www/FlaskApp/FlaskApp/>
        Order allow,deny
        Allow from all
    </Directory>
    Alias /static /var/www/FlaskApp/FlaskApp/static
    <Directory /var/www/FlaskApp/FlaskApp/static/>
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

到:

<VirtualHost *:80>
    ServerName [serverip]
    ServerAdmin admin@[mydomain].com
    WSGIScriptAlias / /var/www/FlaskApp/FlaskApp.wsgi
    <Directory /var/www/FlaskApp/FlaskApp/>
        Order allow,deny
        Allow from all
    </Directory>
    <Directory /home/[user]/>
        Order allow,deny
        Allow from all
    </Directory>
    Alias /static /var/www/FlaskApp/FlaskApp/static
    <Directory /var/www/FlaskApp/FlaskApp/static/>
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

我做了哪些研究: 对于上面提到的错误,我从这里 (Stack Overflow) 的搜索中获得了大部分尝试(如上所述)的想法。

约定: 我已将括号内的通用词(例如“[stuff]”)替换为我的生产应用配置文件等中的实际条目,只是为了不在像这样的公共论坛中透露太多信息。

我正在使用 Python 3.6.9,一个新安装的 mod-wsgi 和 apache2(假设是最新版本),运行在完全更新的 Ubuntu Server 18.04 之上,所有这些都在 AWS 的 Lightsaber 实例上。

我想要的: 一般来说,elp 会修复问题,以便我的 FlaskApp 可以将文件写入某处。具体来说,我认为了解烧瓶应用程序在哪些“用户”凭据下运行会很有帮助。如果我知道这一点,我也许能够弄清楚如何为某个地方配置权限来写入文件。令我困惑的是为什么文件没有被写入 /tmp,这让我认为这个问题可能比“权限”错误更复杂。

谢谢!

【问题讨论】:

    标签: apache flask python-3.6 mod-wsgi permission-denied


    【解决方案1】:

    运行 Apache2 的用户将需要写入您正在构建其路径的文件的权限。您可以通过尝试/tmp 来验证这一点,它是世界可写的。

    daily_events_path = '/tmp/test_daily_events.txt'
    with open(daily_events_path, 'a') as fileobj:
        ...
    

    如果这样可行,则可能是您之前对保护措施的摆弄不正确,或者涉及到像 SELinux 这样的小精灵,在这种情况下,它们可能是 /var/log 中某个不起眼的地方的日志条目,提供了提示。

    【讨论】:

    • /tmp 有效。我想我会让它去那里,因为只要我可以检查它在哪里并不重要。将来我将不得不记住 /tmp 。我没有意识到这是普遍可写的。奇怪的事情(我忘了把它放在原来的问题中)是我也在将数据写入 sqlite3 文件并将其移动到 '/home/[user]/' 目录修复了它的可写性问题。无论如何...谢谢!
    • 我想我很快就谈过了。写入 /tmp 可以避免错误,但实际上没有文件被写入那里。我不确定这是否与将“任何内容”写入 /tmp 相关,或者我现在有新问题。 :-(
    • fileobject.write(json.dumps(data) + "\n") 这就是“with”的结尾。下一行是空白的,后面跟着一个缩进的“logging.info()”,奇怪的是,它也没有被写入 /tmp,它应该按照代码前面的这一行所指定的位置:logging.basicConfig(filename= '/tmp/FlaskApp.log', format='%(asctime)s %(levelname)s:%(message)s', level=getattr(logging, 'INFO'))
    • 你在什么操作系统(和版本)上运行它?
    • 内核 = 5.3.0-1030-aws GNU/Linux,发行版 = Ubuntu 18.04 LTS 服务器,在 AWS 的 Lightsail 实例上
    猜你喜欢
    • 2015-07-17
    • 2016-07-25
    • 2018-11-18
    • 2020-07-01
    • 2016-11-12
    • 2019-11-09
    • 2020-06-06
    • 2021-11-11
    • 2020-02-27
    相关资源
    最近更新 更多