Python Flask文件上载权限被拒绝

Python Flask文件上载权限被拒绝,python,python-3.x,flask,flask-uploads,Python,Python 3.x,Flask,Flask Uploads,我正在使用Flask在我的服务器8Ubuntu 18.04上托管一个web应用程序 我的应用程序的目标是上传一张图片(或者现在任何类型的文件)。但是,尝试将文件上载到img文件夹时,我获得权限错误: ERROR:cloud:Exception on / [POST], referer: http://192.168.1.35/ Traceback (most recent call last):, referer: http://192.168.1.35/ File "/us

我正在使用Flask在我的服务器8Ubuntu 18.04上托管一个web应用程序

我的应用程序的目标是上传一张图片(或者现在任何类型的文件)。但是,尝试将文件上载到img文件夹时,我获得权限错误:

 ERROR:cloud:Exception on / [POST], referer: http://192.168.1.35/
 Traceback (most recent call last):, referer: http://192.168.1.35/
   File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 2447, in wsgi_app, referer: http://192.168.1.35/
     response = self.full_dispatch_request(), referer: http://192.168.1.35/
   File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1952, in full_dispatch_request, referer: http://192.168.1.35/
     rv = self.handle_user_exception(e), referer: http://192.168.1.35/
   File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1821, in handle_user_exception, referer: http://192.168.1.35/
     reraise(exc_type, exc_value, tb), referer: http://192.168.1.35/
   File "/usr/local/lib/python3.6/dist-packages/flask/_compat.py", line 39, in reraise, referer: http://192.168.1.35/
     raise value, referer: http://192.168.1.35/
   File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1950, in full_dispatch_request, referer: http://192.168.1.35/
     rv = self.dispatch_request(), referer: http://192.168.1.35/
   File "/usr/local/lib/python3.6/dist-packages/flask/app.py", line 1936, in dispatch_request, referer: http://192.168.1.35/
     return self.view_functions[rule.endpoint](**req.view_args), referer: http://192.168.1.35/
   File "/var/www/cloud/cloud/__init__.py", line 15, in upload_image, referer: http://192.168.1.35/
     image.save(os.path.join(app.config["IMAGE_UPLOADS"], image.filename)), referer: http://192.168.1.35/
   File "/usr/local/lib/python3.6/dist-packages/werkzeug/datastructures.py", line 3066, in save, referer: http://192.168.1.35/
     dst = open(dst, "wb"), referer: http://192.168.1.35/
 PermissionError: [Errno 13] Permission denied: '/var/www/cloud/cloud/static/img/uploads/3E5A33B5-7E19-461A-B0C5-6835080675E7.jpeg', referer: http://192.168.1.35/
 , referer: http://192.168.1.35/
 AH00491: caught SIGTERM, shutting down
 AH00489: Apache/2.4.29 (Ubuntu) mod_wsgi/4.5.17 Python/3.6 configured -- resuming normal operations
 AH00094: Command line: '/usr/sbin/apache2'
所以我知道有一个权限错误。如何解决这个问题

我的文件结构如下:

我的
\uuuu init\uuuu.py
代码(python3)如下所示:

import os
from flask import Flask, flash, request, redirect, url_for, render_template

app = Flask(__name__)
app.config["IMAGE_UPLOADS"] = "/var/www/cloud/cloud/static/img/uploads"


@app.route("/", methods = ["GET", "POST"])
def upload_image():
    if request.method == "POST":
        if request.files:
            image = request.files["image"]
            print(image)
            image.save(os.path.join(app.config["IMAGE_UPLOADS"], image.filename))
            return "IMAGE SAVED"
    return render_template('upload-image.html')

if __name__ == "__main__":
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>HELLO</title>
</head>
<body>
<div>
   <h1>This is a test</h1>
   <form action="/" method="POST" enctype="multipart/form-data">
        <div>
            <input type="file" name = "image" id="image">
            <label for="image">Select Image</label>
        </div>
        <button type="submit">Upload</button>
    </form>
</div>
</body>
</html>
对于upload-image.html,i如下所示:

import os
from flask import Flask, flash, request, redirect, url_for, render_template

app = Flask(__name__)
app.config["IMAGE_UPLOADS"] = "/var/www/cloud/cloud/static/img/uploads"


@app.route("/", methods = ["GET", "POST"])
def upload_image():
    if request.method == "POST":
        if request.files:
            image = request.files["image"]
            print(image)
            image.save(os.path.join(app.config["IMAGE_UPLOADS"], image.filename))
            return "IMAGE SAVED"
    return render_template('upload-image.html')

if __name__ == "__main__":
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>HELLO</title>
</head>
<body>
<div>
   <h1>This is a test</h1>
   <form action="/" method="POST" enctype="multipart/form-data">
        <div>
            <input type="file" name = "image" id="image">
            <label for="image">Select Image</label>
        </div>
        <button type="submit">Upload</button>
    </form>
</div>
</body>
</html>

你好
这是一个测试
选择图像
上传
当它在本地工作时,我不会得到这个错误,但只有当我部署t时,它才能在与我相同的LAN中的计算机上访问


这是我正在遵循的教程:

授予777权限,以便在服务器中上载文件。

这是错误:

PermissionError: [Errno 13] Permission denied: '/var/www/cloud/cloud/static/img/uploads/3E5A33B5-7E19-461A-B0C5-6835080675E7.jpeg', referer: http://192.168.1.35/
这是源于操作系统的错误,表示您没有在该目录中创建文件的权限

现在,当我说“你”没有权限时,我指的是运行进程的用户。所使用的用户取决于服务器的配置

您可以运行
chown
来更改目录的所有者,以便将访问目录的用户拥有该目录,或者您可以选择一个更简单的选项,即允许每个人都写入该目录,如果您不介意安全风险:

chmod 777 /var/www/cloud/cloud/static/img/uploads

您必须调整此文件夹的权限

这可以通过组合使用
chmod
设置权限和
chown
更改文件夹的所有者/组来完成

如果您自己无法解决此问题,请向我们显示当前权限/所有权


你还需要知道哪个用户正在运行你的Flask应用程序。

那么是要上传var文件还是只上传文件?上传文件不是var文件。千万不要建议任何人将权限设置为777,尤其是初学者。为什么?或者你还有其他选择吗?。我给出这个建议是因为他只需要上传文件,而不需要其他员工。另一种方法是设置正确的权限。为了能够提供详细的建议,我们需要了解有关安装的更多信息。切勿将权限更改为777。请不要建议初学者这样做。@J.G.我确实写过“如果你不介意安全风险”,并且我对
chown
提供了一个不同的选择。你会建议那些无法判断情况的人驾驶没有刹车的汽车吗?我很抱歉。坏建议永远是坏建议。危及服务器不是可接受的解决方法。我知道。你只想帮忙。遗憾的是,没有在您自己的服务器上承载web应用程序的快捷方式。@J.G.如果您认为现有的参数不够好,请不要启动参数,并提供更好的答案。对每个提供的解决方案说“那不好”,而不提供更好的解决方案,对任何人都没有帮助。没有什么可补充的。如果没有所有可用信息(进程的用户/组、目录的用户/组、目录的权限),就不可能给出具体的答案。我们必须等到@lolaa回答我的请求。请不要把这件事当作是私人的——这本来就不应该是私人的。自90年代以来,设置web服务器和创建web应用程序就是我的工作。这当然不意味着我什么都知道,但考虑到理论上我可能是对的。祝你一切顺利!如果这个应用程序将来可以在线使用,你建议我对权限做什么?正如我在上面写的。我们需要更多地了解您的设置。