Я использую фляжный API, который можно использовать для загрузки файлов jpg. Около года работает нормально, но сегодня ни с того ни с сего загружаемые файлы отклоняются для конкретного пользователя API. На самом деле нет никакой разницы в обработке запроса от одного пользователя к другому, но один и тот же файл отклоняется для пользователя А и принимается для пользователя Б, а у пользователя А никогда раньше не было этой проблемы. Это сводит меня с ума !
Вот код в flask API:
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))
(...)
Все работает нормально до файла.сохранения, где я получаю следующую ошибку, когда пользователь А пытается загрузить файл:
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, созданного специально для запуска API:
$ sudo usermod -a -G myApi $USER
$ sudo chown -R $USER:myApi var/www/path_to_upload_folder/ path_to_upload_folder/files/images
$ sudo chmod -R g+w var/www/path_to_upload_folder/ path_to_upload_folder/files/images
Но пользователи API управляются в базе данных, они не имеют ничего общего с пользователями unix, поэтому я очень сомневаюсь, что проблема оттуда.
Что может вызвать такую ошибку в некоторых конкретных файлах, отправленных конкретным пользователем?
Я использую Werkzeug 0.9.4 и флягу 0.10.1.