Source code for flask_store.providers.local

# -*- coding: utf-8 -*-

"""
flask_store.providers.local
===========================

Local file storage for your Flask application.

Example
-------

.. sourcecode:: python

    from flask import Flask, request
    from flask.ext.store import Provider, Store
    from wtforms import Form
    from wtforms.fields import FileField

    class FooForm(Form):
        foo = FileField('foo')

    app = Flask(__app__)
    app.config['STORE_PATH'] = '/some/file/path'

    store = Store(app)

    @app,route('/upload')
    def upload():
        form = FooForm()
        form.validate_on_submit()

        if not form.errors:
            provider = store.Provider(request.files.get('foo'))
            provider.save()

"""

import errno
import os

from flask_store.providers import Provider


[docs]class LocalProvider(Provider): """ The default provider for Flask-Store. Handles saving files onto the local file system. """ #: Ensure a route is registered for serving files register_route = True @staticmethod
[docs] def app_defaults(app): """ Sets sensible application configuration settings for this provider. Arguments --------- app : flask.app.Flask Flask application at init """ # For Local file storage the default store path is the current # working directory app.config.setdefault('STORE_PATH', os.getcwdu()) # Default URL Prefix app.config.setdefault('STORE_URL_PREFIX', '/uploads')
[docs] def join(self, *parts): """ Joins paths together in a safe manor. Arguments --------- \*parts : list List of arbitrary paths to join together Returns ------- str Joined paths """ path = '' for i, part in enumerate(parts): if i > 0: part = part.lstrip(os.path.sep) path = os.path.join(path, part) return path.rstrip(os.path.sep)
[docs] def exists(self, filename): """ Returns boolean of the provided filename exists at the compiled absolute path. Arguments --------- name : str Filename to check its existence Returns ------- bool Whether the file exists on the file system """ path = self.join(self.store_path, filename) return os.path.exists(path)
[docs] def save(self): """ Save the file on the local file system. Simply builds the paths and calls :meth:`werkzeug.datastructures.FileStorage.save` on the file object. """ fp = self.fp filename = self.safe_filename(self.filename) path = self.join(self.store_path, filename) directory = os.path.dirname(path) if not os.path.exists(directory): # Taken from Django - Race condition between os.path.exists and # os.mkdirs try: os.makedirs(directory) except OSError as e: if e.errno != errno.EEXIST: raise if not os.path.isdir(directory): raise IOError('{0} is not a directory'.format(directory)) # Save the file fp.save(path) fp.close() # Update the filename - it may have changes self.filename = filename
[docs] def open(self): """ Opens the file and returns the file handler. Returns ------- file Open file handler """ path = self.join(self.store_path, self.filename) try: fp = open(path, 'rb') except IOError: raise IOError('File does not exist: {0}'.format(self.absolute_path)) return fp