Skip to main content

Flexible and efficient upload handling for Flask

Project description

CI Status https://coveralls.io/repos/github/jugmac00/flask-reuploaded/badge.svg?branch=master PyPI PyPI - Python Version Requirements Status https://img.shields.io/pypi/l/hibpcli

Flask-Reuploaded

Flask-Reuploaded provides file uploads for Flask.

Notes on this package

This is an independently maintained version of Flask-Uploads based on the 0.2.1 version of the original, but also including four years of unreleased changes, at least not released to PyPi.

Noteworthy is the fix for the Werkzeug API change.

Goals

  • provide a stable drop-in replacement for Flask-Uploads

  • regain momentum for this widely used package

  • provide working PyPI packages

Migration guide from Flask-Uploads

Incompatibilities between Flask-Reuploaded and Flask-Uploads

Currently, there are no known incompatibilities.

Just follow the Uninstall and install instructions below.

Please note, that Flask-Uploads, and thus also Flask-Reuploaded has an builtin autoserve feature.

This means that uploaded files are automatically served for viewing and downloading.

e.g. if you configure an UploadSet with the name photos, and upload a picture called snow.jpg, the picture can be automatically accessed at e.g. http://localhost:5000/_uploads/photos/snow.jpg unless

  • you set UPLOADED_PHOTOS_URL to an empty string

  • you configure UPLOADED_PHOTOS_URL with a valid string (then the picture is served from there)

  • or you set UPLOADS_AUTOSERVE to False.

The last option is new in Flask-Reuploaded.

In order to stay compatible with Flask-Uploads, by default UPLOADS_AUTOSERVE is currently set to True,

With Flask-Reuploaded version 1.0.0, UPLOADS_AUTOSERVE will default to False, as this feature is/was undocumented, surprising, and actually it could lead to unwanted data disclosure.

Setting it explicitly to False is recommended.

Uninstall and install

If you have used Flask-Uploads and want to migrate to Flask-Reuploaded, you only have to install Flask-Reuploaded instead of Flask-Uploads.

That’s all!

So, if you use pip to install your packages, instead of …

$ pip install `Flask-Uploads`  # don't do this! package is broken

… just do …

$ pip install `Flask-Reuploaded`

Flask-Reuploaded is a drop-in replacement.

This means you do not have to change a single line of code.

Installation

$ pip install Flask-Reuploaded

Getting started

create an UploadSet

from flask_uploads import IMAGES

photos = UploadSet("photos", IMAGES)

configure your Flask app and this extension

app.config["UPLOADED_PHOTOS_DEST"] = "static/img"
app.config["SECRET_KEY"] = os.urandom(24)
configure_uploads(app, photos)

use photos in your view function

photos.save(request.files['photo'])

See below for a complete example.

Documentation

The documentation can be found at…

https://flask-reuploaded.readthedocs.io/en/latest/

Minimal example application

Application code, e.g. main.py

import os

from flask import Flask, flash, render_template, request
# please note the import from `flask_uploads` - not `flask_reuploaded`!!
# this is done on purpose to stay compatible with `Flask-Uploads`
from flask_uploads import IMAGES, UploadSet, configure_uploads

app = Flask(__name__)
photos = UploadSet("photos", IMAGES)
app.config["UPLOADED_PHOTOS_DEST"] = "static/img"
app.config["SECRET_KEY"] = os.urandom(24)
configure_uploads(app, photos)


@app.route("/", methods=['GET', 'POST'])
def upload():
    if request.method == 'POST' and 'photo' in request.files:
        photos.save(request.files['photo'])
        flash("Photo saved successfully.")
        return render_template('upload.html')
    return render_template('upload.html')

HTML code for upload.html

<!doctype html>
<html lang=en>
<head>
    <meta charset=utf-8>
    <title>Flask-Reuploaded Example</title>
</head>
<body>
    {% with messages = get_flashed_messages() %}
    {% if messages %}
    <ul class=flashes>
    {% for message in messages %}
        <li>{{ message }}</li>
    {% endfor %}
    </ul>
    {% endif %}
    {% endwith %}

<form method=POST enctype=multipart/form-data action="{{ url_for('upload') }}">
    <input type=file name=photo>
    <button type="submit">Submit</button>
</form>
</body>
</html>

Project structure

The project structure would look as following…

 tree -I "__*|h*"
.
├── main.py
├── static
   └── img
└── templates
    └── upload.html

Running the example application

In order to run the application, you have to enter the following commands…

 export FLASK_APP=main.py

 flask run

Then point your browser to http://127.0.0.1:5000/.

Contributing

Contributions are more than welcome.

Please have a look at the open issues.

There is also a short contributing guide.

Changelog

0.5.0

  • improve documentation of example app

  • document surprising autoserve feature

  • issue a warning when using autoserve without explicit configuration

0.4.0

  • add type annotations

  • drop support for Python 2 and Python 3.5 (#8)

  • deprecate patch_request_class (#43)

  • use a src directory for source code (#21)

  • add tox env for check-python-versions (#20)

  • add flake8-bugbear

  • add short contribution guide (#6)

  • add getting started (#59)

  • delete broken example and add minimal example to README (#15)

  • add support for Python 3.9

  • use gh actions instead of Travis CI

0.3.2

  • documentation update (#5)

    • update docs/index.rst

    • use blue ReadTheDocs theme

    • update sphinx configuration

    • add documentation link to setup.py, so it shows on PyPi

    • add note about documentation in the README file

    • delete old theme files

  • configure isort to force single line imports

0.3.1

  • add badges to README (# 31)

  • add migration guide from Flask-Uploads to Flask-Reuploaded (#11)

  • add packaging guide (#28)

  • update installation instruction in README

0.3

Besides including four years of unreleased changes from the original package, most notable the fix for the Werkzeug API change, the following changes happened since forking the original package.

  • rename package from Flask-Uploads to Flask-Reuploaded (#10)

  • update setup.py (#12)

  • start using pre-commit.com (#4)

  • update README (#14)

  • setup CI (Travis) (#3)

  • fix broken tests (#13)

  • make use of pytest instead of the no longer maintained nose (#2)

  • add a changelog and start tracking changes (#1)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Flask-Reuploaded-0.5.0.tar.gz (28.5 kB view hashes)

Uploaded Source

Built Distribution

Flask_Reuploaded-0.5.0-py3-none-any.whl (15.4 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page