Apache不允许Flask app创建文件

时间:2015-12-15 20:08:22

标签: python flask

我正在尝试将JPEG图像从应用程序转移到另一个应用程序。在我收到它的地方,流来自请求的正文,我尝试再次整理文件,如下所示:

if r.status_code == 200:
    f = open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + "\\static\\tmp\\" + filename), 'wb')
    f.write(r.content)
    f.close()
    return True

在localhost中运行时效果很好。该文件就在它的位置,就像我上传它时一样。

当我去部署所有应用程序并对其进行测试时,Apache不允许我执行f = open(...),这给了我错误:

IOError: [Errno 13] Permission denied: u'/var/www/my_url\\static\\tmp\\2378687.jpeg'

这很奇怪,因为 tmp 文件夹具有属性

unconfined_u:object_r:httpd_sys_rw_content_t:s0

它不应该允许我创建新文件,即使不是sudo用户吗?

2 个答案:

答案 0 :(得分:2)

  1. 使用os.path.join代替enter code here 。这使您的代码在linux / windows os之间更加便携。

    \\

  2. 您不是指/ tmp,而是尝试在静态文件夹中写入:f = open(os.path.join(os.path.dirname(os.path.realpath(__file__), "static,"tmp" , filename), 'wb')。尝试使用绝对路径。

答案 1 :(得分:1)

你的函数的第一行有一个错误。它应该是

f = open(os.path.join(os.path.dirname(os.path.realpath(__file__),
                      "static", "tmp", filename), 'wb')

Windows和Linux上的目录分隔符不同。这就是为什么它在本地工作,但不在服务器上。 os模块用于抽象出这些差异,但实际上并没有使用它来构造文件名。编写代码的方式,os.path.join()是一个noop。

您的代码尝试将名为my_url\static\tmp\2378687.jpeg的文件写入目录/var/www/my_url

此外,您应该使用context manager,可能是文件路径的可配置常量,捕获错误也是个好主意:

UPLOAD_DIR = '/var/www/my_url/static/tmp'

if r.status_code == 200:
    try:
        with open(os.path.join(UPLOAD_DIR, filename), 'wb') as f
            f.write(r.content)
    except IOError as e:
        # log e.message or something
        return False
    return True