IOError:Errno 13特定文件的权限被拒绝

时间:2015-11-25 16:15:30

标签: python flask permissions werkzeug

我正在运行一个可以用来上传jpg文件的烧瓶API。 它已经运行了大约一年,但是今天,对于API的特定用户来说,上传的文件会被拒绝。 从一个用户到另一个用户的请求处理实际上没有任何区别,但是同一个文件被用户A拒绝并被用户B接受,用户A之前从未遇到过这个问题。这让我发疯了!

以下是烧瓶API中的代码:

import

一切正常,直到file.save,当用户A尝试上传文件时,我收到以下错误:

from werkzeug.utils import secure_filename

ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS


@app.route('/uploadFile/', methods=['POST'])
@auth.login_required
def newImage():
    if request.method == 'POST':
        if request.files:
            file = request.files['file']
            if allowed_file(file.filename):
                ImageId = request.args.get('ImageId')
                newImage = DB_Image()
                newImage.ObjectId = ImageId

                filename = secure_filename(file.filename)
                pictureName, fileExtension = os.path.splitext(filename)
                fullFileNameToBeSaved = str(newImage.ObjectId) + fileExtension
                imagesPath = os.path.join(app.static_folder, 'images')

                file.save(os.path.join(imagesPath, fullFileNameToBeSaved))
                (...)

我安装API时设置了权限,对于专门为运行API而创建的unix用户:

mod_wsgi (pid=14170): Exception occurred processing WSGI script '/var/www/myApi/wsgi/myapivenv.wsgi'.
Traceback (most recent call last):
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
     return self.wsgi_app(environ, start_response)
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
     response = self.make_response(self.handle_exception(e))
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
     reraise(exc_type, exc_value, tb)
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
     response = self.full_dispatch_request()
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
     rv = self.handle_user_exception(e)
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
     reraise(exc_type, exc_value, tb)
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
     rv = self.dispatch_request()
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
     return self.view_functions[rule.endpoint](**req.view_args)
   File "/usr/local/lib/python2.7/dist-packages/flask_httpauth.py", line 61, in decorated
     return f(*args, **kwargs)
   File "/var/www/myApi/code/ImageUpload.py", line 227, in newImage
     file.save(os.path.join(imagesPath, fullFileNameToBeSaved))
   File "/usr/local/lib/python2.7/dist-packages/werkzeug/datastructures.py", line 2576, in save
     dst = open(dst, 'wb')
 IOError: [Errno 13] Permission denied: '/var/www/path_to_upload_folder/files/images/2a6d85db-7ef0-40e3-8031-b7ed490bc512.jpg'

但API的用户是在数据库中管理的,它们与unix用户无关,所以我非常怀疑问题来自那里。

什么可能导致特定用户发送的某些特定文件出现这样的错误?

我正在使用Werkzeug 0.9.4和烧瓶0.10.1。

1 个答案:

答案 0 :(得分:1)

我做了一些挖掘,结果发现我试图覆盖以前由root用户添加的一些文件(myApi用户没有对它们的覆盖权限)。

检查服务器上是否存在有问题的文件是我做的第一件事,但我是通过使用Finder和Transmit(在Mac上)搜索文件来实现的,这显然不如使用“ls”那么高效“命令,在包含数百个文件的文件夹中。

使用“ls -l”我看到有问题的文件归root用户所有,而不是myApi用户(我实际上不得不在一段时间之前将这些文件从一台服务器移到这一台,这解释了为什么myApi用户不是所有者。)

现在我将尝试找到一个UNIX命令来更改root用户在该文件夹中添加的每个文件的权限,或者更改myApi用户的权限,以便它可以覆盖该文件夹中的任何文件...... < / p>

编辑:我使用

更改了权限
$sudo chown -R myApi:myApi files/images