Files
flask-s3/docs/index.rst
T
SunDwarf 1b554bd3ab Update code to use FLASKS3_ prefix for config variables instead of S3_. Closes #47.
This will automatically translate your old S3_ config variables to FLASKS3_ variables until 0.3.0.
2015-11-21 09:10:50 +00:00

259 lines
10 KiB
ReStructuredText

Flask-S3
********
.. module:: flask_s3
Flask-S3 allows you to easily serve all your `Flask`_ application's
static assets from `Amazon S3`_, without having to modify your
templates.
.. _Amazon S3: http://aws.amazon.com/s3
.. _Flask: http://flask.pocoo.org/
How it works
============
Flask-S3 has two main functions:
1. Walk through your application's static folders, gather all your
static assets together, and upload them to a bucket of your choice
on S3;
2. Replace the URLs that Flask's :func:`flask.url_for` function would
insert into your templates, with URLs that point to the static
assets in your S3 bucket.
The process of gathering and uploading your static assets to S3 need
only be done once, and your application does not need to be running for
it to work. The location of the S3 bucket can be inferred from Flask-S3
`settings`_ specified in your Flask application, therefore when your
application is running there need not be any communication between the
Flask application and Amazon S3.
Internally, every time ``url_for`` is called in one of your
application's templates, `flask_s3.url_for` is instead invoked. If the
endpoint provided is deemed to refer to static assets, then the S3 URL
for the asset specified in the `filename` argument is instead returned.
Otherwise, `flask_s3.url_for` passes the call on to `flask.url_for`.
Installation
============
If you use pip then installation is simply::
$ pip install flask-s3
or, if you want the latest github version::
$ pip install git+git://github.com/e-dard/flask-s3.git
You can also install Flask-S3 via Easy Install::
$ easy_install flask-s3
Dependencies
------------
Aside from the obvious dependency of Flask itself, Flask-S3 makes use of
the `boto`_ library for uploading assets to Amazon S3. **Note**:
Flask-S3 currently only supports applications that use the `jinja2`_
templating system.
.. _boto: http://docs.pythonboto.org/en/latest/
.. _jinja2: http://jinja.pocoo.org/docs/
Using Flask-S3
==============
Flask-S3 is incredibly simple to use. In order to start serving your
Flask application's assets from Amazon S3, the first thing to do is let
Flask-S3 know about your :class:`flask.Flask` application object.
.. code-block:: python
from flask import Flask
from flask_s3 import FlaskS3
app = Flask(__name__)
app.config['S3_BUCKET_NAME'] = 'mybucketname'
s3 = FlaskS3(app)
In many cases, however, one cannot expect a Flask instance to be ready
at import time, and a common pattern is to return a Flask instance from
within a function only after other configuration details have been taken
care of. In these cases, Flask-S3 provides a simple function,
``init_app``, which takes your application as an argument.
.. code-block:: python
from flask import Flask
from flask_s3 import FlaskS3
s3 = FlaskS3()
def start_app():
app = Flask(__name__)
s3.init_app(app)
return app
In terms of getting your application to use external Amazon S3 URLs when
referring to your application's static assets, passing your ``Flask``
object to the ``FlaskS3`` object is all that needs to be done. Once your
app is running, any templates that contained relative static asset
locations, will instead contain hosted counterparts on Amazon S3.
Uploading your Static Assets
----------------------------
You only need to upload your static assets to Amazon S3 once. Of course,
if you add or modify your existing assets then you will need to repeat
the uploading process.
Uploading your static assets from a Python console is as simple as
follows.
.. code-block:: python
>>> import flask_s3
>>> from my_application import app
>>> flask_s3.create_all(app)
>>>
Flask-S3 will proceed to walk through your application's static assets,
including those belonging to *registered* `blueprints`_, and upload them
to your Amazon S3 bucket.
.. _blueprints: http://flask.pocoo.org/docs/blueprints/
Static Asset URLs
~~~~~~~~~~~~~~~~~
Within your bucket on S3, Flask-S3 replicates the static file hierarchy
defined in your application object and any registered blueprints. URLs
generated by Flask-S3 will look like the following:
``/static/foo/style.css`` becomes
``https://mybucketname.s3.amazonaws.com/static/foo/style.css``, assuming
that ``mybucketname`` is the name of your S3 bucket, and you have chosen
to have assets served over HTTPS.
Setting Custom HTTP Headers
~~~~~~~~~~~~~~~~~
To set custom HTTP headers on the files served from S3 specify what
headers you want to use with the `S3_HEADERS` option.
.. code-block:: python
S3_HEADERS = {
'Expires': 'Thu, 15 Apr 2010 20:00:00 GMT',
'Cache-Control': 'max-age=86400',
}
See `Yahoo!`_ more information on how to set good values for your headers.
.. _Yahoo!: http://developer.yahoo.com/performance/rules.html#expires
.. _settings:
.. _configuration:
Flask-S3 Options
----------------
Within your Flask application's settings you can provide the following
settings to control the behaviour of Flask-S3. None of the settings are
required, but if not present, some will need to be provided when
uploading assets to S3.
=========================== ===================================================
`AWS_ACCESS_KEY_ID` Your AWS access key. This does not need to be
stored in your configuration if you choose to pass
it directly when uploading your assets.
`AWS_SECRET_ACCESS_KEY` Your AWS secret key. As with the access key, this
need not be stored in your configuration if passed
in to `create_all`.
`FLASKS3_BUCKET_DOMAIN` The domain part of the URI for your S3 bucket. You
probably won't need to change this.
**Default:** ``u's3.amazonaws.com'``
`FLASKS3_CDN_DOMAIN` AWS makes it easy to attach CloudFront to an S3
bucket. If you want to use this or another CDN,
set the base domain here. This is distinct from the
`S3_BUCKET_DOMAIN` since it will not include the
bucket name in the base url.
`FLASKS3_BUCKET_NAME` The desired name for your Amazon S3 bucket. Note:
the name will be visible in all your assets' URLs.
`FLASKS3_URL_STYLE` Set to `'host'` to use virtual-host-style URLs,
e.g. ``bucketname.s3.amazonaws.com``. Set to
`'path'` to use path-style URLs, e.g.
``s3.amazonaws.com/bucketname``.
**Default:** `'host'`
`FLASKS3_USE_HTTPS` Specifies whether or not to serve your assets
stored in S3 over HTTPS.
Can be overriden per url, by using the `_scheme`
argument as per usual Flask `url_for`.
**Default:** `True`
`FLASKS3_ACTIVE` This setting allows you to toggle whether Flask-S3
is active or not. When set to `False` your
application's templates will revert to including
static asset locations determined by
`flask.url_for`.
**Default:** `True`
**Note**: if you run your application in `debug`_
mode (and `USE_S3_DEBUG` is `False` - see next
item), `USE_S3` will be changed to `False`. This
allows the `USE_S3` config variable to be the
definitive check as to whether `flask_s3.url_for`
is overriding `flask.url_for`.
`FLASKS3_DEBUG` By default, Flask-S3 will be switched off when
running your application in `debug`_ mode, so that
your templates include static asset locations
specified by `flask.url_for`. If you wish to enable
Flask-S3 in debug mode, set this value to `True`.
**Note**: if `USE_S3` is set to `False` then
templates will always include asset locations
specified by `flask.url_for`.
`FLASKS3_HEADERS` Sets custom headers to be sent with each file to S3.
**Default:** `{}`
`FLASKS3_FILEPATH_HEADERS` Sets custom headers for files whose filepath matches
certain regular expressions. (Note that this cannot
be used for CORS, that must be set per S3 bucket
using an XML config string.) E.g. to add custom
metadata when serving text files, set this to:
`{r'\.txt$':`
` {'Texted-Up-By': 'Mister Foo'}`
`}`
**Default:** `{}`
`FLASKS3_ONLY_MODIFIED` Only upload files that have been modified since last
upload to S3. SHA-1 file hashes are used to compute
file changes. You can delete `.file-hashes` from
your S3 bucket to force all files to upload again.ad.
`FLASKS3_GZIP` Compress all assets using GZIP and set the
corresponding Content-Type and Content-Encoding
headers on the S3 files.
`FLASKS3_FORCE_MIMETYPE` Always set the Content-Type header on the S3 files
irrespective of gzipping. Defaults to `False`.
=========================== ===================================================
.. _debug: http://flask.pocoo.org/docs/config/#configuration-basics
API Documentation
=================
Flask-S3 is a very simple extension. The few exposed objects, methods
and functions are as follows.
The FlaskS3 Object
------------------
.. autoclass:: FlaskS3
.. automethod:: init_app
S3 Interaction
--------------
.. autofunction:: create_all
.. autofunction:: url_for