Metadata-Version: 2.1
Name: Flask-CSV
Version: 1.2.1
Summary: Easily render CSVs within any flask application
Home-page: https://github.com/Shir0kamii/Flask-CSV
Download-URL: https://github.com/Shir0kamii/Flask-CSV/tags
Author-email: shir0kamii@gmail.com
Platform: any
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
License-File: LICENSE
Requires-Dist: csvalidate
Requires-Dist: Flask
Requires-Dist: marshmallow

#########
Flask-CSV
#########

Easily render CSVs within any flask application

Install
#######

Flask-CSV is packaged and you can use pip to install it::

    pip install flask_csv


How to use ?
############

Flask-CSV has a simple hepler method named `send_csv` which allows you to send
csv files in flask endpoints. It takes an iterable of `dict`, a filename and a
list of fields. The keys of all `dict` in the iterable must correspond to
given fields.

It will return a `Response` object with filename set and body containing the
CSV data.

You will better understand with a short example.

.. code-block:: python

    @app.route("/")
    def index():
        return send_csv([{"id": 42, "foo": "bar"}, {"id": 91, "foo": "baz"}],
                        "test.csv", ["id", "foo"])

Hitting this endpoint will return::

    id,foo
    42,bar
    91,baz


Passing additionnal parameters
##############################

The remaining arguments of `send_csv` will be passed to `send_file`. For
example, to disable caching, do the following:

.. code-block:: python

    send_csv([{"id": 42, "foo": "bar"}, {"id": 91, "foo": "baz"}],
             "test.csv", ["id", "foo"], cache_timeout=0)

You can also pass additionnal parameters to the CSV writer like this:

.. code-block:: python

    send_csv([{"foo": 42}, {"bar": "baz"}], "test.csv", ["foo"],
             writer_kwargs={"extrasaction": "ignore"})

In this example, the "bar" key will not raise a `ValueError` since the writer
will be given the parameter `extrasaction` with the value "ignore".


Change delimiter
################

You can also change the delimiter with the `delimiter` option.

.. code-block:: python

    send_csv([{"id": 42, "foo": "bar"}, {"id": 91, "foo": "baz"}],
             "test.csv", ["id", "foo"], delimiter=';')

Will result in::

    id;foo
    42;bar
    91;baz

Specifying file encoding
########################

You can also specify the encoding used to send the file, with the `encoding` option (`utf-8` by default).

.. code-block:: python

    send_csv([{"id": 42, "foo": "bar"}, {"id": 91, "foo": "baz"}],
             "test.csv", ["id", "foo"], encoding='iso-8859-1')

Use Marshmallow Schemas
#######################

You can use `Schema` from marshmallow by passing it as `schema` to `send_csv`.
If you want to keep only ids and ensure they are integers, you could do:

.. code-block:: python

    class IdSchema(Schema):
        id = fields.Integer()

    send_csv([{"id": 42, "foo": "bar"}, {"id": 91, "foo": "baz"}],
             "test.csv", ["id", "foo"], schema=IdSchema())

And that would result in this::

    id
    42
    91

SystemError returned a result with an error set
###############################################

When using uwsgi for your flask app, it might raise this kind of error on the send_file method.
If that were the case, adding the following option to your uwsgi conf should solve it :

`wsgi-disable-file-wrapper = true`
