Welcome to part 5 of the the Flask 101 Series.
- Flask 101: Create a Basic Python Web App
- Flask 101: Add JSON to your Python Web App
- Flask 101: Use HTML templates & send variables
- Flask 101: Serve Images
- Flask 101: Serve CSV Files – This tutorial
For this tutorial, we will dynamically serve a different csv file – corresponding to the daily weather in Montreal in 2019 – where the month is provided by the user as a parameter in the request. For instance, if the user types the following request
Then our Flask app will serve the file 2019_02_weather.csv which looks like this
As usual, the full code for this project is available on my GitHub repo.
1 – Setup
If you want to use a Python 3 virtual environment, you can follow this post for example. But all you really need is to install Flask
# Install flask pip install flask
Create the following directory and files, leave them empty for now. We fill fill them later.
static/ myapp.py runapp.sh
For this example, you will need to download the monthly weather csv files that your app will serve, and save them inside the static/ directory. For simplicity you can just download the ones on my GitHub repo here.
Your full project tree should now look like this
. ├── myapp.py # to be completed later in this post ├── runapp.sh # to be completed later in this post as well └── static ├── 2019_01_weather.csv ├── 2019_02_weather.csv ├── 2019_03_weather.csv ├── 2019_04_weather.csv ├── 2019_05_weather.csv ├── 2019_06_weather.csv ├── 2019_07_weather.csv ├── 2019_08_weather.csv ├── 2019_09_weather.csv ├── 2019_10_weather.csv ├── 2019_11_weather.csv └── 2019_12_weather.csv
2 – Create your flask application
Open the file named myapp.py that you have created above, and add the content below.
from flask import Flask, request, send_file import io import os import csv app = Flask(__name__) @app.route('/get_csv') def get_csv(): """ Returns the monthly weather csv file (Montreal, year=2019) corresponding to the month passed as parameter. """ # Checking that the month parameter has been supplied if not "month" in request.args: return "ERROR: value for 'month' is missing" # Also make sure that the value provided is numeric try: month = int(request.args["month"]) except: return "ERROR: value for 'month' should be between 1 and 12" csv_dir = "./static" csv_file = "2019_%02d_weather.csv" % month csv_path = os.path.join(csv_dir, csv_file) # Also make sure the requested csv file does exist if not os.path.isfile(csv_path): return "ERROR: file %s was not found on the server" % csv_file # Send the file back to the client return send_file(csv_path, as_attachment=True, attachment_filename=csv_file) @app.route('/') def myapp(): message = "To use this app: %s/get_csv?month=value" % request.base_url return message
3 – Run your app
In the same directory as myapp.py, create a file named runapp.sh with the following contents.
export FLASK_APP=myapp export FLASK_ENV=development flask run
Close the file, then in the command line, run it with
# Execute this in the command line inside the same directory bash runapp.sh
You should see the following output
* Serving Flask app "myapp" (lazy loading) * Environment: development * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 319-407-766
5 – Test your app
That’s it! Now you can modify the code to fit your own purposes 🙂