Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Apache没有';不要让Flask应用程序创建文件_Python_Flask - Fatal编程技术网

Python Apache没有';不要让Flask应用程序创建文件

Python Apache没有';不要让Flask应用程序创建文件,python,flask,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 T

我正在尝试从一个应用程序到另一个应用程序获取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用户,它也不应该允许我创建新文件吗?

您的函数的第一行有一个bug。应该是

f = open(os.path.join(os.path.dirname(os.path.realpath(__file__),
                      "static", "tmp", filename), 'wb')
Windows和Linux上的目录分隔符不同。这就是为什么它可以在本地工作,但不能在服务器上工作。
os
模块是用来提取这些差异的,但实际上您并没有使用它来构造文件名。按照编写代码的方式,
os.path.join()
是一个noop

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

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

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

在函数的第一行中有一个bug。应该是

f = open(os.path.join(os.path.dirname(os.path.realpath(__file__),
                      "static", "tmp", filename), 'wb')
Windows和Linux上的目录分隔符不同。这就是为什么它可以在本地工作,但不能在服务器上工作。
os
模块是用来提取这些差异的,但实际上您并没有使用它来构造文件名。按照编写代码的方式,
os.path.join()
是一个noop

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

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

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
  • 使用而不是
    \\
    。这使您的代码在linux/windows操作系统之间更易于移植

    f=open(os.path.join(os.path.dirname(os.path.realpath(\uuuu文件)、“static”、“tmp”、filename)、“wb”)

  • 您没有引用/tmp,而是尝试在静态文件夹中写入:
    /var/www/my_url
    。请尝试使用绝对路径

  • 使用而不是
    \\
    。这使您的代码在linux/windows操作系统之间更易于移植

    f=open(os.path.join(os.path.dirname(os.path.realpath(\uuuu文件)、“static”、“tmp”、filename)、“wb”)

  • 您没有引用/tmp,而是尝试在静态文件夹中写入:
    /var/www/my_url
    。请尝试使用绝对路径


  • 您没有写入tmp文件夹。``不是Linux上的目录分隔符您没有写入tmp文件夹。``不是Linux上的目录分隔符这已经修复了它。我完全忘记了斜杠。虽然文件没有打开,因为它不知怎么被破坏了。但它可能与Apache无关。谢谢您的时间!这是一个文件修正了。我完全忘记了斜杠。虽然文件没有打开,因为它被破坏了。但它可能与Apache无关。谢谢你的时间!尝试捕获异常是个好主意,谢谢你的建议。我不会修正“上传目录”因为我必须更改很多代码,现在就可以了。尝试捕获异常是个好主意,谢谢你的建议。我不会修复“UPLOAD_DIR”,因为我必须更改很多代码,现在就可以了。