Source code for flask_fs.backends.local
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import io
import logging
import os
from shutil import copyfileobj
from flask import current_app, send_from_directory
from werkzeug import cached_property
from werkzeug.datastructures import FileStorage
from . import BaseBackend
log = logging.getLogger(__name__)
[docs]class LocalBackend(BaseBackend):
'''
A local file system storage
Expect the following settings:
- `root`: The file system root
'''
@cached_property
def root(self):
return self.config.get('root') or os.path.join(current_app.config.get('FS_ROOT'), self.name)
def exists(self, filename):
dest = self.path(filename)
return os.path.exists(dest)
def open(self, filename, mode='r', encoding='utf8'):
dest = self.path(filename)
if 'b' in mode:
return open(dest, mode)
else:
return io.open(dest, mode, encoding=encoding)
def read(self, filename):
with self.open(filename, 'rb') as f:
return f.read()
def write(self, filename, content):
dest = self.path(filename)
dirname = os.path.dirname(dest)
if not os.path.exists(dirname):
os.makedirs(dirname)
with self.open(filename, 'wb') as f:
return f.write(self.as_binary(content))
def delete(self, filename):
dest = os.path.join(self.root, filename)
return os.remove(dest)
def save(self, file_or_wfs, filename):
dest = self.path(filename)
folder = os.path.dirname(dest)
if not os.path.exists(folder):
os.makedirs(folder)
if isinstance(file_or_wfs, FileStorage):
file_or_wfs.save(dest)
else:
with open(dest, 'wb') as out:
copyfileobj(file_or_wfs, out)
return filename
[docs] def path(self, filename):
'''Return the full path for a given filename in the storage'''
return os.path.join(self.root, filename)
[docs] def serve(self, filename):
'''Serve files for storages with direct file access'''
return send_from_directory(self.root, filename)